Herokuから トランザクショナルメールを送信する方法 (Mailer To Goを使用)
Heroku dynoは、アプリを実行するのに最適な場所ですが、メールサーバーを実行するのには最悪です。ファイルシステムは一時的で、dynoのIPは共有され、ローテーションし、アウトバウンドポート25は実質的に使用不可です。そのため、dynoから直接送信しようとするメールはスパムになるか、そもそも送信されません。解決策は、メール送信をメールサービスに任せることです。Mailer To Goは、数秒でプロビジョニングされ、アプリに自動で接続するHerokuアドオンです。認証済みの信頼性が管理されたポート587での接続でメールを送信できます。
このガイドは、Herokuでメール送信を完全に設定し、多くの人々が躓くHeroku特有の落とし穴(config vars、review apps、バックグラウンドジョブ)をカバーしています。
ステップ1 — アドオンをプロビジョニングする
CLIから:
heroku addons:create mailertogo --app your-app
またはHeroku Elements Marketplaceから追加します。どちらの方法でも、プロビジョニングによって以下のconfig varsが自動的にアプリに設定されます。認証情報をコピーペーストする必要はありません:
heroku config --app your-app | grep MAILERTOGO
# MAILERTOGO_SMTP_HOST: smtp.mailertogo.com
# MAILERTOGO_SMTP_USER: ...
# MAILERTOGO_SMTP_PASSWORD: ...
# MAILERTOGO_API_KEY: ...
すべてのデプロイとreview appで必ず取得されるようにするため、app.jsonに追加します:
{
"addons": ["mailertogo"]
}
ステップ2 — 送信ドメインを確認する
Mailer To Goダッシュボードで送信サブドメイン(mtg.yourdomain.comなど)を追加し、表示されるSPFレコードとDKIMレコードを公開します(ルートドメインにDMARC ポリシーも追加)。サブドメインを使用することで、アプリの送信評判をルートドメインから分離でき、Herokuのような一時的なプラットフォームからのメールが確実に配信される理由になります。Mailer To Goがmtg.yourdomain.comから送信する理由とSPF/DKIM/DMARCセットアップガイドを参照してください。
ステップ3 — アプリをconfig varsに指す
アプリにはすでに認証情報が環境変数として設定されています。参照するだけです。
Rails:
# config/environments/production.rb
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: ENV["MAILERTOGO_SMTP_HOST"], # smtp.mailertogo.com
port: 587,
user_name: ENV["MAILERTOGO_SMTP_USER"],
password: ENV["MAILERTOGO_SMTP_PASSWORD"],
authentication: :plain,
enable_starttls: true
}
Node.js (Nodemailer):
const transport = require("nodemailer").createTransport({
host: process.env.MAILERTOGO_SMTP_HOST,
port: 587,
auth: { user: process.env.MAILERTOGO_SMTP_USER, pass: process.env.MAILERTOGO_SMTP_PASSWORD },
});
SMTPではなくHTTPを使用したい場合、または別の言語ですか?代わりにREST APIを使用してください。完全な例はMailer To Go APIおよびSMTPでメールを送信するを参照してください。
ステップ4 — デプロイしてテストメールを送信する
git push heroku main
heroku run rails runner 'ActionMailer::Base.mail(from: "hello@mtg.yourdomain.com", to: "you@example.com", subject: "Hello from Heroku", body: "It works.").deliver_now' --app your-app
heroku logs --tail --app your-app # 送信を監視
Gmailでメッセージを開き → 元のメッセージを表示をクリックして、SPF、DKIM、DMARCがすべてPASSと表示されていることを確認します。
Heroku特有の落とし穴
- 認証情報を絶対にハードコードしないでください。 config varを設定するとdynoが再起動され、クリーンにローテーションします。ハードコードされたパスワードは認証情報のローテーション時に生き残り、静かに機能不全になります。常に
ENVから読み込んでください。 - バックグラウンドジョブからメール送信をしてください。 dynoのファイルシステムは一時的で、ウェブリクエストは30秒のタイムアウトがあるため、コントローラアクション内でインラインで送信しないでください。Sidekiq/Delayed Job/GoodJobにエンキューし、ワーカーから送信してください。レスポンスが高速化され、一時的なSMTPエラーで自動再試行されます。
- Review appsとパイプライン。
app.jsonにmailertogoがある場合、各review appは独自のインスタンスをプロビジョニングできます。一時的なアプリから実際のメールを送信したくない場合は、メーラーを:test(Rails)またはそれらの環境でキャッチオールにオーバーライドしてください。 - ポート25は行き止まり — 必要ありません。 Heroku(すべての主要クラウドのように)はアウトバウンドポート25を使用不可にします。Mailer To Goは送信ポート587を使用し、これは開いています。ポート25で接続がハングするのが見えたら、それが理由です。
- dynoのスケーリングは問題ありません。 SMTPはメッセージごとにステートレスなため、複数のウェブ/ワーカーdynoの実行に特別な対応は不要です。すべてのdynoは同じconfig varsを読み込みます。
dynoから送信しないときにこれが機能する理由
配信可能性は送信IPとドメインによってプレイされる信頼度のゲームです。Heroku dynoには安定したIPも、ウォームされた信頼度も持たず、受信ボックスプロバイダが要求する認証レコードを公開できません。Mailer To Goは、管理されたIP、DKIMサイニングと鍵ローテーション、SPF/DMARCアラインメント、バウンス/クレーム処理を提供します。dynoがアプリを実行するのに適した処理をしている間、メールはメール配信に構築されたインフラストラクチャを走ります。
Addons.ioまたはBuild.ioを通じてデプロイしていますか?セットアップは同じです。Heroku、Addons.io、Build.ioでMailer To Goを使用するを参照してください。Herokuサブドメインを一般的に使用していますか?Herokuサブドメイン:入門ガイドを参照してください。