[小ワザ] AWS CloudShellを利用してSES経由でテスト用メールを送ってみた

2021.02.02

こんにちは、コンサル部@大阪オフィスのTodaです。

SESの構築をおこなった後にテストメールを送信して設定セット(Configuration Sets)が正常に動いているか確認をする場合、SES標準のテスト送信が入力面倒だな、と思うようになってきました。
今回、CloudShellを使ってテスト送信を試してみました。

やりたいこと

  • CloudShellを利用してSES経由でメール送信をする。

やってみる

AWS CloudShellを起動する

AWSマネージメントコンソールにログインをおこない、上部のCloudShellボタンをクリックして起動します。

opensslのインストール

CloudShellにはopensslが導入されていないため yumコマンドを利用してインストールします。

sudo yum -y install openssl

SMTP認証文字列の作成

SESのSMTP認証に利用する文字列は[ユーザ名 \0 ユーザ名 \0 パスワード]の文字をbase64エンコードした物になります。 下記コマンドを利用して生成をおこないます。

user=[ユーザ名]
password=[パスワード]
perl -MMIME::Base64 -e 'print encode_base64("'$user'\0'$user'\0'$password'");' | sed ':a;N;$!ba;s/\n//g'

# 出力結果
(例) QUtJQVJCMzJYWVptJXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ※以下省略

※CloudShellに複数行の文字列をコピー&ペーストするとSafe Paste for multiline textの警告が表示されます。 [Paste]ボタンをクリックする事でペーストが可能です。

CloudShell警告表示

メールを送信

SMTP認証文字列が準備できれば、下記文字列を複数行入力することでSES経由でメール送信が可能になります。 サンプルコード内の[XX]文字列は置き換えて実行ください。

・置き換え文字列 (例)
[送信元メールアドレス]:info@example.com
[送信元ドメイン]:example.com
[送信先メールアドレス]:receive@example.org
[SMTP認証文字列]:上記で生成した文字列
[SMTPサーバ名]:email-smtp.ap-northeast-1.amazonaws.com
[SMTPサーバポート]:587

{
	sleep 0.3;
	echo 'HELO [送信元ドメイン]';
	sleep 0.3;       
	echo 'AUTH PLAIN [SMTP認証文字列]';
	sleep 0.3;
	echo 'MAIL FROM:<[送信元メールアドレス]>';
	sleep 0.3;
	echo 'rcpt TO:<[送信先メールアドレス]>';
	sleep 0.3;
	echo 'DATA';
	sleep 0.3;
	echo -e 'To:[送信先メールアドレス]\n\n'
	echo -e 'このメールはテスト送信メールです。\n'
	echo '.';
	sleep 0.3;
	echo 'QUIT';
} | openssl s_client -starttls smtp -crlf -connect [SMTPサーバ名]:[SMTPサーバポート]

実際の入力例

{
	sleep 0.3;
	echo 'HELO example.com';
	sleep 0.3;       
	echo 'AUTH PLAIN QUtJQVJCMzJYWVptJXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
	sleep 0.3;
	echo 'MAIL FROM:<info@example.com>';
	sleep 0.3;
	echo 'rcpt TO:<receive@example.org>';
	sleep 0.3;
	echo 'DATA';
	sleep 0.3;
	echo -e 'To:receive@example.org\n\n'
	echo -e 'このメールはテスト送信メールです。\n'
	echo '.';
	sleep 0.3;
	echo 'QUIT';
} | openssl s_client -starttls smtp -crlf -connect email-smtp.ap-northeast-1.amazonaws.com:587

# 出力結果
CONNECTED(00000003)
depth=4 C = US, O = "XXXXXXXXXXX", OU = XXXXXXXXXXX
verify return:1
depth=3 C = US, ST = XXXXXXXXXXX, L = XXXXXXXXXXX, O = "XXXXXXXXXXX", CN = XXXXXXXXXXX - G2
verify return:1
depth=2 C = US, O = XXXXX, CN = XXXXX Root CA 1
verify return:1
depth=1 C = US, O = XXXXX, OU = Server CA 1B, CN = XXXXX
verify return:1
depth=0 CN = email-smtp.ap-northeast-1.amazonaws.com
verify return:1
---
Certificate chain
 0 s:/CN=email-smtp.ap-northeast-1.amazonaws.com
   i:/C=US/O=XXXXX/OU=Server CA 1B/CN=XXXXX
 1 s:/C=US/O=XXXXX/OU=Server CA 1B/CN=XXXXX
   i:/C=US/O=XXXXX/CN=XXXXX Root CA 1
 2 s:/C=US/O=XXXXX/CN=XXXXX Root CA 1
   i:/C=US/ST=XXXXX/L=XXXXX/O=XXXXXXXXXXX, Inc./CN=XXXXXXXXXXX - G2
 3 s:/C=US/ST=XXXXX/L=XXXXX/O=XXXXXXXXXXX, Inc./CN=XXXXXXXXXXX - G2
   i:/C=US/O=XXXXX, XXXXX/OU=XXXXXXXXXXX
---
Server certificate
-----BEGIN CERTIFICATE-----
*****************
******省略*******
*****************
-----END CERTIFICATE-----
subject=/CN=email-smtp.ap-northeast-1.amazonaws.com
issuer=/C=US/O=XXXXX/OU=Server CA 1B/CN=XXXXX
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 000 bytes and written 000 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-XXXXXXXXXXXX
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-XXXXXXXXXXXX
    Session-ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Session-ID-ctx: 
    Master-Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1612257610
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
250 Ok
250 email-smtp.amazonaws.com
235 Authentication successful.
250 Ok
250 Ok
354 End data with <CR><LF>.<CR><LF>
250 Ok 000000-000000000-0000000-0000000
DONE

メール受信の確認

最終行が 250 Ok となっている場合、送信は完了しています。
メールが到着しているかをご確認ください。

さいごに

今回はCloudShellを利用してSESのメール送信テストをしてみました。
少しでも手間を減らせたら良いなと考えております。