【Python】メール送信をしてみよう!

Pythonロゴ

Pythonにはメールの送受信を扱うモジュールが用意されています。
今回は emailとsmtplib モジュールを使用してメール送信を試してみます。

SMTPとは?

SMTPはSimple Mail Transfer Protocolの略称になります。
SMTPは電子メールを送信する際に利用するプロトコルになります。
メールソフトからメール送信をするとSMTPの通信を利用してサーバにメールが送られ宛先に送信されます。
通信ポートはSMTPは25番、サブミッションは587番, SMTPSは465番を利用します。

基本の操作

通常通信(25)によるメール送信

SMTPの25番ポートを利用してメール送信を行います。
近年スパムメール対策でOP25Bが設定されている事が多く受信拒否される場合があります。サブミッションまたはSMTPSを使った通信をおすすめいたします。

from email import message
import smtplib

smtp_host = 'メールサーバのホスト名'
smtp_port = 25
smtp_account_id = '送信メールのアカウントID'
smtp_account_pass = '送信メールのアカウントパスワード'

from_mail = '送信メールアドレス'
to_mail = '送り先メールアドレス'

msg = message.EmailMessage()
msg.set_content('メール本文を入力');
msg['Subject'] = '件名を入力'
msg['From'] = from_mail
msg['To'] = to_mail

server = smtplib.SMTP(smtp_host, smtp_port, timeout=10)
server.login(smtp_account_id, smtp_account_pass)
server.send_message(msg)
server.quit()

サブミッション通信(587)によるメール送信

サブミッションの587番ポートを利用してメール送信を行います。
OP25B対策からSMTPの25番ポートをブロックされる事があります。
上記対策としてサブミッションポートが利用されます。

参考プログラムではポート番号が587に変更されている点と、ehloとstarttlsが追加されています。

from email import message
import smtplib

smtp_host = 'メールサーバのホスト名'
smtp_port = 587
smtp_account_id = '送信メールのアカウントID'
smtp_account_pass = '送信メールのアカウントパスワード'

from_mail = '送信メールアドレス'
to_mail = '送り先メールアドレス'

msg = message.EmailMessage()
msg.set_content('メール本文を入力');
msg['Subject'] = '件名を入力'
msg['From'] = from_mail
msg['To'] = to_mail

server = smtplib.SMTP(smtp_host, smtp_port, timeout=10)
server.ehlo()
server.starttls()
server.ehlo()
server.login(smtp_account_id, smtp_account_pass)
server.send_message(msg)
server.quit()

SSL/TLS暗号化通信(465)によるメール送信

SSL/TLS暗号化通信の465番ポートを利用してメール送信を行います。
暗号化通信を行うとメールの安全性が高まり受け取り側の安心にもつながります。暗号化通信はメールサーバに証明書の設定が必要のため事前に使えるか確認が必要です。

参考プログラムではポート番号が465に変更されている点と、SSLに関する設定が追加されています。

from email import message
import smtplib
import ssl

smtp_host = 'メールサーバのホスト名'
smtp_port = 465
smtp_account_id = '送信メールのアカウントID'
smtp_account_pass = '送信メールのアカウントパスワード'

from_mail = '送信メールアドレス'
to_mail = '送り先メールアドレス'

msg = message.EmailMessage()
msg.set_content('メール本文を入力');
msg['Subject'] = '件名を入力'
msg['From'] = from_mail
msg['To'] = to_mail

context = ssl.create_default_context()
server = smtplib.SMTP_SSL(smtp_host, smtp_port, timeout=10, context=context)
server.login(smtp_account_id, smtp_account_pass)
server.send_message(msg)
server.quit()

ファイルを添付する

メールを送信する際、明細書や画像などファイルを添付することがあります。
下記手順にてファイルを添付することができます。

from email import message
from email.mime import multipart
from email.mime import text
import smtplib
import ssl

smtp_host = 'メールサーバのホスト名'
smtp_port = 465
smtp_account_id = '送信メールのアカウントID'
smtp_account_pass = '送信メールのアカウントパスワード'

from_mail = '送信メールアドレス'
to_mail = '送り先メールアドレス'

msg = multipart.MIMEMultipart()
msg['Subject'] = '件名を入力'
msg['From'] = from_mail
msg['To'] = to_mail
msg.attach(text.MIMEText('メール本文を入力', 'plain', 'utf-8'))

# 添付ファイルの設定
with open('添付ファイルパス', 'r') as fp:
    attach_file = text.MIMEText(fp.read(), 'plain')
    attach_file.add_header(
        "Content-Disposition", 
        "attachment", 
        filename='添付ファイル名'
    )
    msg.attach(attach_file)

context = ssl.create_default_context()
server = smtplib.SMTP_SSL(smtp_host, smtp_port, timeout=10, context=context)
server.login(smtp_account_id, smtp_account_pass)
server.send_message(msg)
server.quit()

CC, BCCを設定する

メールを送信する際、CCとBCCの設定は下記のようになります。
カンマ(,)区切りで設定する事で複数の宛先に送ることができます。

msg = message.EmailMessage()
msg.set_content('メール本文を入力');
msg['Subject'] = '件名を入力'
msg['From'] = from_mail
msg['To'] = to_mail
msg['Cc'] = 'CCのメールアドレス'
msg['Bcc'] = 'BCCのメールアドレス1,BCCのメールアドレス2'

サンプルプログラム

こちらの記事で作成したプログラムはGitHub環境にアップしております。
下記からダウンロードいただけます。

参考 mail.py スクリプトGitHub python-beginner 参考 mail_file.py スクリプトGitHub python-beginner