Enviar correos con la API Mail

La API del servicio de correo para Java admite la interfaz JavaMail (javax.mail) para enviar mensajes de correo.

Antes de empezar

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

Enviar mensajes de correo

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

Cuando creas una sesión de JavaMail, si no proporcionas ninguna configuración de servidor SMTP, App Engine utiliza el servicio de correo para enviar mensajes. También puedes añadir la configuración SMTP de proveedores de correo de terceros compatibles, como Mailgun, Mailjet o SendGrid.

Sigue estos pasos para enviar un mensaje:

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

  2. Crea un objeto MimeMessage.

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

    1. Identifica al remitente llamando al método setFrom() en el objeto MimeMessage. Si quieres, puedes proporcionar un nombre personal como cadena en el segundo parámetro.

    2. Identifica al destinatario enviando 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 un AddressException si la dirección de correo parece no ser válida.

  4. Para definir una dirección de respuesta, usa el método setReplyTo().

  5. Define el contenido del mensaje llamando a los métodos del objeto MimeMessage. Define el asunto con setSubject() y el contenido del cuerpo de texto sin formato con setText().

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

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

En el siguiente código de ejemplo se muestra cómo enviar 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 devuelven inmediatamente. El servicio de correo gestiona el proceso de ponerse en contacto con los servidores de correo de los destinatarios y de entregar el mensaje. Si hay algún problema al enviar el mensaje a algún destinatario o si el servidor de correo de un destinatario devuelve un mensaje de rebote, el mensaje de error se envía al remitente.

Enviar mensajes de varias partes

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

Para enviar un mensaje de varias partes, sigue estos pasos:

  1. Crea un objeto MimeMultipart para que contenga las partes y, a continuación, crea un objeto MimeBodyPart para cada archivo adjunto o cuerpo de mensaje alternativo y añádelo al contenedor.'

  2. Asigna el contenedor al contenido de MimeMessage.

En el siguiente ejemplo de código se muestra 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 motivos de seguridad, las partes de los mensajes y los archivos adjuntos deben ser de uno de los varios tipos permitidos, y los nombres de los archivos adjuntos deben terminar en una extensión de nombre de archivo reconocida para el tipo. Para ver una lista de los tipos y las extensiones de nombre de archivo permitidos, consulta Correo con archivos adjuntos.