前回の続きで、Pythonスクリプトを使ったTipsの紹介です。

Pythonではeメールの送信も可能なのですが、普段Gmailを使うことが多いため、いろいろと調べてみたところ、Gmail経由でメール送信ができることがわかりました。ついでに、PNG画像の添付にも成功したので、まとめてみます。

python-gmail-test
送信元と送信先を同じGmailアドレスに指定して受信したようす。添付画像もきちんと受信された。


前回の通知表示と同様、pythonスクリプトを拡張子.pyとしてファイルに保存して、作成したファイルに実行権を与え、端末で実行するか、ファイルをダブルクリックして実行します。

Gmail経由でテキストメールを送信する


まず、下記の書式でスクリプトを作成し、拡張子.pyのファイル名(ここでは「mail-1.py」とします)を付けて保存します。変更する必要があるのは、赤字の部分だけです。
[修正:2010/04/22 23:35]
タブが抜けていました。[tab]の部分にタブを加えて下さい。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

def create_message(from_addr, to_addr, subject, body):
[tab] msg = MIMEText(body)
[tab] msg['Subject'] = subject
[tab] msg['From'] = from_addr
[tab] msg['To'] = to_addr
[tab] msg['Date'] = formatdate()
[tab] return msg
[tab] pass

def send_via_gmail(from_addr, to_addr, msg):
[tab] s = smtplib.SMTP('smtp.gmail.com', 587)
[tab] s.ehlo()
[tab] s.starttls()
[tab] s.ehlo()
[tab] s.login('gmailのアドレス', 'gmailのパスワード')
[tab] s.sendmail(from_addr, [to_addr], msg.as_string())
[tab] s.close()

if __name__ == '__main__':
[tab] from_addr = 'gmailのアドレス'
[tab] to_addr = '送信先のアドレス'
[tab] title = 'タイトル'
[tab] body = 'メール本文(改行は \n を使う)'
[tab] msg = create_message(from_addr, to_addr, title, body)
[tab] send_via_gmail(from_addr, to_addr, msg)

下記のコマンドを実行すれば、Gmail経由で送信先のアドレス宛にメールが送信されるはずです。

$ chmod +x mail-1.py
$ ./mail-1.py


スクリプトの1行目にすでに指定してあるため、実行する際にpythonコマンドは不要です。

PNG画像を添付してGmail経由で送信する


同様に、下記の書式でスクリプトを作成し、拡張子.pyのファイル名(ここでは「mail-2.py」とします)を付けて保存します。変更する必要があるのは、赤字の部分だけです。
[修正:2010/04/22 23:50]
タブが抜けていました。[tab]の部分にタブを加えて下さい。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import smtplib
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage
from email.MIMEMultipart import MIMEMultipart
from email.Header import Header
from email.Utils import formatdate

def create_message(from_addr, to_addr, subject, body, encoding):
[tab] msg = MIMEMultipart()
[tab] msg['Subject'] = Header(subject, encoding)
[tab] msg['From'] = from_addr
[tab] msg['To'] = to_addr
[tab] msg['Date'] = formatdate()

[tab] related = MIMEMultipart('related')
[tab] alt = MIMEMultipart('alternative')
[tab] related.attach(alt)

[tab] content = MIMEText(body, 'plain', encoding)
[tab] alt.attach(content)

[tab] for filename in ['png画像のファイル名']:
# 複数のファイルを指定する場合は['ファイル1' , 'ファイル2' , …]の形にする。
[tab] fp = file('%s' % filename, 'rb')
[tab] img = MIMEImage(fp.read(), 'png', name=filename)
[tab] related.attach(img)

[tab] msg.attach(related)
[tab] return msg
[tab] pass

def send_via_gmail(from_addr, to_addr, msg):
[tab] s = smtplib.SMTP('smtp.gmail.com', 587)
[tab] s.ehlo()
[tab] s.starttls()
[tab] s.ehlo()
[tab] s.login('gmailのアドレス', 'gmailのパスワード')
[tab] s.sendmail(from_addr, [to_addr], msg.as_string())
[tab] s.close()

if __name__ == '__main__':
[tab] from_addr = 'gmailのアドレス'
[tab] to_addr = '送信先のアドレス'
[tab] title = 'タイトル'
[tab] body = 'メール本文(改行は \n を使う)'
[tab] msg = create_message(from_addr, to_addr, title, body, 'utf-8')
[tab] send_via_gmail(from_addr, to_addr, msg)

下記のコマンドを実行すれば、Gmail経由で送信先のアドレス宛に指定したPNG画像が添付された形でメールが送信されるはずです。

$ chmod +x mail-2.py
$ ./mail-2.py


同様に、スクリプトの1行目にすでに指定してあるため、実行する際にpythonコマンドは不要です。なお、添付する画像の指定をファイル名だけにした場合は、それらの画像をスクリプトと同じディレクトリに保存しておく必要があります(フルパスで指定した場合は、どこに置いても構わないと思いますけど)。

[参照記事1]
 うのうらぼ:Pythonでメールを送信したい人のためのサンプル集
[参照記事2]
 システム管理人:pythonでmailを送信