TLS 証明書の追加と SMTP 設定

独自の送信専用サーバーを使ってメールを送信しようとしています。TLS を使用するために SMTP ゲートウェイを実行しているため、メール送信に使用するクライアントには証明書が必要です。自己署名証明書を使用していますが、postfix/ssmtp を使ってメールを送信する場合は簡単に設定できます。しかし、Discourse のメールクライアントでカスタム証明書を使用する方法がわかりません。

概要を簡単に説明しますと:

簡単なシナリオ:
Discourse —送信—メール—> Mailgun —送信—メール—> ユーザー

私のシナリオ:
Discourse —送信—メール—> SMTP ゲートウェイを実行している私のサーバー —AWS SES API を使用してメール中継—> ユーザー

よろしくお願いいたします。

質問を訂正させてください。この機能のために証明書を追加する必要はないはずですが、TLS での通信に失敗しています。swaks でテストすると正常に動作します。例コマンド:

swaks --to user@example.com --from me@example.com --auth PLAIN --auth-user myusername -tls -s smtp.somehost.com:2525

AWS SES SMTP を直接使ってこれを実現できます。なぜローカルリレーが必要なのでしょうか?

@itsbhanusharma AWS SES は月に 6 万件のメール送信を無料で提供しており、私の知る限り、これらのメール送信は EC2 インスタンスからリクエストされなければなりません。そうしないと、通常の料金が発生します。私の Discourse インスタンスは Digital Ocean の Droplet でホストされています。間違っている可能性もありますが、これが私の理解と、その理由です。

つまり、SES API が DigitalOcean の IP アドレスからメールを受信しても、課金対象となります。別のサービスを利用するか、EC2 インスタンス上で Exim を起動して、DO Droplet と AWS SES の間にブリッジを構築することを検討してください。動作するとは考えにくいですが、試してみる価値はあります。

理論的には以下のような流れになるはずです:

  1. Discourse(DO 上)がメールを EC2 上の Exim IP に送信
  2. EC2 が DO から受信したメールを SES に中継
  3. SES がメールを最終ユーザーに配信

EC2 でローカルの SMTP サーバーを実行し、最終的に SMTP 要求を SES に転送することで、リレーの問題は既に解決しました。問題は、Postfix や swaks などのアプリケーションは正常に動作しているにもかかわらず、Discourse がこの SMTP サーバーとの TLS ハンドシェイクで失敗している点です。

その問題は、ポート 25(暗号化なし)を使用することで簡単に解決できます。

この SMTP ハンドシェイクがどこで処理されているか確認する方法はありますか?Ruby の裏側で Discourse が使用しているライブラリなどはありますか?ここでは TLS を無効にしたくありません。

次に、有効な SSL 証明書を使用してください(Let’s Encrypt でも問題なく動作します)。

Let’s Encryptの有効な証明書を使っても、なぜか解決しませんでした。理由はわかりません。
しかし、app.yamlで以下を設定したところ、メールが正常に動作するようになりました。

DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none

SMTPについて詳しい方がなぜこれで動作するのか説明してくれるかもしれませんが、とりあえずこれで大丈夫そうです。

これにより、Discourse インスタンスを単に S3 に移行するよりもコストが安くなるでしょうか?

AWS で $5 の EC2 インスタンスを運用しており、複数のドメインのリレーに使用しています。Discourse を EC2 に移行すると、Digital Ocean からは少しコストがかかるかもしれませんが、正直なところ大した額ではありません(全体で数ドル増える程度です)。

しかし、Discourse を EC2 に移行しても、私が所有する他のドメイン向けに DO 上で運用している他のドロプレットをサポートするために、引き続きこのリレーサービスが必要になります。であれば、Discourse を修正してしまうのはどうでしょうか :slight_smile:

さて、ご自身でお認めになっている通り、Discourseに不具合があるわけではなく、SESと完全に問題なく連携しています。

これは、SESの制限を回避して無料でメールを中継するために行っているのです。

その通りですが、ここでは Discourse と SES は無関係です。Discourse は SMTP サーバーと通信するだけで、そのサーバーは任意のもの(現在はリレーサービス)です。同じ DO VPC 内のこの SMTP サーバーに対しては、postfix や swaks などが問題なく動作しているのに、なぜ Discourse だけがうまくいかないのか不思議に思っていました。その変数を設定したところ、動作するようになりましたが、Discourse で SMTP ハンドシェイクに使用しているライブラリが何なのか知りたいです。それによって、Discourse の改善のために何かできることがあるかどうかを個人的に確認したいからです。