透過 Amazon SES SMTP 介面以程式設計方式傳送電子郵件 - Amazon Simple Email Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

透過 Amazon SES SMTP 介面以程式設計方式傳送電子郵件

若要使用 Amazon SES SMTP 介面傳送電子郵件,您可以使用SMTP啟用 的程式設計語言、電子郵件伺服器或應用程式。開始之前,請完成 設定 Amazon Simple Email Service 中的任務。您也需要提供下列資訊:

程式碼範例

您可以使用SMTP啟用 的程式設計語言來存取 Amazon SES SMTP 介面。您可以提供 Amazon SES SMTP 主機名稱和連接埠號碼以及您的SMTP憑證,然後使用程式設計語言的一般SMTP函數傳送電子郵件。

根據預設,Amazon Elastic Compute Cloud (Amazon EC2) 會限制透過連接埠 25 的電子郵件流量。若要避免在透過 Amazon 的SMTP端點傳送電子郵件時逾時EC2,您可以要求移除這些限制。如需詳細資訊,請參閱 AWS 知識中心中的如何從 Amazon EC2執行個體或 AWS Lambda 函數中移除連接埠 25 的限制?

本節中的 Java 程式碼範例PHP,並使用連接埠 587 來避免此問題。

注意

在這些教學課程中,可傳送電子郵件給自己,以確認是否成功收到。如需進一步實驗或負載測試,請使用 Amazon SES信箱模擬器。傳送到信箱模擬器的電子郵件不會計入您的傳送份額或退信率與投訴率。如需詳細資訊,請參閱手動使用信箱模擬器

選取程式設計語言以檢視該語言的範例:

警告

Amazon SES不建議使用靜態憑證。請參閱 AWS Secrets Manager 以了解如何透過從原始程式碼中移除硬式編碼憑證來改善您的安全狀態。本教學課程僅用於在非生產環境中測試 Amazon SES SMTP 介面。

Java

此範例使用 Eclipse IDE 和 透過 Amazon SES使用 SMTP 介面JavaMail API傳送電子郵件。

執行下列程序前,請先完成 設定 Amazon Simple Email Service 中的任務。

