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環境にアップしております。
下記からダウンロードいただけます。