使用 Mail API 发送邮件

Java 版 Mail Service API 支持用于发送电子邮件的 JavaMail (javax.mail) 接口。

准备工作

将您的发件人电子邮件地址注册为已获授权的发件人。如需了解详情,请参阅谁可以发送电子邮件

发送电子邮件

如需发送电子邮件,请使用 App Engine SDK 附带的 JavaMail 类。

创建 JavaMail 会话时,如果您不提供任何 SMTP 服务器配置,App Engine 将使用邮件服务发送邮件。或者,可以为支持的第三方邮件提供商(例如 MailgunMailjetSendGrid添加 SMTP 配置。

如需发送邮件,请按以下步骤操作:

  1. 使用 JavaMail Session 对象创建一封邮件。

  2. 创建一个 MimeMessage 对象。

  3. 如需设置邮件发件人和收件人,请使用 InternetAddress 类。

    1. 调用 MimeMessage 对象的 setFrom() 方法来标识发件人,或者也可以用字符串形式在第二个参数中提供个人姓名来标识发件人。

    2. 将收件人类型和地址传递给 addRecipient() 方法来标识收件人。收件人类型可以是 Message.RecipientType.TOMessage.RecipientType.CCMessage.RecipientType.BCC

    如果电子邮件地址无效,InternetAddress 构造函数会引发 AddressException

  4. 如需设置“回复”地址,请使用 setReplyTo() 方法。

  5. 调用 MimeMessage 对象中的方法来创建邮件内容。使用 setSubject() 设置主题,使用 setText() 设置纯文本正文内容。

  6. 如需发送邮件,请使用 Transport 类中的静态方法 send()

您可以使用邮件服务针对外发电子邮件指定一组有限的标头。如需了解详情,请参阅可以使用的可选标头

以下代码示例演示了如何发送邮件:

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

对邮件服务的调用是异步的,会立即返回。邮件服务可管理与收件人的邮件服务器联系和递送邮件的过程。如果将邮件发送给任何收件人时出现问题,或者收件人的邮件服务器返回“系统退信”,则发件人会收到错误消息。

发送多部分邮件

您可以发送多部分邮件,例如含文件附件的邮件,或含纯文本邮件正文和 HTML 邮件正文的邮件。

如需发送多部分邮件,请执行以下操作:

  1. 创建一个 MimeMultipart 对象以包含这些部分,然后为每个附件或备用邮件正文创建一个 MimeBodyPart 对象并将其添加到容器中。

  2. 将容器分配给 MimeMessage 的内容。

以下代码示例演示了如何发送多部分邮件:

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

出于安全方面的考虑,邮件部分和附件必须是多种允许的类型中的一种,而且附件文件名的结尾必须是该类型的可识别文件扩展名。如需查看允许的类型和文件扩展名列表,请参阅带附件的邮件