Exchange OnlineのSMTPサーバ(587ポートTLS)にメールを送るテスト

RailsのAction MailerからExchange Onlineにメールを送ろうとしてなかなか送れない事象に悩まされました。結局の所今回大事だったことは

  • 認証情報が合っているかログインして確認してみる
  • 認証に使ったメールアドレスとメール送信時のMAIL FROMを一致させる必要がある
  • smtp_settingsの:authenticationは :login ではなく login(環境変数で設定する場合はloginでよいということなのかもしれない)
  • SMTP AUTHを個別のメールアドレスごとに有効にする必要がある

ということでした。未来の自分を助けそうなのでメモしておきます。

確認方法

smtp.office365.com:587に対して、Kubernetes上のRailsコンテナからメールを送ろうとしましたがエラーが連発していました。調査のためにSMTPを喋ってメール送信テストをしてみることとしました。 smtp.office365.com:587に接続するためにはSTARTTLSを使うのでOpenSSLが必要です。古いNginxのDocker ImageにはOpenSSLが同梱されているのでそれを使うことにしました。Kubernetesで立ち上げるならこんなマニフェストを食わせてあげれば良いですね。

kubectl apply -f openssl.yaml

apiVersion: v1
kind: Pod
metadata:
  name: openssl
  namespace: default
spec:
  containers:
  - name: openssl
    image: nginx:1.11.13
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

Podが立ち上がったらログインしてopensslコマンドでメールを送ります。自分が入力しているところは、SMTPサーバからのレスポンスと区別をしやすいように ">" と書いています。 いろいろ試してわかりましたが、SMTPサーバに接続ができたらEHLOでドメインを教えてあげて、AUTH LOGINでユーザー名とパスワードをそれぞれbase64エンコードしてあげたものを送れば認証が通りました。その後は普通のSMTPと同じでした。

kubectl exec -it openssl -- sh

> openssl s_client -connect smtp.office365.com:587 -starttls smtp -ign_eof -crlf
250 SMTPUTF8
> EHLO example.com
250-TY1XXXXXX.outlook.office365.com Hello [xxx.xxx.xxx.xxx]
250-SIZE 157286400
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-AUTH LOGIN XOAUTH2
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250 SMTPUTF8
> AUTH LOGIN
334 VXNlcm5hbWU6 (base64デコードするとわかるが Username: と言っている)
> (printf 'hoge@example.com' | openssl enc -aの値)
334 UGFzc3dvcmQ6 (base64デコードするとわかるが Password: と言っている)
> xxxxxxxxxxxxxxx (printf '<password>' | openssl enc -aの値)
235 2.7.0 Authentication successful
> MAIL FROM: hoge@example.com
250 2.1.0 Sender OK
> RCPT TO: recipient@example.com
250 2.1.5 Recipient OK
> DATA
354 Start mail input; end with <CRLF>.<CRLF>
> from: hoge@example.com
> to: recipient@example.com
> Subject: test
> testmail
> .
250 2.0.0 OK

exchange online smtp starttls とかで調べたものの、意外とすぐに使える情報は出てこなかったのでブログに書きました。Gmailに送る例が多かったので、そのまま参考にならない情報も多かったというのもあります。 SMTP AUTHを個別のメールアドレスごとに有効にするために、Powershellを使う必要があるのが興味深かったです。しかもExchange Online PowerShell というものまであるとは。最近までGoogle Workspaceの世界で生きていたので新鮮に感じました。会社変わっても結局またターミナルからSMTP喋ってメール送信のテストをしていておもしろいですね。。

以下は参考リンクです。

www.workthecode.com docs.microsoft.com docs.microsoft.com docs.microsoft.com