使用具有 Java 的 Amazon SES SMTP 介面傳送電子郵件
  1. 在 Web 瀏覽器中,前往JavaMail GitHub 頁面 。在資產 下,選擇 javax.mail.jar 以下載最新版本的 JavaMail。

    重要

    本教學課程需要 1.5 JavaMail 版或更新版本。這些程序已使用 1.6.1 JavaMail 版進行測試。

  2. 在網頁瀏覽器中,前往雅加達啟用 GitHub 頁面 ,並在JavaBeans 啟用架構 1.2.1 最終版本 下下載 jakarta.activation.jar

  3. 執行以下步驟以在 Eclipse 中建立專案:

    1. 啟動 Eclipse。

    2. 在 Eclipse 中,選擇 File (檔案),選擇 New (新增),然後選擇 Java Project (Java 專案)

    3. Create a Java Project (建立 Java 專案) 對話方塊中,輸入專案名稱,然後選擇 Next (下一步)

    4. Java Settings (Java 設定) 對話方塊中,選擇 Libraries (程式庫) 標籤。

    5. 選取 Classpath,然後使用新增外部按鈕新增兩個外部 JARs jar 檔案 javax.mail.jarjakarta.activation.jar

    6. 選擇新增外部 JARs

    7. 瀏覽至您下載 的資料夾 JavaMail。選擇檔案 javax.mail.jar,然後選擇 Open (開啟)

    8. Java Settings (Java 設定) 對話方塊中,選擇 Finish (完成)

  4. 在 Eclipse 的 Package Explorer (套件總管) 視窗中,展開您的專案。

  5. 在您的專案下,以滑鼠右鍵按一下 src 目錄,選擇 New (新建),然後選擇 Class (類別)

  6. New Java Class (新 Java 類別) 對話方塊的 Name (名稱) 欄位中,輸入 AmazonSESSample,然後選擇 Finish (完成)

  7. 使用下列程式碼取代 A mazonSESSample.java 的完整內容:

    import java.util.Properties; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class AmazonSESSample { // Replace sender@example.com with your "From" address. // This address must be verified. static final String FROM = "sender@example.com"; static final String FROMNAME = "Sender Name"; // Replace recipient@example.com with a "To" address. If your account // is still in the sandbox, this address must be verified. static final String TO = "recipient@example.com"; // Replace smtp_username with your Amazon SES SMTP user name. static final String SMTP_USERNAME = "smtp_username"; // The name of the Configuration Set to use for this message. // If you comment out or remove this variable, you will also need to // comment out or remove the header below. static final String CONFIGSET = "ConfigSet"; // Amazon SES SMTP host name. This example uses the US West (Oregon) region. // See https://docs.aws.amazon.com/ses/latest/DeveloperGuide/regions.html#region-endpoints // for more information. static final String HOST = "email-smtp.us-west-2.amazonaws.com"; // The port you will connect to on the Amazon SES SMTP endpoint. static final int PORT = 587; static final String SUBJECT = "Amazon SES test (SMTP interface accessed using Java)"; static final String BODY = String.join( System.getProperty("line.separator"), "<h1>Amazon SES SMTP Email Test</h1>", "<p>This email was sent with Amazon SES using the ", "<a href='https://github.com/javaee/javamail'>Javamail Package</a>", " for <a href='https://www.java.com'>Java</a>." ); public static void main(String[] args) throws Exception { // Create a Properties object to contain connection configuration information. Properties props = System.getProperties(); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.port", PORT); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.auth", "true"); // Create a Session object to represent a mail session with the specified properties. Session session = Session.getDefaultInstance(props); // Create a message with the specified information. MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(FROM,FROMNAME)); msg.setRecipient(Message.RecipientType.TO, new InternetAddress(TO)); msg.setSubject(SUBJECT); msg.setContent(BODY,"text/html"); // Add a configuration set header. Comment or delete the // next line if you are not using a configuration set msg.setHeader("X-SES-CONFIGURATION-SET", CONFIGSET); // Create a transport. Transport transport = session.getTransport(); // Get the password String SMTP_PASSWORD = fetchSMTPPasswordFromSecureStorage(); // Send the message. try { System.out.println("Sending..."); // Connect to Amazon SES using the SMTP username and password you specified above. transport.connect(HOST, SMTP_USERNAME, SMTP_PASSWORD); // Send the email. transport.sendMessage(msg, msg.getAllRecipients()); System.out.println("Email sent!"); } catch (Exception ex) { System.out.println("The email was not sent."); System.out.println("Error message: " + ex.getMessage()); } finally { // Close and terminate the connection. transport.close(); } } static String fetchSMTPPasswordFromSecureStorage() { /* IMPLEMENT THIS METHOD */ // For example, you might fetch it from a secure location or AWS Secrets Manager: https://aws.amazon.com/secrets-manager/ } }
  8. mazonSESSample.java 中,將下列電子郵件地址取代為您自己的值:

    重要

    電子郵件地址會區分大小寫。請確認此地址與您已完成驗證的地址完全相同。

    • sender@example.com – 將 取代為您的「從」電子郵件地址。執行此程式前,須先驗證此地址。如需詳細資訊,請參閱在 Amazon SES 中驗證身分

    • recipient@example.com – 以您的「收件人」電子郵件地址取代。如果您的帳戶仍在沙盒中,您必須在使用前先驗證這個地址。如需詳細資訊,請參閱請求生產存取權 (移出 Amazon SES沙盒)

  9. mazonSESSample.java 中,將下列項目取代為您自己的值:

    • smtp_username – 以您的SMTP使用者名稱憑證取代 。請注意,您的SMTP使用者名稱憑證是 20 個字元的字母和數字字串,而不是無法辨識的名稱。

    • smtp_password – 實作 `fetchSMTPPasswordFromSecureStorage`來擷取密碼。

  10. (選用) 如果您想要在 AWS 區域 以外的 中使用 Amazon SESSMTP端點 email-smtp.us-west-2.amazonaws.com,將變數的值變更為您要使用的HOST端點。如需SES可使用 Amazon 的區域清單,請參閱 中的 Amazon Simple Email Service (AmazonSES)AWS 一般參考

  11. (選用) 如果您想要在傳送此電子郵件時使用組態集,請變更變數的值 ConfigSet 組態集的名稱。如需組態集的詳細資訊,請參閱 在 Amazon 中使用組態集 SES

  12. 儲存 mazonSESSample.java

  13. 若要建置專案,請選擇 Project (專案),然後選擇 Build Project (建置專案)。(如果此選項為停用,則您可能已啟用自動建立。)

  14. 若要啟動程式並傳送電子郵件,請選擇 Run (執行),然後再次選擇 Run (執行)

  15. 檢閱輸出。如果電子郵件已成功傳送,主控台會顯示「電子郵件已傳送!」 否則,會顯示錯誤訊息。

  16. 登入至收件人地址的電子郵件用戶端。可以看到您已傳送的訊息。

PHP

此範例使用 PHPMailer類別,透過 Amazon SES使用 SMTP 介面傳送電子郵件。

在執行下列程序前,必須先完成 設定 Amazon Simple Email Service 中的任務。除了設定 Amazon 之外SES,您還必須完成下列先決條件,才能使用 傳送電子郵件PHP:

事前準備:
  • 安裝 PHP – PHP 可在 https://http://php.net/downloads.php 取得。安裝 後PHP,請在環境變數PHP中新增路徑至 ,以便您可以從PHP任何命令提示字元執行。

  • 安裝 Composer 相依性管理員 – 安裝 Composer 相依性管理員後,您可以下載並安裝 PHPMailer類別及其相依性。若要安裝 Composer,請遵循 https://https://getcomposer.org/download 上的安裝指示。

  • 安裝 PHPMailer類別 – 安裝 Composer 之後,請執行下列命令來安裝 PHPMailer:

    path/to/composer require phpmailer/phpmailer

    在上述命令中,取代 path/to/ 以及您安裝 Composer 的路徑。

使用 Amazon SES SMTP 介面與 傳送電子郵件 PHP
  1. 建立名為 amazon-ses-smtp-sample.php 的檔案。使用文字編輯器開啟檔案,並貼上以下程式碼:

    <?php // Import PHPMailer classes into the global namespace // These must be at the top of your script, not inside a function use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; // If necessary, modify the path in the require statement below to refer to the // location of your Composer autoload.php file. require 'vendor/autoload.php'; // Replace sender@example.com with your "From" address. // This address must be verified with Amazon SES. $sender = 'sender@example.com'; $senderName = 'Sender Name'; // Replace recipient@example.com with a "To" address. If your account // is still in the sandbox, this address must be verified. $recipient = 'recipient@example.com'; // Replace smtp_username with your Amazon SES SMTP user name. $usernameSmtp = 'smtp_username'; // Specify a configuration set. If you do not want to use a configuration // set, comment or remove the next line. $configurationSet = 'ConfigSet'; // If you're using Amazon SES in a region other than US West (Oregon), // replace email-smtp.us-west-2.amazonaws.com with the Amazon SES SMTP // endpoint in the appropriate region. $host = 'email-smtp.us-west-2.amazonaws.com'; $port = 587; // The subject line of the email $subject = 'Amazon SES test (SMTP interface accessed using PHP)'; // The plain-text body of the email $bodyText = "Email Test\r\nThis email was sent through the Amazon SES SMTP interface using the PHPMailer class."; // The HTML-formatted body of the email $bodyHtml = '<h1>Email Test</h1> <p>This email was sent through the <a href="https://aws.amazon.com/ses">Amazon SES</a> SMTP interface using the <a href="https://github.com/PHPMailer/PHPMailer"> PHPMailer</a> class.</p>'; $mail = new PHPMailer(true); try { // Specify the SMTP settings. $mail->isSMTP(); $mail->setFrom($sender, $senderName); $mail->Username = $usernameSmtp; $mail->Password = fetchSMTPPasswordFromSecureStorage(); $mail->Host = $host; $mail->Port = $port; $mail->SMTPAuth = true; $mail->SMTPSecure = 'tls'; $mail->addCustomHeader('X-SES-CONFIGURATION-SET', $configurationSet); // Specify the message recipients. $mail->addAddress($recipient); // You can also add CC, BCC, and additional To recipients here. // Specify the content of the message. $mail->isHTML(true); $mail->Subject = $subject; $mail->Body = $bodyHtml; $mail->AltBody = $bodyText; $mail->Send(); echo "Email sent!" , PHP_EOL; } catch (phpmailerException $e) { echo "An error occurred. {$e->errorMessage()}", PHP_EOL; //Catch errors from PHPMailer. } catch (Exception $e) { echo "Email not sent. {$mail->ErrorInfo}", PHP_EOL; //Catch errors from Amazon SES. } function fetchSMTPPasswordFromSecureStorage() { /* IMPLEMENT THIS METHOD */ // For example, you might fetch it from a secure location or AWS Secrets Manager: https://aws.amazon.com/secrets-manager/ } ?>
  2. amazon-ses-smtp-sample.php 中,將下列項目取代為您自己的值:

    • sender@example.com – 將 取代為您透過 Amazon 進行驗證的電子郵件地址SES。如需詳細資訊,請參閱驗證身分。Amazon 中的電子郵件地址區分SES大小寫。請確認您輸入的地址與您已完成驗證的地址完全相同。

    • recipient@example.com – 以收件人的地址取代 。如果您的帳戶仍在沙盒中,您必須在使用前先驗證這個地址。如需詳細資訊,請參閱 請求生產存取權 (移出 Amazon SES沙盒)。請確認您輸入的地址與您已完成驗證的地址完全相同。

    • smtp_username – 將 取代為您從 Amazon SES主控台SMTP的設定頁面取得的SMTP使用者名稱憑證。此憑證與您的 AWS 存取金鑰 ID 不同。請注意,您的SMTP使用者名稱憑證是 20 個字元的字母和數字字串,而不是無法辨識的名稱。

    • smtp_password – 實作 `fetchSMTPPasswordFromSecureStorage`來擷取密碼。

    • (選用) ConfigSet – 如果您想要在傳送此電子郵件時使用組態集,請將此值取代為組態集的名稱。如需組態集的詳細資訊,請參閱 在 Amazon 中使用組態集 SES

    • (選用) email-smtp.us-west-2.amazonaws.com – 如果您想要在美國西部 (奧勒岡) 以外的區域使用 Amazon SESSMTP端點,請將此端點取代為您想要使用的區域中的 Amazon SESSMTP端點。如需SES可用 URLs Amazon AWS 區域 的SMTP端點清單,請參閱 中的 Amazon Simple Email Service (AmazonSES)AWS 一般參考

  3. 儲存 amazon-ses-smtp-sample.php

  4. 若要執行程式,請在與 amazon-ses-smtp-sample.php 相同的目錄中開啟命令提示,然後輸入 php amazon-ses-smtp-sample.php

  5. 檢閱輸出。如果電子郵件已成功傳送,主控台會顯示「電子郵件已傳送!」 否則,會顯示錯誤訊息。

  6. 登入收件人地址的電子郵件用戶端。可以看到您已傳送的訊息。