ようへいの日々精進XP

よかろうもん

mailcatcher でメール送信のデバッグ作業が 256 倍捗った(個人比)のでメモ

この記事は...

qiita.com

体育会系エンジニア Advent Calendar 2017 10 日目の記事になる予定です. 駅伝部出身です. うっす.

そして...

qiita.com

参加者の少ない, 初老丸 Advent Calendar 2017 10 日目の記事になる予定です.

tl;dr

MacOS X 上でメール送信の動作確認をする際に mailcatcher という gem が擬似的にメールを受信してくれて, その受信結果をブラウザで確認出来たりして便利だったのでメモっておく.

f:id:inokara:20171209164832p:plain

↑ こんな感じでブラウザで送信結果を確認出来たりする.

mailcatcher の準備

mailcatcher とは

github.com

  • Ruby で実装されている
  • シンプルな SMTP サーバー(デフォルトで 1025 番で Listen する)
  • 1025 番宛にメールを送りつければ, 全てのメールをキャッチしてブラウザで確認することが出来る
  • 1080 番で Web メーラーのような UI が提供されていて, 添付ファイルの表示等も出来るらしい

Docker イメージで展開する

README では gem install するように書かれているが, Docker イメージが提供されていたので Docker イメージを利用する.

docker run \
  --detach \
  --name mailcatcher \
  -p 1025:1025 \
  -p 1080:1080 \
  schickling/mailcatcher

これだけ, 簡単ですな.

f:id:inokara:20171209164852p:plain

ブラウザで http://localhost:1080 にアクセスすると, 上図のようなページが表示される.

メールを送るサンプル

スクリプト本体

以下のような Python スクリプトを用意.(なかなか上達しない Python 道)

#!/usr/bin/env python

import argparse
import toml
import smtplib
from email.mime.text import MIMEText


def read_config(config_file):
    '''
      Description: 設定ファイルの読み込み
    '''
    with open(config_file) as conffile:
        c = toml.loads(conffile.read())

    config = {}
    # [common] Stage
    config['stage'] = c['common']['stage']
    # [notify] E-Mail Address & Subject Prefix
    config['smtp'] = c['mail']['smtp']
    config['email_address'] = c['mail']['email_address']
    config['subject_prefix'] = c['mail']['subject_prefix']

    return config


def send_mail(config, message):
    '''
      Description: メール送信する
      Return: None
    '''
    from_address = config['email_address']
    to_address = config['email_address']

    msg = MIMEText(message)
    msg['Subject'] = config['stage'] + config['subject_prefix']
    msg['From'] = config['email_address']
    msg['To'] = config['email_address']

    s = smtplib.SMTP(config['smtp'])
    s.sendmail(from_address, [to_address], msg.as_string())
    s.close()

    print(message)


def main():
    p = argparse.ArgumentParser()
    p.add_argument('--config-file', default='config.toml')
    args = p.parse_args()

    config = read_config(args.config_file)

    message = 'Hello World.'
    send_mail(config, message)


if __name__ == '__main__':
    main()

smtplib というライブラリを使えば, 簡単にメール送信を実装出来る. しかも, このライブラリは標準ライブラリなので嬉しい限り.

設定ファイル

設定ファイルは TOML フォーマットで.

[common]
stage = "debug"

[mail]
smtp = "127.0.0.1:1025"
email_address = "foo@example.com"
subject_prefix = " MailCatcher Test."

この設定ファイルを debug.toml という名前で保存しておく.

実行サンプル

以下のように, 設定ファイルを指定してスクリプトを実行する.

$ python --version
Python 3.6.2

$ python mail-debug.py --config-file=debug.toml
Hello World.

mailcatcher で確認

改めて, サンプルスクリプトを叩いてみる.

$ python mail-debug.py --config-file=debug.toml
Hello World.

うむ, LGTM(言ってみたかっただけ...)

mailcatcher を見てみると...

f:id:inokara:20171209164927p:plain

LGTM(言ってみたかっただけ...) ちゃんとメールがキャッチ出来ている.

以上

メモでした.

これまでは, 自分のメールアドレス宛に送っていたりして体育会系デバッグ作業だったけど, mailcatcher を使うことでデバッグ作業は 256 倍捗りそうな気がする. うっす.