はじめに
他の記事で、サーバ内にダミーSMTPサーバを立ててメール送信をする記事を書いたが、これはダミーであるため本当のメール送信にはならないので、本番で利用しているサーバの状態をメールで通知して、自分のメールアドレスに受信することができない。
自分のメールアドレスで受信するために、今回はメール送信サービスであるAmazonのSimple Email Service(SES)の設定の仕方を書いた。
これを利用すれば、客のメールサーバを利用することが不要になり、自分でSMTPサーバを構築する必要がなくなる。
Simple Email Serviceの設定
はじめに送信元のメールアドレスを有効にしてから、
SMTPサーバでIAMを作成してSMTPサーバを有効にします。
SMTPサーバのポート(25, 465 or 587)がいくつか用意されているが、それらのポートで社内から送ることはできないかもしれないので、ポートの制限のない環境から送信するようにする。
メールの登録
IAMユーザの作成
送信するメールとは別にIAMの権限が必要なので、IAMユーザを作成します。
送信テスト
今回は、MacからVisualStudioCodeを使って、言語は、PowerShellでメールを送信したいと思います。
赤で消してあるところの最初は、AWSのIAMユーザとパスワードで
次は、メールの有効化の章で登録したメールアドレスです。
-
コードを貼り付け、プログラムを実行します。VS Codeであれば、F5キーでコードを実行することができます。
ターミナルにエラー表示されなければ送れています。
※今回、ターミナルに黄色文字で警告が表示されていますが、メール送信に利用しているSend-MailMessageコマンドが廃止予定であるためです。メールの送信テストには問題ありません。
プログラム
- SMTP USER NAME HEREやSMTP PASSWORD HEREは、IAMユーザのユーザ名やパスワードに置き換えてください。
VBSで送信
VBSでも書きましたが、デバックのしやすさを考えると、今後はPowerShellで書いたほうが良いです。
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 インターフェイスへの接続をテストする
# 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でも動作するようにしました。
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 |
参考書籍
- 今回のメール送信テストにあたって下記の書籍を参考にしました。
メール送信以外にも1からアプリを作ってAWSを学ぼうという書籍なので、良い書籍です。
Amazon Web Services アプリ 開発運用入門
参考サイト