PythonでGmailを送るツールを作ろうと思い、色々調べたのでメモ。
Gmailに限らず、標準パッケージを使った基本的なメール送信手順は以下の通りです。
ここで、MIMEってなんだっけ?となったので、合わせて調べてました。
Multipurpose Internet Mail Extension(多目的インターネットメール拡張)の略。
当初、Eメールの文字コードは英数字といくつかの記号を表現する7bitの「US-ASCII」しか利用できず、英語以外の文章やテキスト以外のデータの送受信ができませんでした。
そこで新たなヘッダ情報を追加し、「US-ASCII」以外のデータも扱えるようにした規格がMIME。
MIMEにより追加されるヘッダは以下の通りです。
GmailのWebクライアントで文章のみのメールを送り、ソースを見たところMIMEのヘッダは以下のように設定されていました。
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64
上記を踏まえたコードを書いてみます。Pythonは3.4.2です。
MIMETextでencoding='utf-8'を指定すると、Content-Transfer-Encodingもbase64に設定されます。
また、 formatdateはデフォルトではUTCで生成されてしまいます。
localtime=Trueを指定することで、現地時間(日本の場合はUTC+9)になります。
Gmailに限らず、標準パッケージを使った基本的なメール送信手順は以下の通りです。
- emailパッケージを使ってMIME文書を作成
- 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 件のコメント:
コメントを投稿