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