📭

SMTPの素振りに便利なEthereal Email

2022/10/16に公開

Ethereal EmailというSMTPの接続やメールの送信を簡単に確認できるサービスの紹介です。Etherealと聞くと「パケットキャプチャのツール?」と思ってしまいますが別物です。

https://ethereal.email/

使い方はとても簡単で上記画面の「Create Ethereal Account」を押すと、テンポラリなSMTPのユーザとパスワードが発行されるので、その認証情報を利用してメールを送ります。

送信後、Open Mailboxのボタンを押すと受信したメールの一覧が表示されて、件名をクリックするとメールの内容を確認できます。

宛先は実際に存在するメールアドレスを利用することもできます。メールは飛ばないのでテストにもってこいです。メールのテスト方法は以下のように色々なサービスやツールがありますが、Ethereal Emailはユーザ登録なども不要でかなり手軽に使えます。

https://sendgrid.kke.co.jp/blog/?p=10535

以下、送信例です。

Telnet

「素振りに便利」と書いたのですが、残念ながらTelnetは使えません。特に何も考えずにSMTP AUTHで進もうとすると以下のようにSTARTTLSを求められます。

telnet smtp.ethereal.email 587
Trying xxx.xxx.xxx.xxx...
Connected to smtp.ethereal.email.
Escape character is '^]'.
220 smtp.ethereal.email ESMTP Welcome to Ethereal MSA
EHLO localhost
250-smtp.ethereal.email Nice to meet you, FL1-133-202-39-183.tky.mesh.ad.jp
250-PIPELINING
250-8BITMIME
250-SMTPUTF8
250-AUTH LOGIN PLAIN
250 STARTTLS
AUTH LOGIN
538 Error: Must issue a STARTTLS command first

そこでSTARTTLSを最初に打つとコネクションが確立できるのですが、Telnetでは暗号化された通信ができないので次に進めないのです。残念...。

...
STARTTLS
220 Ready to start TLS
EHLO localhost
Connection closed by foreign host.

OpenSSL

Telnetの代わりにOpenSSLが使えます。

openssl s_client -connect smtp.ethereal.email:587 -starttls smtp -ign_eof -crlf

OpenSSLではコマンドの1文字目に"R"が来るとTLSの再接続(RENEGOTIATING)が実行されてしまうので、これを防ぐために-ign_eofオプションをつけました。またメールの終わりを表すピリオド(.)を認識させるために-cflfオプションをつけています。

read R BLOCK
EHLO localhost
250-smtp.ethereal.email Nice to meet you, FL1-133-202-39-183.tky.mesh.ad.jp
250-PIPELINING
250-8BITMIME
250-SMTPUTF8
250 AUTH LOGIN PLAIN
AUTH LOGIN
334 VXNlcm5hbWU6
bmFzaDQ0QGV0aGVyZWFsLmVtYWls
334 UGFzc3dvcmQ6
SFhXVXV3RDJQaHlmZUFFaDZx
235 Authentication successful
MAIL FROM:<from@kikutaro.tech>
250 Accepted
RCPT TO:<to@kikutaro.tech>
250 Accepted
DATA
354 End data with <CR><LF>.<CR><LF>
FROM:fromkiku<from@kikutaro.tech>
TO:tokiku<to@kikutaro.tech>
Subject:Hello

Hello!
.
250 Accepted [STATUS=new MSGID=Y0vyLSi6K045OhAOY0vys9l3tGx6Vw1SAAAAAvM1DReiMC0OldwiySpXM-4]
quit
221 Bye
closed

Swaks

Swaksだとこんな感じ。

swaks -t to@kikutaro.tech -f from@kikutaro.tech 
  --s smtp.ethereal.email -p 587
    -tls -au xxxxx@ethereal.email -ap xxxxx

https://zenn.dev/kikutaro/articles/22d838c5e6e396

Nodemailer

Node.jsの入った環境で

npm install nodemailer

と入力してNodemailerを使ってメールを送ってみます。以下のようなJSファイルを作成します。

const nodemailer = require('nodemailer');

const transporter = nodemailer.createTransport({
    host: 'smtp.ethereal.email',
    port: 587,
    auth: {
        user: 'xxxxx@ethereal.email',
        pass: 'xxxxx'
    }
});

let message = {
    from: 'Sender Name <sender@example.com>',
    to: 'Recipient <recipient@example.com>',
    subject: 'Nodemailer is unicode friendly ✔',
    text: 'Hello to myself!',
    html: '<p><b>Hello</b> to myself!</p>'
};

transporter.sendMail(message, (err, info) => {
    if (err) {
        console.log('Error occurred. ' + err.message);
        return process.exit(1);
    }

    console.log('Message sent: %s', info.messageId);
    console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));
});

実行します。

node send.js

MessageIDとEthereal Emailで結果が確認できるURLが表示されるので後者にアクセスするだけです。

Message sent: <xxxxx@example.com>
Preview URL: https://ethereal.email/message/xxxxxxxx

Discussion