Enviar correos con la API de correo

La API de servicio de correo electrónico para Java es compatible con la interfaz JavaMail (javax.mail) a fin de enviar mensajes de correo electrónico.

Antes de comenzar

Registra los correos electrónicos de tus remitentes como remitentes autorizados. Para obtener más información, consulta quién puede enviar correos electrónicos.

Envía correos electrónicos

Para poder enviar mensajes de correo electrónico, usa las clases de JavaMail incluidas en el SDK de App Engine.

Si no provees una configuración del servidor SMTP cuando creas una sesión de JavaMail, App Engine usa el servicio de correo para enviar mensajes. Como alternativa, puedes agregar la configuración SMTP para los proveedores de correo electrónico de terceros compatibles, como Mailgun, Mailjet o SendGrid.

Para enviar un mensaje, sigue estos pasos:

  1. Crea un mensaje mediante un objeto Session de JavaMail.

  2. Crea un objeto MimeMessage.

  3. Para configurar el remitente y el destinatario del mensaje, usa la clase InternetAddress.

    1. Identifica al remitente con una llamada al método setFrom() en el objeto MimeMessage. De forma opcional, puedes proveer un nombre personal como una string en el segundo parámetro.

    2. Puedes identificar al destinatario si pasas un tipo de destinatario y una dirección al método addRecipient(). El tipo de destinatario puede ser Message.RecipientType.TO, Message.RecipientType.CC o Message.RecipientType.BCC.

    El constructor InternetAddress genera una AddressException si parece que la dirección de correo electrónico no es válida.

  4. Si quieres configurar una dirección de respuesta, usa el método setReplyTo().

  5. Establece el contenido del mensaje mediante una llamada a los métodos en el objeto MimeMessage. Establece el asunto mediante setSubject() y el contenido del cuerpo con texto simple mediante setText().

  6. Para enviar el mensaje, usa el método estático send() en la clase Transport.

El servicio de correo te permite especificar un conjunto limitado de encabezados en mensajes de correos electrónicos salientes. Para obtener más información, consulta Encabezados opcionales que puedes usar.

En el siguiente código de muestra, se indica cómo enviar un correo:

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) {
  // ...
}

Las llamadas al servicio de correo son asíncronas y se muestran de forma inmediata. El servicio de correo administra el proceso de contactar a los servidores de correos del destinatario y de entregar el mensaje. Si surge algún problema al momento de enviar el mensaje a cualquier destinatario, o si el servidor de correo del destinatario muestra un mensaje "rebote", el remitente recibe el mensaje de error.

Envía mensajes de varias partes

Puedes enviar mensajes de varias partes, como un mensaje con archivos adjuntos o un mensaje con el cuerpo del mensaje con texto sin formato y un cuerpo del mensaje HTML.

Sigue estos pasos para enviar un mensaje de varias partes:

  1. Crea un objeto MimeMultipart que contenga las partes, luego crea un objeto MimeBodyPart para cada adjunto o cuerpo del mensaje alternativo y agrégalo al contenedor.

  2. Asigna el contenedor al contenido para MimeMessage.

En el código de muestra a continuación, se indica cómo enviar un mensaje de varias partes:

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 razones de seguridad, las partes de los mensajes y sus adjuntos deben ser uno de los varios tipos permitidos y los nombres de los archivos adjuntos deben finalizar en una extensión de nombre de archivo reconocida para ese tipo. Si quieres obtener una lista de los tipos y extensiones de nombres de archivos permitidos, consulta Correo electrónico con archivos adjuntos.