AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

メールを実送信したくないが送信はされて欲しいし内容は確認したいお気持ちを delivery_method に表明する

Railsconfig.action_mailer.delivery_method で、:sendmail なり指定すればサッとメール送信できるので便利で良いですね。 とはいえ、環境によっては「メールを送信したくない!」というパターンがあるので。 しかし単純に送信部分をコメントアウトなりしちゃうと、サインアップ処理の最後に爆発しちゃうこともあるのでどうしたもんか。

そんなときは、 :file を利用しましょう。

delivery_method で指定できる配信方法

以下の通りです。

railsguides.jp

というと非常にアレなんで、大体以下の分類に分けられます。

  • メールを送信する
    • :smtp
      • 外部の smtp サーバを利用する
    • :sendmail
      • ローカルの sendmail を利用する
  • メールを送信しない
    • :file
      • ファイルに書き出す
    • :test
      • 配列に書き出す(使ったことないな、そういえば……)

:file とは

メールを送信せずにファイルに書き出します。 保存先は #{Rails.root}/tmp/mails あたりとなり、具体的には以下です。

github.com

それ letter_opener_web でよくない?

Basic 認証などで閲覧制限をしているだけの場合、下手こくとメールの内容が外部に漏れてしまうので、実環境ではあまり良くないですね。 ちゃんと認証かけた領域にルーティング設定しているなら letter_opener_web gem でも良いとは思いますが、今度は gem のメンテナンスコストが出るようになるので、僕はこちらを選択しました。

  • メールを外部に送信されないようにしてくれ
  • けど何かあったら送信内容や動作を確認したい

これらの場合、メンテナンスコストを上げることなく対応できるのが良き……、という感じです。

CLI 上でメールを確認する

#{Rails.root}/tmp/mails あたりを確認してみましょう。

 2019-04-08 22:02:10 ⌚  |2.5.1| donbulinuxnoMacBook-Pro in ~/Workspace/no_send_mail_project
± |master U:2 ✗| → gls tmp/mails/
total 16K
drwxr-xr-x 4 donbulinux staff  128  4  8 21:36 .
drwxr-xr-x 8 donbulinux staff  256  4  8 18:21 ..
-rw-r--r-- 1 donbulinux staff 4.2K  4  8 18:21 donbulinux@example.com
-rw-r--r-- 1 donbulinux staff 4.2K  4  8 18:21 donbulinux+test@example.com

どうやら To に指定したメールアドレスでファイルが生成されているようですね。 vi で開いてみましょう。

vi tmp/mails/donbulinux\@example.com

# snip #

Content-Type: text/html;
 charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=iso-2022-jp' http-equiv='Content-Type'>
</head>
<body>
<p>
^[$B%F%9%H!!@h@8^[(B

# snip #

アガーッ!! :e ++enc=iso-2022-jp でメールのヘッダに指定されている通りに開き直してみましょう。

# snip #

Content-Type: text/html;
 charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=iso-2022-jp' http-equiv='Content-Type'>
</head>
<body>
<p>
テスト 先生
</p>

# snip #

やったぁ。 これで gem の追加やコードの変更を大規模に行うことなく、メールを外部に送信せず、しかし内容があとから確認できる環境が用意できましたね。