Amazon Simple Email Service(SES)をSMTPサーバとして利用する方法

# はじめに
[他の記事](https://qiita.com/yaginagi/items/92c89bac083f050363b6)で、サーバ内にダミーSMTPサーバを立ててメール送信をする記事を書いたが、これはダミーであるため本当のメール送信にはならないので、本番で利用しているサーバの状態をメールで通知して、自分のメールアドレスに受信することができない。
自分のメールアドレスで受信するために、今回はメール送信サービスであるAmazonのSimple Email Service(SES)の設定の仕方を書いた。
これを利用すれば、客のメールサーバを利用することが不要になり、自分でSMTPサーバを構築する必要がなくなる。


# Simple Email Serviceの設定
はじめに送信元のメールアドレスを有効にしてから、
SMTPサーバでIAMを作成してSMTPサーバを有効にします。
SMTPサーバのポート（25, 465 or 587）がいくつか用意されているが、それらのポートで社内から送ることはできないかもしれないので、ポートの制限のない環境から送信するようにする。
## メールの登録
- メールの有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47172/54ea8303-afae-c813-89cd-926b521bf795.png)

## IAMユーザの作成
送信するメールとは別にIAMの権限が必要なので、IAMユーザを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47172/b137b776-9a6e-5cf6-49a6-d79e4d5cbed0.png)

作成ボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47172/8103a187-a85f-652c-bbd2-a1d653d243ce.png)

IAMの情報をダウンロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47172/c7d9be85-fc54-30e6-551d-b9ee6788359c.png)

ダウンロードしたファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47172/028dec7f-35aa-0fd1-12a3-3c751f326945.png)


## 送信テスト
今回は、MacからVisualStudioCodeを使って、言語は、PowerShellでメールを送信したいと思います。
赤で消してあるところの最初は、AWSのIAMユーザとパスワードで
次は、メールの有効化の章で登録したメールアドレスです。

- コードを貼り付け、プログラムを実行します。VS Codeであれば、F5キーでコードを実行することができます。
ターミナルにエラー表示されなければ送れています。
※今回、ターミナルに黄色文字で警告が表示されていますが、メール送信に利用しているSend-MailMessageコマンドが廃止予定であるためです。メールの送信テストには問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47172/0656d239-6a0f-2a09-6c33-fa6871380751.png)

- 自分のメールアドレスにメールが届きます。これでテストは完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47172/b90bc55e-681a-182c-e762-bf6e1e22128d.png)

# プログラム

- SMTP USER NAME HEREやSMTP PASSWORD HEREは、IAMユーザのユーザ名やパスワードに置き換えてください。

## VBSで送信
VBSでも書きましたが、デバックのしやすさを考えると、今後はPowerShellで書いたほうが良いです。

```vb:vbs

Set message = CreateObject("CDO.Message")
message.From = "foo@example.com"
message.To = "bar@example.com"
message.Subject = "件名"
message.TextBody = "本文。"
message.TextBodyPart.Charset = "ISO-2022-JP"

Const schemas = "http://schemas.microsoft.com/cdo/configuration/"
message.Configuration.Fields.Item(schemas + "sendusing") = 2
message.Configuration.Fields.Item(schemas + "smtpconnectiontimeout") = 30
message.Configuration.Fields.Item(schemas + "smtpserver") = "email-smtp.us-east-1.amazonaws.com"
message.Configuration.Fields.Item(schemas + "smtpserverport") = "465"
message.Configuration.Fields.Item(schemas + "smtpusessl") = true
message.Configuration.Fields.Item(schemas + "smtpauthenticate") = true
message.Configuration.Fields.Item(schemas + "sendusername") = "****SMTP USER NAME HERE****"
message.Configuration.Fields.Item(schemas + "sendpassword") = "****SMTP PASSWORD HERE****"
message.Configuration.Fields.Update()

message.Send()

```


## PowrShellで送信
- サンプルに書いてあるSend-MailMessageのコマンドは、廃止予定であるため、下記のサイトから最新のコマンドを参考にしてください。この記事を書いた現在では、警告が表示されるだけで利用は可能です。

[コマンドラインを使用して Amazon SES SMTP インターフェイスへの接続をテストする](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-email-smtp-client-command-line.html)

