[Python] メール(smtplib)を送信する方法


Devlopment note / Python    作成日付 : 2020/07/27 18:38:43   修正日付 : 2020/07/27 18:38:43

こんにちは。明月です。


この投稿はPythonでメール(smtplib)を送信する方法に関する説明です。


プログラムのプロジェクト中でメール発送することに関するプログラム作成がすごくあると思います。例えば、ウェブサービスで会員加入認証やパスワード再設定、様々なアラムオプション、お知らせなどがあると思います。

ウェブサービスではなくてもローカルでは大量広告メール(spam)もあるし、スケジュールアラムもあります。

そのため、どんなプログラムでもメールに関するモジュールは大事だと思います。


Pythonでメールライブラリを使うためにはメールプロトコールに関しても少し知らなければならないです。

メールプロトコールはSMTP(Simple Mail Transfer Protocol)を使いますが、これがテルネット方式になっているしHELO、MAIL、RCPT、DATAのコマンドで通信します。

私の説明よりウィキによく説明されているのでご参考をお願いします。

link - https://ja.wikipedia.org/wiki/


Pythonでメールを発送する前にメールサーバー設定が必要です。

Google mail - https://support.google.com/

私の場合はGoogleのメールをよく使います。

先にクロムに接続して右上のアカウントの管理に行きます。


アカウント管理に移動して安全性の低いアプリのアクセスのタブに移動します。


安全性の低いアプリの許可を有効にします。


このチェックをしないと外部からグーグルメールを使用できないようにすることです。なので、idやpwの漏れがなければそんなに問題はありません。


Pythonでソースを作成してメールを発送しましょう。

# メールモジュール
import smtplib
# メールメッセージを作成するモジュール(MIMEBaseは以下のMIMEMultipart、MIMEText、MIMEApplication、MIMEImage、MIMEAudio)の親モジュール
# 別に宣言する必要はない。
#from email.mime.base import MIMEBase
# メールのData領域のメッセージを作成するモジュール(MIMEText、MIMEApplication、MIMEImage、MIMEAudioがattachなればバウンダリータイプに変換)
from email.mime.multipart import MIMEMultipart
# メールの本文内容を作成するモジュール
from email.mime.text import MIMEText
# メールの添付ファイルをbase64タイプに変換
from email.mime.application import MIMEApplication
# メールのイメージファイルをbase64タイプに変換(Content-ID生成)
from email.mime.image import MIMEImage
# メールの音楽ファイルをbase64タイプに変換(Content-ID生成)
from email.mime.audio import MIMEAudio
# ファイルIOモジュール
import io

# メールサーバと通信する前にメッセージを作成する。
data = MIMEMultipart()
# 送信者設定
data['From'] = "nowonbun@gmail.com"
# 受信者設定(複数はコンマ区切り)
data['To'] = "nowonbun@gmail.com,nowonbun@gmail.com"
# CC受信者設定
data['Cc'] = "nowonbun@gmail.com"
# BCC受信者設定
data['Bcc'] = "nowonbun@gmail.com"
# メールタイトル設定
data['Subject'] = "Test Mail"

# 添付ファイル追加
with open("test.xlsx", "rb") as fp:
  # Nameはメール受信者で設定するファイル名
  part = MIMEApplication(fp.read(), Name = "test.xlsx")
  # Data領域のメッセージバウンダリー追加
  data.attach(part)

# イメージファイル追加
with open("capture.png", 'rb') as fp:
  # Nameはメール受信者で設定するファイル名
  img = MIMEImage(fp.read(), Name = "capture.png")
  # ヘッダーでContent-ID追加(本文内容でcidにリンクをかけられる。)
  img.add_header('Content-ID', '
    
     ')
  # Data領域のメッセージにバウンダリー追加
  data.attach(img)

# テキストタイプの本文内容
#msg = MIMEText("Hello world", 'plain')
# Html形式の本文内容(cidでもう添付ファイルをリンクする。)
msg = MIMEText("Hello Test
     
", 'html') # Data領域のメッセージにバウンダリー追加 data.attach(msg) # メッセージを確認 print(data) # メールサーバとtelnet通信開始 server = smtplib.SMTP_SSL('smtp.gmail.com',465) #server = smtplib.SMTP('smtp.gmail.com',587) # メール通信時にデバッグ server.set_debuglevel(1) # ハローを一回しましょう。(意味なし) server.ehlo() # tls設定 - tls 587 ポートの場合 #server.starttls() # ハローしましょう。 server.ehlo() # ログインする。 server.login("id", "password") # ハローしましょう。 server.ehlo() # MAIL(送信者)設定 sender = data['From'] # RCPT(受信者)、リストタイプに送信 # 受信者追加 receiver = data['To'].split(",") # CC受信者追加 if data['Cc'] is not None: receiver += data['Cc'].split(",") # BCC受信者追加 if data['Bcc'] is not None: receiver += data['Bcc'].split(",") # メールプロトコール上MAIL、RCPT、DATA順でメッセージを送信しなければならないが、sendmail関数で自動送信 server.sendmail(sender, receiver, data.as_string()) # QUITを送信して接続を終了。 server.quit()

作成が終わったら実行しましょう。



実行すれば上みたいにバウンダリーが作成されたことを確認できます。


メールがよく発送されたことを確認できます。

link - https://docs.python.org/3/library/smtplib.html

link - https://docs.python.org/3.4/library/email-examples.html

link - https://stackoverflow.com/questions/17759860/


ここまでPythonでメール(smtplib)を送信する方法に関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

最新投稿