Envoyer des messages avec l'API Mail

L'API du service Mail pour Java est compatible avec l'interface JavaMail (javax.mail) pour l'envoi d'e-mails.

Avant de commencer

Enregistrez vos adresses e-mail d'expéditeur en tant qu'expéditeurs autorisés. Pour obtenir plus d'informations, consultez la section Utilisateurs autorisés à envoyer des e-mails.

Envoyer des e-mails

Pour envoyer des e-mails, servez-vous des classes JavaMail fournies avec le SDK App Engine.

Lorsque vous créez une session JavaMail, App Engine utilise le service Mail pour envoyer les messages si vous n'indiquez aucune configuration de serveur SMTP. Vous pouvez également ajouter une configuration SMTP pour les fournisseurs de messagerie tiers compatibles, tels que Mailgun, Mailjet ou SendGrid.

Pour envoyer un message, procédez comme suit :

  1. Créez un message à l'aide d'un objet Session JavaMail.

  2. Créez un objet MimeMessage.

  3. Pour définir l'expéditeur et le destinataire du message, utilisez la classe InternetAddress.

    1. Identifiez l'expéditeur en appelant la méthode setFrom() sur l'objet MimeMessage. Vous pouvez éventuellement fournir un nom personnel sous forme de chaîne dans le deuxième paramètre.

    2. Identifiez le destinataire en transmettant un type de destinataire et une adresse à la méthode addRecipient(). Le type de destinataire peut être Message.RecipientType.TO, Message.RecipientType.CC ou Message.RecipientType.BCC.

    Le constructeur InternetAddress génère une exception AddressException si l'adresse e-mail s'avère être incorrecte.

  4. Pour définir une adresse de réponse, utilisez la méthode setReplyTo().

  5. Établissez le contenu du message en appelant des méthodes sur l'objet MimeMessage. Définissez l'objet avec setSubject(), puis le contenu du corps en texte brut avec setText().

  6. Pour envoyer le message, utilisez la méthode statique send() sur la classe Transport.

Le service Mail vous permet de spécifier un ensemble limité d'en-têtes pour les e-mails sortants. Pour obtenir plus d'informations, consultez la section En-têtes facultatifs que vous pouvez utiliser.

L'exemple de code suivant montre comment envoyer un message :

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

Les appels vers le service Mail sont effectués de façon asynchrone et affichent immédiatement un résultat. Ce service gère le processus visant à contacter les serveurs de messagerie des destinataires et à transmettre le message. Si un problème survient pendant l'envoi d'un message à un destinataire ou si le serveur de messagerie d'un destinataire affiche un "message d'erreur automatique", le message d'erreur est envoyé à l'expéditeur.

Envoyer des messages incluant différents types de données

Vous pouvez envoyer des messages incluant différents types de données, tels qu'un message avec des pièces jointes ou un message avec du texte brut et du contenu HTML.

Pour envoyer un message incluant différents types de données, procédez comme suit :

  1. Créez un objet MimeMultipart pour contenir les différentes données, puis créez un objet MimeBodyPart pour chaque pièce jointe ou un autre corps de message, et ajoutez-le au conteneur.

  2. Faites passer le conteneur en tant que "content" (contenu) de l'objet MimeMessage.

L'exemple de code suivant montre comment envoyer un message contenant différents types de données :

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);

Pour des raisons de sécurité, les données d'un message et les pièces jointes doivent correspondre à l'un des types autorisés et les noms des fichiers des pièces jointes doivent se terminer par une extension reconnue pour le type. Pour consulter la liste des types et extensions de nom de fichier autorisés, consultez la section Messages avec pièces jointes.