この記事は…

下記に一つ以上当てはまる方はどなたでもご参加頂けます。是非御エントリーくださいませ。・声がデカい・返事だけはイイ・酒豪・朝まで呑んで普通に仕事・上下関係が大事・基本5分前行動・学生時代に運動系の部活・同好会 or 吹奏楽部への所属実績がある・社会人運動...

qiita.com

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

そして…

集え、初老丸達よ。初老丸達による世界に向けた技術的(又はそれに関連する)な物語を綴るカレンダーです。我こそ初老丸という方、初老丸予備軍の方も奮ってご参加下さい。ジーク・初老丸!

qiita.com

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

tl;dr

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

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

mailcatcher の準備

mailcatcher とは

mailcatcher - Catches mail and serves it through a dream.

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

これだけ, 簡単ですな.

ブラウザで 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 を見てみると…

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

以上

メモでした.

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

元記事はこちら

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