使用 Mail API 傳送郵件

Java 適用的 Mail Service API 支援用於傳送電子郵件的 JavaMail (javax.mail) 介面。

事前準備

將您的寄件者電子郵件註冊為已獲授權的寄件者。詳情請參閱可以傳送電子郵件的人員一節。

傳送電子郵件

如要傳送電子郵件,請使用 App Engine SDK 隨附的 JavaMail 類別。

建立 JavaMail 工作階段時,如果您未提供任何 SMTP 伺服器設定,App Engine 會使用 Mail 服務傳送郵件。您也可以針對支援的第三方電子郵件服務供應商 (例如 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);

基於安全性考量,電子郵件的各個部分和附件必須是其中一種允許的類型,而且附件的檔案名稱必須以該類型的可識別副檔名結尾。如需允許的類型和副檔名清單,請參閱含有附件的郵件一節。