Java: Enviar emails com autenticação (SMTP)

Palavras-chave: Java, JavaMail, email, SMTP, SMTP autenticado

Enviar emails é uma tarefa corriqueira, mas sempre precisamos olhar um exemplo da JavaMail API para montar uma classe utilitária. A seguir, um exemplo mínimo do envio de emails através de um servidor SMTP autenticado:

public void enviarEmail(String emailDest, String nomeDest,
  String emailRemet, String nomeRemet, String assunto, String corpo)
  throws Exception {
  Properties props = System.getProperties();
  props.put("mail.smtp.host", "smtp.firma.com.br");
  props.put("mail.smtp.auth", "true");
  Authenticator auth = new Authenticator() {
    public PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication("fulano", "suasenha");
    }};

  Session session = Session.getInstance(props, auth);
  MimeMessage message = new MimeMessage(session);
  message.setFrom(new InternetAddress(emailRemet, nomeRemet));
  message.addRecipient(Message.RecipientType.TO,
    new InternetAddress(emailDest, nomeDest));
  message.setSubject(assunto);
  message.setContent(corpo, "text/plain");

  Transport.send(message);
}

Para executar este código, é preciso colocar o JavaMail (mail.jar) e o Java Activation Framework (activation.jar) em seu classpath. Se você usa Java 6, não vai precisar do JAF no classpath, pois este foi embutido nesta versão do Java.

Para testar o código, pode-se fazer algo como:

enviarEmail("todos@firma.com.br", "Lista da Firma", "fulano@firma.com.br",
  "Fulano da Silva", "Codare", "Gosto do Codare. E vocês?");

Se você usa emails dentro de Servidores de Aplicação, pode fazer lookup da sessão no JNDI, ao invés de criá-la passando as propriedades. Você a receberá com as propriedades setadas pelo administrador do ambiente e, como desenvolvedor, não precisará se preocupar com coisas como “qual é o servidor de email do ambiente de produção”:

Session session =
  (Session) new InitialContext().lookup("java:comp/env/mail/Sessao");
This entry was posted in Java. Bookmark the permalink.

9 Responses to Java: Enviar emails com autenticação (SMTP)

  1. John Soares says:

    Pessoal,

    Efetuei o teste com o código proposto, efetuando as devidas alterações de usuário e senha(é claro). Obtive a resposta do Eclipse que deu problema de autenticação.

    Com o wireshark, verifiquei que o outlook informa para o servidor SMPT qual o tipo da criptografia da senha, no meu caso é PLAIN CRAM-MD5. Esta informação não ocorre quando utilizo o código java. Isto me leva a crer que preciso especificar no código qual o tipo de criptografia a utilizar.

    Como faço para estipular o tipo de criptografia?

    Abraços!

  2. John Soares says:

    Pessoal,

    Já verifiquei o erro. Ao habilitar o debug pude verificar que não tinha nada a ver com o tipo de criptografia dos dados.
    Foi erro de digitação mesmo do endereço de email.

    Abraço.

  3. jr says:

    olá,

    preciso de um servidor smtp autenticado, como faço para adquirir?

    obrigado

  4. Dayvson Reis says:

    Cara muito bom, funcionou de primeira. Valeu.

  5. Jayro says:

    Muito bom… de primeira !

    :)

  6. Osni says:

    Poxa

    passei um tempão tentando manda esse bendito e-mail
    agora foi de boas!!!

    eu acho q tava faltando o Java Activation Framework
    ou sei lá….
    o importante é que agora tá funcionando!

    valeu mesmo!

  7. Fernando Cavallari says:

    Obrigado, funcionou perfeito.

    Grato por este script de otima qualidade

  8. Tiago says:

    Boa tarde tem como aplicar isto em uma aplicação desktop ?

Leave a Reply

Your email address will not be published. Required fields are marked *