稼働中

(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メールで確認しました。無事に届いているようです。
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メールで確認しました。無事に届いているようです。
日本語の件名、本文も正しく表示されています。
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を使うと送信に日本語が使えるようです。