JavaRush /Blogue Java /Random-PT /Como enviar um email de um aplicativo Java (com exemplo)
PodoBulge
Nível 31
Минск

Como enviar um email de um aplicativo Java (com exemplo)

Publicado no grupo Random-PT
Enviar um email de um aplicativo Java é um requisito comum. Não importa se você está trabalhando em um aplicativo Java principal, um aplicativo Web ou um aplicativo Java corporativo, talvez seja necessário enviar um e-mail para alertar a equipe de suporte sobre erros ou simplesmente enviar um e-mail aos usuários após o registro, redefina a senha ou peça que confirmem o endereço de e-mail após o registro. Existem muitos cenários em que você precisa enviar e-mails de um aplicativo Java. Como enviar um email de uma aplicação Java (com exemplo) - 1Nos aplicativos prontos você já possui um módulo ou biblioteca que funciona com todos os recursos para envio de e-mails, como a possibilidade de enviar anexos, imagens, incluindo assinaturas e rich text em e-mails, MAS se precisar escrever algo do zero, então a API Java Mail é uma ótima opção. Neste artigo, aprenderemos como enviar e-mails de um aplicativo Java usando a API mail ( javax.mail ). Antes de escrever o código, você deve saber alguns princípios básicos de como o e-mail funciona, por exemplo, você precisa de um servidor SMTP (Simple Mail Transfer Protocol) . Se você estiver executando seu aplicativo Java no Linux, você deve saber que o daemon SMTP usa a porta 25. Você pode usar qualquer servidor de e-mail para enviar mensagens usando Java, incluindo servidores de e-mail públicos como GMail, Yahoo ou qualquer outro provedor de serviços, todos o que você precisa são os detalhes do servidor SMTP , como nome do host, porta, parâmetros de conexão, etc. Você também pode usar SSL ( Secure Sockets Layer ), TLS ( Transport Layer Security ) para conectar e enviar e-mails com segurança, mas simplificamos este exemplo e focamos na lógica mínima para enviar cartas de um aplicativo Java. Em artigos futuros aprenderemos como enviar um email usando anexos, como enviar um email formatado em HTML, como anexar imagens a um email, como usar a autenticação SSL para se conectar ao servidor GMail e enviar emails, etc. Agora, vamos entender (discutir) este exemplo simples da API Java Mail .

Exemplo de código Java para enviar um email

Para enviar uma carta de um programa Java, você precisará da API Java Mail e do Java Activation Framework (JAF) ; para ser mais preciso, você precisará de mail-1.4.5.jar , smtp-1.4.4.jar e ativação-1.1.jar . Você precisa baixar esses arquivos JAR e incluí-los em seu Classpath para executar este programa. Alternativamente, você pode usar o Maven para gerenciamento de dependências e incluir todas as dependências lá. Depois de ter todos esses arquivos JAR, basta seguir as etapas abaixo para criar e enviar um email usando Java.
  1. Crie um objeto Sessionchamando Session.getDefaultInstance(properties), onde properties- contém todas as propriedades importantes, por exemplo, o nome do host do servidor SMTP.

  2. Crie um objeto MimeMessagepassando para ele o objeto Sessionobtido na etapa anterior. Temos um conjunto de propriedades diferentes neste objeto, como destinatário do email, assunto, corpo da mensagem, anexos, etc.

  3. Use-o javax.mail.Transportpara enviar um email chamando um método estático send(email), onde email pode ser um objeto MimeMessage.

O número de propriedades que você passa para criar um objeto Sessiondifere dependendo do tipo de servidor SMTP, por exemplo, se você estiver usando um servidor SMTP que não requer nenhuma autenticação, você pode criar um objeto Sessioncom apenas uma propriedade, por exemplo smtp. mail.host, e você não precisa especificar a porta porque ela possui a porta 25 por padrão. Por outro lado, se você estiver se conectando a um servidor SMTP que requer autenticação TLS ou SSL, como o Host SMTP do GMail, será necessário fornecer um pouco mais de propriedades, por exemplo mail.smtp.port=547 para TLS e correio. smtp.port=457 para SSL. Este é um programa Java completo que se conecta a um servidor SMTP padrão sem autenticação e envia uma mensagem de texto usando a API Java Mail.
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
* Java Program to send text mail using default SMTP server and without authentication.
* You need mail.jar, smtp.jar and activation.jar to run this program.
*
* @author Javin Paul
*/

