

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

# 使用命令列測試 Amazon SES SMTP 界面的連線
<a name="send-email-smtp-client-command-line"></a>

您可從命令列使用本節所述的方法測試 Amazon SES SMTP 端點的連線、驗證 SMTP 憑證，以及針對連線問題進行故障診斷。這些程序使用大多數常見作業系統隨附的工具和程式庫。

如需 SMTP 連線問題的其他故障診斷相關資訊，請參閱 [Amazon SES SMTP 問題](troubleshoot-smtp.md)。

## 先決條件
<a name="send-email-smtp-client-command-line-prereqs"></a>

當您連線到 Amazon SES SMTP 界面時，您必須提供一組 SMTP 憑證。這些 SMTP 登入資料與您的標準 AWS 登入資料不同。這兩種憑證類型不可互換。如需如何取得 SMTP 憑證的更多相關資訊，請參閱 [取得 Amazon SES SMTP 憑證](smtp-credentials.md)。

## 測試您與 Amazon SES SMTP 界面的連線
<a name="send-email-smtp-client-command-line-testing"></a>

您可以使用命令列測試您與 Amazon SES SMTP 界面的連線，無需驗證或傳送任何訊息。此程序有助於對基本連線問題進行疑難排解。如果測試連線失敗，請參閱 [SMTP 問題](troubleshoot-smtp.md)。

本節包含使用 OpenSSL (包含大多數 Linux、macOS 和 Unix 發行版本，也適用於 Windows) 和 PowerShell (最新版 Windows 隨附) 中的 `Test-NetConnection` cmdlet，測試您的連線的程序。

------
#### [ Linux, macOS, or Unix ]

有兩種方式可以使用 OpenSSL 來連接到 Amazon SES SMTP 界面，透過連接埠 587 使用明確 SSL，或透過連接埠 465 使用隱含 SSL。

**使用明確 SSL 連接到 SMTP 界面**
+ 在命令列上，輸入下列命令來連接到 Amazon SES SMTP 伺服器：

  ```
  openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.us-west-2.amazonaws.com:587
  ```

  在上述命令中，將 *email-smtp.us-west-2.amazonaws.com* 取代為您 AWS 區域的 Amazon SES SMTP 端點 URL。如需詳細資訊，請參閱[區域和 Amazon SES](regions.md)。

  若連線成功，您會看到類似以下的輸出：

  ```
  depth=2 C = US, O = Amazon, CN = Amazon Root CA 1
  verify return:1
  depth=1 C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
  verify return:1
  depth=0 CN = email-smtp.us-west-2.amazonaws.com
  verify return:1
  250 Ok
  ```

  閒置 10 秒後連線將自動關閉。

或者，您可以使用 Implicit SSL (隱含 SSL) 透過連接埠 465 連接到 SMTP 界面。

**使用隱含 SSL 連接到 SMTP 界面**
+ 在命令列上，輸入下列命令來連接到 Amazon SES SMTP 伺服器：

  ```
  openssl s_client -crlf -quiet -connect email-smtp.us-west-2.amazonaws.com:465
  ```

  在上述命令中，將 *email-smtp.us-west-2.amazonaws.com* 取代為您 AWS 區域的 Amazon SES SMTP 端點 URL。如需詳細資訊，請參閱[區域和 Amazon SES](regions.md)。

  若連線成功，您會看到類似以下的輸出：

  ```
  depth=2 C = US, O = Amazon, CN = Amazon Root CA 1
  verify return:1
  depth=1 C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
  verify return:1
  depth=0 CN = email-smtp.us-west-2.amazonaws.com
  verify return:1
  220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-VCSHDP1YZ A1b2C3d4E5f6G7h8I9j0
  ```

  閒置 10 秒後連線將自動關閉。

------
#### [ PowerShell ]

