ページ

2015年3月22日日曜日

PythonでGmailを送る

PythonでGmailを送るツールを作ろうと思い、色々調べたのでメモ。

Gmailに限らず、標準パッケージを使った基本的なメール送信手順は以下の通りです。

  1. emailパッケージを使ってMIME文書を作成
  2. smtplibを使って送信

ここで、MIMEってなんだっけ?となったので、合わせて調べてました。

MIMEとは


Multipurpose Internet Mail Extension(多目的インターネットメール拡張)の略。

当初、Eメールの文字コードは英数字といくつかの記号を表現する7bitの「US-ASCII」しか利用できず、英語以外の文章やテキスト以外のデータの送受信ができませんでした。

そこで新たなヘッダ情報を追加し、「US-ASCII」以外のデータも扱えるようにした規格がMIME。

MIMEにより追加されるヘッダは以下の通りです。

  • MIME-Version:MIMEであることを示すヘッダ。現在は1.0のみ利用される。
  • Content-Type:メッセージ中のデータタイプの指定。text、imageなど。
  • Content-Transfer-Encoding:データの符号化方法の指定。7bit、base64など。

Gmailの場合


GmailのWebクライアントで文章のみのメールを送り、ソースを見たところMIMEのヘッダは以下のように設定されていました。

MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

ソースコード


上記を踏まえたコードを書いてみます。Pythonは3.4.2です。

from email.mime.text import MIMEText
from email.header import Header
from email.utils import formatdate
from smtplib import SMTP_SSL


def create_message(from_addr, to_addrs, subject, body, encoding='utf-8'):
    msg = MIMEText(body, 'plain', encoding)
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = from_addr
    msg['To'] = ','.join(to_addrs)
    msg['Date'] = formatdate(localtime=True)
    return msg


def send_via_gmail(from_addr, to_addrs, password, msg):
    s = SMTP_SSL('smtp.gmail.com', 465)
    s.login(from_addr, password)
    s.sendmail(from_addr, to_addrs, msg.as_string())
    s.close()


if __name__ == '__main__':
    from_addr = 'spam@gmail.com'
    to_addrs = ['egg1@gmail.com', 'egg2@gmail.com']
    subject = 'test subject'
    body = 'test body'
    password = 'password'

    msg = create_message(from_addr, to_addrs, subject, body)
    send_via_gmail(from_addr, to_addrs, password, msg)

MIMETextでencoding='utf-8'を指定すると、Content-Transfer-Encodingもbase64に設定されます。

また、 formatdateはデフォルトではUTCで生成されてしまいます。
localtime=Trueを指定することで、現地時間(日本の場合はUTC+9)になります。

参考

0 件のコメント:

コメントを投稿