Como enviar e-mails com a API Mail

A API de serviço de e-mail para Java aceita a interface JavaMail javax.mail (link em inglês) para enviar mensagens de e-mail.

Antes de começar

Registre os e-mails dos remetentes como remetentes autorizados. Para mais informações, veja quem pode enviar e-mails.

Como enviar mensagens de e-mail

Para enviar mensagens de e-mail, use as classes JavaMail incluídas no SDK do App Engine.

Ao criar uma sessão JavaMail, se você não fornecer uma configuração de servidor SMTP, o App Engine usará o serviço de e-mail para enviar mensagens. Se preferir, adicione a configuração SMTP para provedores de e-mail terceirizados compatíveis, como Mailgun, Mailjet ou SendGrid.

Para enviar uma mensagem, siga estas etapas:

  1. Crie uma mensagem usando um objeto Session JavaMail.

  2. Crie um objeto MimeMessage.

  3. Para configurar o remetente e o destinatário da mensagem, use a classe InternetAddress.

    1. Identifique o remetente chamando o método setFrom() no objeto MimeMessage. Também é possível fornecer um nome pessoal como uma string no segundo parâmetro.

    2. Identifique o destinatário enviando um tipo de destinatário e um endereço para o método addRecipient(). O tipo de destinatário pode ser Message.RecipientType.TO, Message.RecipientType.CC ou Message.RecipientType.BCC.

    O construtor InternetAddress lançará uma AddressException se o endereço de e-mail parecer inválido.

  4. Para definir um endereço de "resposta", use o método setReplyTo().

  5. Estabeleça o conteúdo da mensagem chamando métodos no objeto MimeMessage. Defina o assunto com setSubject() e o conteúdo do corpo de texto simples com setText().

  6. Para enviar a mensagem, use o método estático send() na classe Transport.

A API de serviço de e-mail permite especificar um conjunto limitado de cabeçalhos em mensagens de e-mail de saída. Para mais informações, consulte Cabeçalhos opcionais que podem ser usados.

O código de amostra a seguir demonstra como enviar e-mails:

Java 8

Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);

try {
  Message msg = new MimeMessage(session);
  msg.setFrom(new InternetAddress("admin@example.com", "Example.com Admin"));
  msg.addRecipient(Message.RecipientType.TO,
                   new InternetAddress("user@example.com", "Mr. User"));
  msg.setSubject("Your Example.com account has been activated");
  msg.setText("This is a test");
  Transport.send(msg);
} catch (AddressException e) {
  // ...
} catch (MessagingException e) {
  // ...
} catch (UnsupportedEncodingException e) {
  // ...
}

Java 7

Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);

try {
  Message msg = new MimeMessage(session);
  msg.setFrom(new InternetAddress("admin@example.com", "Example.com Admin"));
  msg.addRecipient(Message.RecipientType.TO,
                   new InternetAddress("user@example.com", "Mr. User"));
  msg.setSubject("Your Example.com account has been activated");
  msg.setText("This is a test");
  Transport.send(msg);
} catch (AddressException e) {
  // ...
} catch (MessagingException e) {
  // ...
} catch (UnsupportedEncodingException e) {
  // ...
}

As chamadas para o serviço de e-mail são assíncronas e retornam imediatamente. O serviço de e-mail gerencia o processo de contato dos servidores de e-mail dos destinatários e de entrega da mensagem. Se houver um problema ao enviar a mensagem para qualquer destinatário ou se o servidor de e-mail de um destinatário retornar uma mensagem de erro na entrega, a mensagem de erro será enviada para o remetente.

Como enviar mensagens de várias partes

É possível enviar mensagens de várias partes, como uma mensagem com anexos ou com um corpo de texto simples e um corpo HTML.

Para enviar uma mensagem de várias partes, faça o seguinte:

  1. Crie um objeto MimeMultipart para incluir as partes. Depois, crie um objeto MimeBodyPart para cada anexo ou corpo alternativo da mensagem e o adicione ao contêiner.'

  2. Atribua o contêiner ao conteúdo de MimeMessage.

O código de amostra a seguir demonstra como enviar uma mensagem de várias partes:

Java 8

String htmlBody = "";          // ...
byte[] attachmentData = null;  // ...
Multipart mp = new MimeMultipart();

MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(htmlBody, "text/html");
mp.addBodyPart(htmlPart);

MimeBodyPart attachment = new MimeBodyPart();
InputStream attachmentDataStream = new ByteArrayInputStream(attachmentData);
attachment.setFileName("manual.pdf");
attachment.setContent(attachmentDataStream, "application/pdf");
mp.addBodyPart(attachment);

msg.setContent(mp);

Java 7

String htmlBody = "";          // ...
byte[] attachmentData = null;  // ...
Multipart mp = new MimeMultipart();

MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(htmlBody, "text/html");
mp.addBodyPart(htmlPart);

MimeBodyPart attachment = new MimeBodyPart();
InputStream attachmentDataStream = new ByteArrayInputStream(attachmentData);
attachment.setFileName("manual.pdf");
attachment.setContent(attachmentDataStream, "application/pdf");
mp.addBodyPart(attachment);

msg.setContent(mp);

Por motivos de segurança, as partes e os anexos da mensagem precisam ser de um dos diversos tipos permitidos, e os nomes de arquivo do anexo precisam terminar com uma extensão de nome de arquivo reconhecida para o tipo. Para uma lista de tipos e extensões de nome de arquivo permitidos, consulte E-mail com anexos.