您可以在 PowerShell 中使用 [Test-NetConnection](https://docs.microsoft.com/en-us/powershell/module/nettcpip/test-netconnection) Cmdlet 來連線到 Amazon SES SMTP 伺服器。

**注意**  
`Test-NetConnection` Cmdlet 可判斷您的電腦是否能連接到 Amazon SES SMTP 端點。不過，它不會測試您的電腦是否能對 SMTP 端點建立隱含或明確的 SSL 連線。若要測試 SSL 連線，您可以安裝適用於 Windows 的 OpenSSL 以傳送測試電子郵件。

**使用 `Test-NetConnection` Cmdlet 連接到 SMTP 界面**
+ 在 PowerShell 中，輸入下列命令來連接到 Amazon SES SMTP 伺服器：

  ```
  Test-NetConnection -Port 587 -ComputerName email-smtp.us-west-2.amazonaws.com
  ```

  在上述命令中，將 *email-smtp.us-west-2.amazonaws.com* 取代為您 AWS 區域的 Amazon SES SMTP 端點 URL，並將 *587* 取代為連接埠號碼。如需 Amazon SES 中區域端點的詳細資訊，請參閱 [區域和 Amazon SES](regions.md)。

  如果連線成功，您會看到類似以下範例的輸出：

  ```
  ComputerName     : email-smtp.us-west-2.amazonaws.com
  RemoteAddress    : 198.51.100.126
  RemotePort       : 587
  InterfaceAlias   : Ethernet
  SourceAddress    : 203.0.113.46
  TcpTestSucceeded : True
  ```

------

## 使用命令列來透過 Amazon SES SMTP 界面傳送電子郵件
<a name="send-email-using-openssl"></a>

您也可以使用命令列來透過 Amazon SES SMTP 界面傳送訊息。此程序適用於測試 SMTP 憑證，以及測試特定收件人是否能夠接收您使用 Amazon SES 傳送的訊息。

------
#### [ Linux, macOS, or Unix ]

當電子郵件寄件者連接到 SMTP 伺服器時，用戶端將發出一組標準請求，而伺服器將以標準回應來回覆各項請求。這一系列的請求和回應稱為 *SMTP 對話*。使用 OpenSSL 連接到 Amazon SES SMTP 伺服器時，伺服器預期會發生 SMTP 對話。

當您計劃使用 OpenSSL 連接到 SMTP 界面時，則必須使用 base64 編碼來編碼您的 SMTP 登入資料。本節包含使用 base64 為您的登入資料進行編碼的程序。

**若要使用 SMTP 界面來自命令列傳送電子郵件**

1. 在命令列輸入以下內容，並將 *email-smtp.us-west-2.amazonaws.com* 取代為 Amazon SES SMTP 端點的 URL AWS 區域。如需詳細資訊，請參閱 [區域和 Amazon SES](regions.md)。：

   ```
    1. #!/bin/bash
    2. 
    3. # Prompt user to provide following information
    4. read -p "Configuration set: " CONFIGSET
    5. read -p "Enter SMTP username: " SMTPUsername
    6. read -p "Enter SMTP password: " SMTPPassword
    7. read -p "Sender email address: " MAILFROM
    8. read -p "Receiver email address: " RCPT
    9. read -p "Email subject: " SUBJECT
   10. read -p "Message to send: " DATA
   11. 
   12. echo
   13. 
   14. # Encode SMTP username and password using base64
   15. EncodedSMTPUsername=$(echo -n "$SMTPUsername" | openssl enc -base64)
   16. EncodedSMTPPassword=$(echo -n "$SMTPPassword" | openssl enc -base64)
   17. 
   18. # Construct the email
   19. Email="EHLO example.com
   20. AUTH LOGIN
   21. $EncodedSMTPUsername
   22. $EncodedSMTPPassword
   23. MAIL FROM: $MAILFROM
   24. RCPT TO: $RCPT
   25. DATA
   26. X-SES-CONFIGURATION-SET: $CONFIGSET
   27. From: $MAILFROM
   28. To: $RCPT
   29. Subject: $SUBJECT
   30. 
   31. $DATA
   32. .
   33. QUIT"
   34. 
   35. echo "$Email" | openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.us-west-2.amazonaws.com:587
   ```

1. 在每個變數的提示中，輸入您的值。

1. 
   + 若要透過連接埠 465 使用隱含 SSL 傳送，請使用：

     ```
     openssl s_client -crlf -quiet -connect email-smtp.us-west-2.amazonaws.com:465
     ```

   如果 Amazon SES 已接受訊息，您會看到類似以下範例的輸出：

   ```
   250 Ok 01010160d7de98d8-21e57d9a-JZho-416c-bbe1-8ebaAexample-000000
   ```

   `250 Ok` 後方的數字與文字字串為電子郵件的訊息 ID。
**注意**  
閒置 10 秒後連線將自動關閉。

------
#### [ PowerShell ]

您可以使用 [Net.Mail.SmtpClient](https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.smtpclient?view=netframework-4.8) 類別，透過連接埠 587 使用明確 SSL 來傳送電子郵件。

**注意**  
`Net.Mail.SmtpClient` 類別已正式淘汰，且 Microsoft 建議您使用第三方程式庫。此程式碼僅供測試使用，不應用於生產環境工作負載。

**使用明確 SSL 透過 PowerShell 傳送電子郵件**

1. 在文字編輯器中，建立新檔案。將以下程式碼貼到檔案：

   ```
   function SendEmail($Server, $Port, $Sender, $Recipient, $Subject, $Body) {
       $Credentials = [Net.NetworkCredential](Get-Credential)
   
       $SMTPClient = New-Object Net.Mail.SmtpClient($Server, $Port)
       $SMTPClient.EnableSsl = $true
       $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($Credentials.Username, $Credentials.Password);
   
       try {
           Write-Output "Sending message..."
           $SMTPClient.Send($Sender, $Recipient, $Subject, $Body)
           Write-Output "Message successfully sent to $($Recipient)"
       } catch [System.Exception] {
           Write-Output "An error occurred:"
           Write-Error $_
       }
   }
   
   function SendTestEmail(){
       $Server = "email-smtp.us-west-2.amazonaws.com"
       $Port = 587
   
       $Subject = "Test email sent from Amazon SES"
       $Body = "This message was sent from Amazon SES using PowerShell (explicit SSL, port 587)."
   
       $Sender = "sender@example.com"
       $Recipient = "recipient@example.com"
   
       SendEmail $Server $Port $Sender $Recipient $Subject $Body
   }
   
   SendTestEmail
   ```

   完成後，請將檔案儲存為 `SendEmail.ps1`。

1. 對您在前述步驟中建立的檔案進行下列變更：
   + 將 *sender@example.com* 替換為您想要傳送郵件的電子郵件地址。
   + 將 *recipient@example.com* 替換為您想要傳送郵件的電子郵件地址。
   + 以您 AWS 區域的 Amazon SES SMTP 端點 URL 取代 *email-smtp.us-west-2.amazonaws.com*。如需詳細資訊，請參閱[區域和 Amazon SES](regions.md)。

1. 在 PowerShell 中，輸入下列命令：

   ```
   .\path\to\SendEmail.ps1
   ```

   在上述命令中，將 *path\$1to\$1SendEmail.ps1* 取代為您在步驟 1 中建立的檔案路徑。

1. 出現提示時，請輸入您的 SMTP 使用者名稱和密碼。

或者，您也可以使用 [System.Web.Mail.SmtpMail](https://docs.microsoft.com/en-us/dotnet/api/system.web.mail.smtpmail?view=netframework-4.8) 類別，透過連接埠 465 使用隱含 SSL 來傳送電子郵件。

**注意**  
`System.Web.Mail.SmtpMail` 類別已正式淘汰，且 Microsoft 建議您使用第三方程式庫。此程式碼僅供測試使用，不應用於生產環境工作負載。

**使用隱含 SSL 透過 PowerShell 傳送電子郵件**

1. 在文字編輯器中，建立新檔案。將以下程式碼貼到檔案：

   ```
   [System.Reflection.Assembly]::LoadWithPartialName("System.Web") > $null
   
   function SendEmail($Server, $Port, $Sender, $Recipient, $Subject, $Body) {
       $Credentials = [Net.NetworkCredential](Get-Credential)
   
       $mail = New-Object System.Web.Mail.MailMessage
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", $Server)
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", $Port)
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", $true)
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", $Credentials.UserName)
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", $Credentials.Password)
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout", $timeout / 1000)
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", 2)
       $mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", 1)
   
       $mail.From = $Sender
       $mail.To = $Recipient
       $mail.Subject = $Subject
       $mail.Body = $Body
   
       try {
           Write-Output "Sending message..."
           [System.Web.Mail.SmtpMail]::Send($mail)
           Write-Output "Message successfully sent to $($Recipient)"
       } catch [System.Exception] {
           Write-Output "An error occurred:"
           Write-Error $_
       }
   }
   
   function SendTestEmail(){
       $Server = "email-smtp.us-west-2.amazonaws.com"
       $Port = 465
       
       $Subject = "Test email sent from Amazon SES"
       $Body = "This message was sent from Amazon SES using PowerShell (implicit SSL, port 465)."
   
       $Sender = "sender@example.com"
       $Recipient = "recipient@example.com"
   
       SendEmail $Server $Port $Sender $Recipient $Subject $Body
   }
   
   SendTestEmail
   ```

   完成後，請將檔案儲存為 `SendEmail.ps1`。

1. 對您在前述步驟中建立的檔案進行下列變更：
   + 將 *sender@example.com* 替換為您想要傳送郵件的電子郵件地址。
   + 將 *recipient@example.com* 替換為您想要傳送郵件的電子郵件地址。
   + 以您 AWS 區域的 Amazon SES SMTP 端點 URL 取代 *email-smtp.us-west-2.amazonaws.com*。如需詳細資訊，請參閱[區域和 Amazon SES](regions.md)。

1. 在 PowerShell 中，輸入下列命令：

   ```
   .\path\to\SendEmail.ps1
   ```

   在上述命令中，將 *path\$1to\$1SendEmail.ps1* 取代為您在步驟 1 中建立的檔案路徑。

1. 出現提示時，請輸入您的 SMTP 使用者名稱和密碼。

------