学習めも。

Python、Anaconda学習中🔰 ブログ引っ越ししました😄よろしくお願いします!https://noeiganolife.com/

記録用🔰

プログラミング以外の記事はこちら

メールで送るメッセージを作成する

メッセージ作成に必要なモジュールのインポート

以下のモジュールをインポート!
これらのモジュールは標準ライブラリにあるので、インストールの必要はない

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

メッセージの作成

# メッセージの作成方法
msg = MIMEMultipart()
# 件名、メールアドレス
msg["Subject"] = "件名"
msg["From"] = "自分のメールアドレス(送信元)"
msg["To"] = "相手のメールアドレス(送信先)"

# メール本文
body = MIMEText(本文のテキスト)
msg.attach(body)

# 添付ファイル
attach_file = MIMEApprication(PDFファイルから読み込んだデータ)
attach_file.add_header("Content-Disposition","attachment",filename="PDFファイル名")
msg.attach(attach_file)

このように作成したメッセージ(変数msg)をserver.send_message(msg)により送信する
※やり方はこちら yoji.hateblo.jp

送信の控えをとっておく方法

Outlookなどのメールソフトから送信すると「送信済み」フォルダーに追加されるが、Pythonプログラムから創始した場合は控えが残らないため、BCCを送信することで送信の控えにすることができる。
社内共有のアドレスなどに送信すると、お互いにチェックもできるので便利

msg["Bcc"] = "控え用のメールアドレス"

メール本文をファイルから読み込む

メール本文はテキスト保存しておき、そこから読み込んでメールメッセージに追加する
なお、メモ帳やテキストエディタで作成し、文字コードUTF-8で保存したものを使用する。
Windowsは初期設定の文字コードUTF-8に設定されているので、いつも通りテキストを書いて保存するだけでよい
Macの場合は、テキストエディットで「フォーマット」ー「標準テキストにする」を選択するとテキストファイルを作成できる。保存するときは、文字コードを意味する「エンコーディング」をUnicodeUTF-8)にすること

メール本文

(メール本文:mail_body.txt)

{company} {department}
{person} 様

いつも大変お世話になっております。
株式会社エクセルパイソンの田中です。

7月分のご請求書をPDFファイルにて、
本メールに添付させていただきました。
何卒ご査収のほどお願い申し上げます。

ご不明な点等がございましたら、
お問い合わせいただけたら幸いです。

今後とも宜しくお願い申し上げます。

*********************
株式会社エクセルパイソン
営業本部 田中一郎

TEL. 00-0000-0000
FAX. 00-0000-0000
*********************

メール本文のうち、波括弧で囲んだ部分を会社名などに置き換えるには、format()を利用する
まずopen()で開き、read()でファイルの中の全文を読み込む
読み込んだな用をbody_tempで代入したら、ファイルをclose()で閉じる
(read_mail_body.py)

# メール本文をファイルから読み込む
f = open("mail_body.txt", encoding="utf-8")
body_temp = f.read()
f.close()

# メール本文の波かっこの部分を置き換える
body_text = body_temp.format(
    company="株式会社鈴木商店",
    department="調達部第1課",
    person="平松真一"
)

print(body_text)

▼結果 f:id:Moriane:20220413073601p:plain

メール本文をメッセージデータに追加する

body = MIMEText(body_text)
msg.attach(body)

※メール本文はMIMEText() のかっこの中に入れて、メール本文用のデータにしてbodyに代入する。
※それをメッセージデータのmsgにattach()で追加

メールにPDFファイルを添付

メールに添付するには、binaryという形式(コンピュータが直接処理できる形式のデータ)でファイルを読み取り、そのデータをメッセージに追加。
※コンピュータが扱うデータのうち人間が読んで理解できるものをテキスト形式、それ以外をバイナリ形式と呼ぶ。PDF以外にも画像や音声などはバイナリ形式で書き込まれる

binaryファイルを読み込むには、open()の括弧の中で「mode="rb"」を指定(rbはread binary)。
read()でファイルの中の全データを読み込み、pdf_dataに代入してファイルをcloseで閉じる。
▼PDFファイルのデータ読み込み方法

pdf = open(PDFファイルのパス, mode="rb")
pdf_data = pdf.read()
pdf.close()

・ファイルから読み込んだデータは、MIMEAppliation()の括弧の中に入れて、添付ファイルを作成。
⇨そこに受診した側が添付ファイルであることがわかるように、add_header()でヘッダーという情報を加える
・ヘッダーContent -Dispositionの値を添付ファイルを表すattachmentにして、さらにfilename = "PDFファイル名"により受信側で保存するといのデフォルトのファイル名を指定
・メッセージ添付するには、メール本文と同様にattach()を用いる

#データから添付ファイルを作成
attach_file = MIMEApplication(pdf_data)
#ヘッダーの追加
attach_file.add_header("Content-Disposition", "attachment", filename="PDFファイル名")
#添付ファイルの添付
msg.attach(attach_file)

「自分宛て」にテスト送信

ここまでの内容を組み合わせて、送信するプログラムファイルと同じフォルダに添付ファイルを入れて最後に「SMTPサーバに接続」してメッセージ送信する。

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

# 自分のメールアドレス
my_address = "自分のメールアドレス"

# SMTPサーバー(今回はGmailで送信)
smtp_server = "smtp.gmail.com"
port_number = 587

# ログイン情報(今回はGmailのアカウントを入力する)
account = "自分のメールのアカウント"
password = "自分のメールのパスワード"

# メッセージの準備
msg = MIMEMultipart()

# 件名、メールアドレスの設定
msg["Subject"] = "ご請求書送付のご案内[株式会社エクセルパイソン]"
msg["From"] = my_address
msg["To"] = my_address

# メール本文の追加
text = open("mail_body.txt", encoding="utf-8")
body_temp = text.read()
text.close()
body_text = body_temp.format(
    company="株式会社鈴木商店",
    department="調達部第1課",
    person="平松真一"
)
body = MIMEText(body_text)
msg.attach(body)

# 添付ファイルの追加
pdf = open("C0001.pdf", mode="rb")
pdf_data = pdf.read()
pdf.close()
attach_file = MIMEApplication(pdf_data)
attach_file.add_header("Content-Disposition","attachment",filename="C0001.pdf")
msg.attach(attach_file)

# SMTPサーバーに接続
server = smtplib.SMTP(smtp_server, port_number)
server.starttls()
server.login(account, password)

# メール送信
server.send_message(msg)

# SMTPサーバーとの接続を閉じる
server.quit()

実行すると自分宛てにメールが届いているのが確認できる
SMTPサーバーに接続してログインするまでに、数秒かかることがある
▼届いた!(やったね😂) f:id:Moriane:20220413081412p:plain

次は

次はメールの自動送信について学びます!

参考文献