public class EmailSender{
     public static void main(String args[]){

           String to = "receive@abc.om";         // sender email
           String from = "sender@abc.com";       // receiver email
           String host = "127.0.0.1";            // mail server host

           Properties properties = System.getProperties();
           properties.setProperty("mail.smtp.host", host);

           Session session = Session.getDefaultInstance(properties); // default session

           try {
                MimeMessage message = new MimeMessage(session); // email message

                message.setFrom(new InternetAddress(from)); // setting header fields

                message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

                message.setSubject("Test Mail from Java Program"); // subject line

                // actual mail body
                message.setText("You can send mail from Java program by using mail API, but you need" +
                                "couple of more JAR files e.g. smtp.jar and activation.jar");

                // Send message
                Transport.send(message); System.out.println("Email Sent successfully....");
               } catch (MessagingException mex){ mex.printStackTrace(); }

     }

}
Saída: você pode compilar e executar este programa para enviar um email simples de um programa Java:
$ javac EmailSender.java
$ java EmailSender
E-mail enviado com sucesso.... Como você pode ver, é muito fácil enviar e-mails a partir de um programa Java. Depois de criar o objeto MimeMessage, você precisa adicionar destinatários, que podem ser especificados em TO, CC, BCC. Terminados os destinatários, precisamos especificar o assunto da carta e, por fim, o conteúdo da própria carta chamando o método message.setText(); Se você quiser fazer várias correspondências, os seguintes métodos podem ser usados ​​para especificar destinatários:
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
Você pode adicionar pessoas ao campo TOusando Message.RecipientType.TO, ao campo CCusando Message.RecipientType.CCe a BCC- Message.RecipientType.BCC.

Erros e exceções

Quando muitos programadores Java começam a escrever um programa para enviar um email, eles se deparam com um erro porque a maioria deles pensa que mail.jar e activate.jar serão suficientes para enviar um email de uma aplicação Java, o que não é o caso, especialmente se você enviar e-mail através de um servidor SMTP local no Linux. Se você executar este programa apenas com mail.jar e activate.jar em seu CLASSPATH, provavelmente receberá este erro.

Exceção 1:

com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 25; timeout -1;
        nested exception is:
            java.net.ConnectException: Connection refused: connect
            at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1984)
            at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:656)
            at javax.mail.Service.connect(Service.java:345)
            at javax.mail.Service.connect(Service.java:226)
            at javax.mail.Service.connect(Service.java:175)
            at javax.mail.Transport.send0(Transport.java:253)
            at javax.mail.Transport.send(Transport.java:124)
            at Testing.main(Testing.java:62)
        Caused by: java.net.ConnectException: Connection refused: connect
            at java.net.DualStackPlainSocketImpl.connect0(Native Method)
            at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
            at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
            at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
            at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
            at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
            at java.net.Socket.connect(Socket.java:579) at java.net.Socket.connect(Socket.java:528)
            at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:301)
            at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:229)
            at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1950)
       ... 7 more
Embora a solução para esse erro seja muito simples, ela pode confundir você. java.net.ConnectException: Connection refused: connectGeralmente trava quando o servidor não está funcionando ou a porta à qual você está se conectando está especificada incorretamente. Solução: além do mail-1.4.5.jar, você também precisa do smtp-1.4.4.jar e da ativação-1.1.jar.

Exceção 2:

Este é outro erro chamado NoClassDefFoundError, que geralmente se refere a um arquivo JAR ausente no Classpath
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/MessagingException
           at java.lang.Class.getDeclaredMethods0(Native Method)
           at java.lang.Class.privateGetDeclaredMethods(Class.java:2521)
           at java.lang.Class.getMethod0(Class.java:2764)
           at java.lang.Class.getMethod(Class.java:1653)
           at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
           at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: javax.mail.MessagingException
           at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
           at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
           at java.security.AccessController.doPrivileged(Native Method)
           at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
           at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
Solução: Consegui resolver meu problema, era devido a um Classpath incorreto. Embora eu tivesse todos os três JARs necessários, um arquivo de classe Java para o programa no mesmo diretório, e executasse o programa a partir daí, o Java não conseguia descobrir. Tentei os seguintes comandos e o programa funcionou bem:
java -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
E-mail enviado com sucesso.... Observe que o diretório atual está marcado com um ponto no final do argumento Classpath. Como estava executando o programa no Linux, usei dois pontos (:) em vez de ponto e vírgula (;) (como no Windows). Isso é tudo sobre como enviar um e-mail de um aplicativo Java usando a API de e-mail. Você pode achar isso muito simples, já que não precisa de nada além de três arquivos JAR. É muito mais fácil se você usar Gradle ou Maven para gerenciar dependências. Nos tutoriais a seguir veremos exemplos mais complexos da API Java Mail para envio de e-mails com anexos, com imagens e e-mails lindamente formatados para envio de relatórios e tabelas. Tradução do artigo: Como enviar e-mail de um programa Java com exemplo
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION