TL;DR
- SES で生成した IAM ユーザ ses-smtp-user.YYYYMMDD にポリシーを足して、他の用途に流用しようと考えたが、どうも上手くいかない。
- 原因は、secret_access_key と SMTP 用のパスワードが異なるためだった。
- secret_access_key から SMTP 用のパスワードは生成できるようだ。逆はだめ。
- 公式のドキュメントには python 版が記されている
https://docs.aws.amazon.com/ses/latest/dg/smtp-credentials.html - nodejs 版を記しておく
const crypto = require('crypto');
const smtp_credentials_generate = (secret_access_key, region) => {
const version = 0x04;
const kMessage = [
'11111111', // date
region,
'ses', // service
'aws4_request', // terminal
'SendRawEmail', // message
].reduce(
(secret, text) => crypto.createHmac('sha256', secret).update(text).digest(),
'AWS4' + secret_access_key,
);
const signatureAndVersion = Buffer.concat([Buffer.from([version]), kMessage]);
const smtpPassword = signatureAndVersion.toString('base64');
return smtpPassword;
};
使い方
- ログインする SES の region を指定する
const secret_access_key = 'xxxxxxxxxxxxxxxxxxxxxxxx';
const smtp_password = smtp_credentials_generate(secret_access_key, 'us-west-2');
console.log(smtp_password);
補足
- ses が使えるようにポリシーを足しておくこと
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ses:SendRawEmail",
"Resource": "*"
}
]
}
テスト
- テスト送信
#!/bin/bash
user='AKI... アクセスキーID'
pass='上記で生成したSMTP用のパスワード'
from='exabugs@hoge.com'
rcpt='exabugs@hoge.com'
cat > input.txt <<EOT
EHLO hoge.com
AUTH LOGIN
$(echo -n $user | openssl enc -base64)
$(echo -n $pass | openssl enc -base64)
MAIL FROM: $from
RCPT TO: $rcpt
DATA
From: $from
To: $rcpt
Subject: Amazon SES SMTP Test
This message was sent using the Amazon SES SMTP interface.
.
QUIT
EOT
openssl s_client -crlf -quiet -connect email-smtp.us-west-2.amazonaws.com:465 < input.txt