概要

  • Python の標準ライブラリを使ってメール送信する。
  • デコレータと組み合わせて、処理終了お知らせメールを送信してみる。

参考

  • Python 公式「email 使用例」
  • Lambda7's Website「Python デコレータ解説」

簡単な例 ~メールを送信してみる~

  • Python のサンプルをほぼそのまま使用してみる。
  • 送信は SMTP サーバに依頼しているらしい。(差出人偽装も簡単なのね。。)

  • 以下、サンプル。
# -*- coding: utf-8 -*-

# Import smtplib for the actual sending function
import smtplib

# Import the email modules well need
from email.mime.text import MIMEText

from_address  = (送信元アドレスを設定)
to_address    = (送信先アドレスを設定)

# 本文
msg = MIMEText( "Hello!!" )

# 件名、宛先
msg[Subject] = Mail sending test.
msg[From]    = from_address
msg[To]      = to_address

# Send the message via our own SMTP server, but dont include the envelope header.
s = smtplib.SMTP()
s.connect()
s.sendmail( me, [you], msg.as_string() )
s.close()
  • 結果
    • 宛先として設定したアドレスに、件名「Mail sending test.」本文「Hello!」なメールが届けば成功。

処理完了お知らせメール機能

  • デコレータと組み合わせて、処理が終わったらお知らせしてくれるようにする。
    • メール本文には実行ファイル名とプロセス名を表示。
    • 実行時間とか測っても良いかも。
  • デコレータの引数として、宛先アドレスを変えられるようにしてみる。
    • 処理ごとに担当者が違ったりすることを想定してみる。

  • 以下、サンプル。
# -*- coding: utf-8 -*-

import smtplib
from email.mime.text import MIMEText

def sendmail( to_address ) :
    def receive_func( func ) :
        import functools
        @functools.wraps( func )
        def wrapper( *args, **kwargs ) :
            result = func( *args, **kwargs )

            from_address = "(送信元アドレスを設定)"
            
            # Create mail
            text  = "Process "{0}" is finished!!
".format( func.__name__ )
            text += "( Program file : {0} )
".format( __file__ )

            msg  = MIMEText( text )
            msg[Subject] = "Process is finished!!"
            msg[From]    = from_address
            msg[To]      = to_address

            # Send mail
            s = smtplib.SMTP()
            s.connect()
            s.sendmail( from_address, [to_address], msg.as_string() )
            s.close()

            # Debug print
            print "Debug: Send mail to "{0}" from "{1}".".format( to_address, from_address )
            
            return result
        return wrapper
    return receive_func


# Test
if __name__ == __main__ :

    import time

    @sendmail( "(送信先アドレス その1 を設定)" )
    def long_process() :
        # 何か 長~い 処理
        # 処理完了後、decorator により終了報告がされる。
        time.sleep( 5 )

    @sendmail( "(送信先アドレス その2 を設定)" )
    def long_process2() :
        # 何か 長~い 処理 その2
        # 処理完了後、decorator により終了報告がされる。
        time.sleep( 10 )

    # 処理実行
    long_process()
    long_process2()
  • 結果
    • 設定した送信先にメールが届けば成功。
      • 1つ目のプロセス名は「long_process」、2つ目は「long_process2」のはず。

まとめ

  • メールの送信も簡単に出来る Python 便利!!
  • デコレータも改めて便利。あまり使わないけど。。
  • この機能、作ってみたけど使うかなぁ??