(v_11)Python メールの送信 smtplib
smtplib EmailMessage
Pythonでいろいろ試してみたことを記載しています。※開発環境はThonnyを使用しています。
smtplibモジュールのclass smtplib.SMTP_SSLを使ってメールの送信を試しました。
class smtplib.SMTP_SSL
sendmailで送信します。
スクリプト例です。
m_smtp_02b.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import smtplib #smtplibモジュールをインポート
#使用している送信メールサーバーの情報を設定します。
host='smtp.***.**.jp' # 送信メールサーバー
user='*****@*****.ne.jp' # ユーザーアカウント
password='******' # パスワード
#差出先、宛先、件名、本文を以下で設定しています。
from_addr='*****@*****.ne.jp' #差出アドレス
to_addrs ='*****@*****.ne.jp' #宛先アドレス
sub_ject='TEST send mail' #件名
message='What are you doing?' #本文
# message
msg=("Subject: %s\r\nFrom: %s\r\nTo: %s\r\n\r\n" %(sub_ject,from_addr,to_addrs))
msg=msg+message # 件名や宛先などまとめた送信データ
print(msg) #ThonnyのShellに表示されます
# sendmail messageを送信します
server =smtplib.SMTP_SSL(host, port=465, timeout=1) #初期化
server.login(user, password) #ログイン
server.sendmail(from_addr, to_addrs, msg) #メールを送信
server.quit() #接続を閉じます。
実行結果
>>> %Run m_smtp_02b.py
Subject: TEST send mail
From: *****@*****.ne.jp
To: *****@*****.ne.jp
What are you doing?
記事(v_08)のm_imap_02b.pyで件名と差出人を確認しました。無事に届いているようです。
WEBメールで確認しました。無事に届いているようです。
ちなみに本文にmessage=’どうしてる?’ 日本語を使うとUnicodeEncodeErrorになりました。
このままでは日本語は送信できないようです。
EmailMessage
EmailMessageを使って送信データを成形して、send_messageで送信します。
Content-Typeなど送信データに入れ込んでくれるようです。
スクリプト例です。
差出先、宛先、件名など辞書形式でデータを設定します。
m_smtp_03b.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import smtplib
from email.message import EmailMessage
#使用している送信メールサーバーの情報を設定します。
host='smtp.***.**.jp' # 送信メールサーバー
user='*****@*****.ne.jp' # ユーザーアカウント
password='******' # パスワード
# EmailMessage
msg = EmailMessage() #初期化
# 辞書形式でデータを設定します。
msg["Subject"]='メール送信テスト' #件名
msg["To"]='*****@*****.ne.jp' #宛先アドレス
msg["From"]='*****@*****.ne.jp' #差出アドレス
#message = "メール本文"
message = 'どうしてる?' #本文
# set_content(*args, content_manager=None, **kw)
msg.set_content(message) #content-typeを返します
print(msg) #結果はThonnyのShellに表示
# send messageを送信します
server =smtplib.SMTP_SSL(host, port=465, timeout=1) #初期化
server.login(user, password) #ログイン
server.send_message(msg) #メールを送信
server.quit() #接続を閉じます。
実行結果です。
msgの内容はThonnyのShellに表示されます。
Contentが設定されて送られます。
日本語でもエラーは出ませんでした。base64でエンコードされて送られたようです。
>>> %Run m_smtp_03b.py
Subject: メール送信テスト
To: tama5go@clock.ocn.ne.jp
From: toyonor@peace.ocn.ne.jp
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
MIME-Version: 1.0
44Gp44GG44GX44Gm44KL77yfCg==
本文’どうしてる?’の送信データをThonnyのShellで確認してみます。
charset=”utf-8″なので文字を”utf-8″でエンコードします。
Transfer-Encoding: base64なので、そのデータをbase64でエンコードします。以下のように確認できました。
>>> import base64
>>> a='どうしてる?'
>>> b=a.encode('utf-8') #charset="utf-8"
>>> base64.b64encode(b) #Transfer-Encoding: base64
b'44Gp44GG44GX44Gm44KL77yf'
送信データはb’Cg==’が付加されているようです。
逆に本文のデータを確認してみます。
>>> import base64
>>> a=b'44Gp44GG44GX44Gm44KL77yfCg=='
>>> b=base64.b64decode(a)
>>> b.decode('utf-8')
'どうしてる?\n'
付加されたb’Cg==’は改行記号の\nだったようです。
WEBメールで確認しました。無事に届いているようです。
日本語の件名、本文も正しく表示されています。
ヘッダーと本文を表示してみると以下のようになっていました。
日本語の件名はMIME形式になっているようです。※記事(v_08)を参照ください。
Subject: =?utf-8?b?44Oh44O844Or6YCB5L+h44OG44K544OI?=
文字コードがuft-8、エンコードがbase64、文字データが44Oh44O844Or6YCB5L+h44OG44K544OI?=です。
データのデーコードを確認してみました。
>>> import base64
>>> a=b'44Oh44O844Or6YCB5L+h44OG44K544OI?='
>>> b=base64.b64decode(a)
>>> b.decode('utf-8')
'メール送信テスト'
まとめ
smtplibモジュールを使って、メールの送信を確認しました。EmailMessageを使うと送信に日本語が使えるようです。