ゴミ箱の中のメモ帳

まだ見ぬ息子たちへ綴る手記

Pythonでメールを送信する(SMTP)

前の記事に「Pythonでメールを受信する(POP)」としてPythonでメールを受信するサンプルを書いたが、次に今回は送信する方法を書く。

送信は受信とは違い、相手の環境に合わせた文字コードの変換処理などが必要ないため非常に簡単に書ける。一点アホほど詰まったことがあるが、それは次の記事にする。

初めてのPython 第3版

初めてのPython 第3版


いつものように書いたサンプルコードは記事下部に貼り付けておく。

日本語メールは本来「ISO-2022-JP」でやりとりするが、最近はUTF-8を理解するメーラが標準であるかと思うのでUTF-8にてメールを送信することにする。そうすればエンコード処理なども必要なく、送信側も受信側も単純なコードで済むようになる。

このサンプルはメールサーバの認証方式に左右されるので環境によっては動かないかもしれない。lolipopのメールサーバで動作を確認した。

#!/usr/bin/python
# coding: UTF-8

import email
import smtplib

cfg = {
    "smtp_server": 'YOUR_SMTP_SERVER',
    "user_name": 'YOUR_SMTP_SERVER_ACCOUNT',
    "password": 'YOUR_SMTP_SERVER_PASSWORD',
    "smtp_port": 587,
}


def send_mail( cfg, from_addr, to_addr, subject, body, encode="utf-8"):
    def create_message( from_addr, to_addr, subject, body, encode):
        message = email.MIMEText.MIMEText( body, "plain", encode)
        message["Date"] = email.Utils.formatdate()
        message["Subject"] = email.Header.Header( subject, encode)
        message["From"] = from_addr
        message["To"] = to_addr
        return message

    def send( from_addr, to_addr, message):
        smtp = smtplib.SMTP( cfg["smtp_server"], cfg["smtp_port"])
        smtp.login( cfg["user_name"], cfg["password"])
        smtp.sendmail( from_addr, [ to_addr,], message.as_string())
        smtp.close()

    message = create_message( from_addr, to_addr, subject, body, encode)
    send( from_addr, to_addr, message)

send_mail( cfg, "from@example.jp", "to@example.jp", "こんにちわ", "本文だよ")

初めてのPython 第3版

初めてのPython 第3版

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)

エキスパートPythonプログラミング

エキスパートPythonプログラミング

Pythonプロフェッショナルプログラミング

Pythonプロフェッショナルプログラミング