```Powershell:Powershell
# Define username and password
$smtpUserName = '****SMTP USER NAME HERE****'
$smtpPassword = ConvertTo-SecureString '****SMTP PASSWORD HERE****' -AsPlainText -Force

# Convert to SecureString
[pscredential]$credential = New-Object System.Management.Automation.PSCredential ($smtpUserName, $smtpPassword)

# Send Email - change the values if needed.
Send-MailMessage -Credential $credential `
-useSSL `
-smtpServer 'email-smtp.ap-southeast-2.amazonaws.com' `
-port 587 `
-from 'mailer@lzex.cf' `
-to 'june@lzex.cf' `
-subject `
'Email via Amazon SES SMTP Endpoint' `
-body 'Email via Amazon SES SMTP Endpoint'
```
## C#で送信
- .Net Framework3.5でも動作するようにしました。

```C#:C#
using System;
using System.Net;
using System.Net.Mail;

namespace AmazonSESSample
{
	class Program
	{
		static void Main(string[] args)
		{
			String FROM = "mailfrom@test.co.jp";
			String FROMNAME = "Sender Name";
			String TO = "mailto@test.co.jp";
			String SMTP_USERNAME = "****SMTP USER NAME HERE****"; // Replace smtp_username with your Amazon SES SMTP user name.
			String SMTP_PASSWORD = "****SMTP PASSWORD HERE****";     // Replace smtp_password with your Amazon SES SMTP password.
			//String CONFIGSET = "ConfigSet";   //これがあると動作しなかった
			String HOST = "email-smtp.ap-northeast-1.amazonaws.com";
			int PORT = 587;  //25, 465 or 587

			// The subject line of the email
			String SUBJECT = "Amazon SES test (SMTP interface accessed using C#)";

			// The body of the email
			String BODY =
				"<h1>Amazon SES Test</h1>" +
				"<p>This email was sent through the " +
				"<a href='https://aws.amazon.com/ses'>Amazon SES</a> SMTP interface " +
				"using the .NET System.Net.Mail library.</p>";

			// Create and build a new MailMessage object
			MailMessage message = new MailMessage();
			message.IsBodyHtml = true;
			message.From = new MailAddress(FROM, FROMNAME);
			message.To.Add(new MailAddress(TO));
			message.Subject = SUBJECT;
			message.Body = BODY;
			// Comment or delete the next line if you are not using a configuration set
			//message.Headers.Add("X-SES-CONFIGURATION-SET", CONFIGSET);　//これがあると動作しなかった

			using (Mail Ht = new Mail())
			{
				Ht.SetData( HOST,  PORT,  SMTP_USERNAME,  SMTP_PASSWORD, message);
			}
		}
	}
	public class Mail : IDisposable
	{
		void IDisposable.Dispose()
		{

		}

		public void SetData(string HOST, int PORT, string SMTP_USERNAME, string SMTP_PASSWORD, MailMessage message)
		{
			var client = new System.Net.Mail.SmtpClient(HOST, PORT);
			// Pass SMTP credentials
			client.Credentials =
				new NetworkCredential(SMTP_USERNAME, SMTP_PASSWORD);

			// Enable SSL encryption
			client.EnableSsl = true;

			// Try to send the message. Show status in console.
			try
			{
				Console.WriteLine("Attempting to send email...");
				client.Send(message);
				Console.WriteLine("Email sent!");
			}
			catch (Exception ex)
			{
				Console.WriteLine("The email was not sent.");
				Console.WriteLine("Error message: " + ex.Message);
			}
		}
	}
}

```


# 料金について

| 課金される項目 | 料金	 | 	追加料金 |
|:-:|:-:|:-:|
|  Amazon EC2 でホストされているアプリケーションからの E メール送信 | 月に 62,000 件までは 無料それ以上の E メール送信については 1,000 件ごとに 0.10 USD  |  添付ファイル 1GB につき 0.12 USDEC2 を使用する場合はその料金 |
|  E メールクライアントやその他のソフトウェアパッケージからの E メール送信 | 1,000 件ごとに 0.10 USD  |  添付ファイル 1GB につき 0.12 USD |
|  E メール受信 |  最初の 1,000 件までは 0 USD それ以降は 1,000 件ごとに 0.10 USD | 受信メールチャンク 1,000 件につき 0.09 USD  |

		
		
	
# 参考書籍
- 今回のメール送信テストにあたって下記の書籍を参考にしました。
メール送信以外にも１からアプリを作ってAWSを学ぼうという書籍なので、良い書籍です。

[Amazon Web Services アプリ 開発運用入門](https://amzn.to/3l4xKve)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47172/030f714b-93e7-b112-df10-46fc8ed46243.png)


# 参考サイト
http://kenichiro22.hatenablog.com/entry/20120410/1334064777

https://adamtheautomator.com/aws-email-service/

https://www.infoscoop.org/blogjp/2015/07/29/amazon-ses-release-limit/

https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-using-smtp-net.html