Pythonでメール配信を自動化する方法
メールの自動送信
毎日送信する必要があるレポートや、複数回送信する必要があるレポートについては、Pythonを使用してメール送信を自動化することを検討することができます。
メールボックスを使うための第一歩
一般に、QQメールボックス、163メールボックス、126メールボックスなど、よく使われるメールボックスを利用する場合、アカウントとパスワードを入力するだけでよい。しかし、携帯電話で企業向けメールボックスを利用する場合、一般的に設定が必要であり、通常の設定画面は以下のように表示されます。
<スパン ここでは、アカウントパスワードに加えて、サーバーリンクアドレスを入力する必要がありますが、これは各企業によって異なります。
<スパン メールの構成要素
以下の画像は、outlookでメールを送信する際のインターフェースで、主に送信者、受信者、cc、件名、本文、添付ファイルを含んでいます。これらは、典型的な電子メールの、より一般的な構成要素です。
<スパン メール送信方法
メールを送信する前に、まずサーバーに接続する必要があります。Pythonでは主にsmtplibモジュールを使ってサーバー接続とサーバー切断を確立します。
メールボックスによってサーバーリンクのアドレスが異なるため、使用するメールボックスに応じて対応するサーバーリンクを設定する必要があります。以下の表は、一般的なメールボックスに対応するサーバーリンクです。 リンクです。
<テーブル メールボックス サーバーアドレス Sinaメール smtp.sina.com 捜狐メール smtp.sohu.com 126メール smtp.126.com 139メール smtp.139.com 163 ネットイースメール smtp.163.com163メールボックスサーバーと接続する前に、163メールボックスにログインして認証設定を行う必要があり、認証コードは以下のように設定されています。
をクリックします。
datazoom_opts=opts.DataZoomOpts(range_start=10,range_end=30) becomes
datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside",range_start=10,range_end=30)]
認証が正常に設定された後、元のメールパスワードの代わりに認証コードを使用してPythonにログインできます。元のメールパスワードでログインすると、エラーが報告されます。
接続設定が完了すると、アカウントのパスワードでログインできるようになります。ログインに成功したら、メールの内容を編集し、編集終了後に送信をクリックし、送信終了後にサーバーとの接続を解除することが可能です。
以下は、メッセージを送信するための簡単なフローコードです。
import smtplib
smtp = smtplib.SMTP()
smtp.connect(host, port) # connect to the server
smtp.set_debuglevel(1) # Show interaction information
smtp.login(username, password) # login to mailbox
smtp.sendmail(sender, receiver, msg.as_string()) # send mail
smtp.quit() # Disconnect
正式な電子メールを送信する
次の例は、163のメールを例として、メールを送信するための完全なPythonコードを示しています。
import smtplib
from email.mime.multipart import MIMEMultipart
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.application import MIMEApplication
#Sender's email
asender="[email protected]"
#recipient mailboxes
areceiver="[email protected]"
#Copier email
acc = '[email protected]'
#email subject
asubject = 'This is a test email'
#sender_address
from_addr = "[email protected]"
#email password (authorization code)
password = "123data"
#email settings
msg = MIMEMultipart()
msg['Subject'] = asubject
msg['to'] = areceiver
msg['Cc'] = acc
msg['from'] = "Zhang Junhong"
# email body
body = "Hello, this is a test email"
# Add the body of the message:
msg.attach(MIMEText(body, 'plain', 'utf-8'))
#Add attachment
#Note that the file path here is a slash
xlsxpart = MIMEApplication(open('C:/Users/zhangjunhong/Desktop/This is an attachment.xlsx', 'rb').read())
xlsxpart.add_header('Content-Disposition', 'attachment', filename='This is an attachment.xlsx')
msg.attach(xlsxpart)
# Set the email server address and port
smtp_server = "smtp.163.com"
server = smtplib.SMTP(smtp_server, 25)
server.set_debuglevel(1)
#login mailbox
server.login(from_addr, password)
#Send mail
server.sendmail(from_addr, areceiver.split(',')+acc.split(','), msg.as_string())
# Disconnect the server
server.quit()
最終的にはこのようになります。
メールの自動送信については、時間指定配信、本文にhtmlコンテンツを表示するなど、より高度なものもあります。興味があれば、ウェブで検索して学んでみてください。
メールの一括送信
複数のメールを同時に送信する必要がある場合、受信者をテーブルに整理して、一つずつ反復して送信することができます。
例えば、営業部の数百人の営業マンに今月の各タスクを送る必要があります。メールの件名は「xxxタスク詳細」、本文のアドレスは対応する受信者に変更し、添付ファイルにはタスクの詳細を追加して直属の上司にコピーする必要があります。
上記のニーズから、以下のような受信者情報関連フォームdfをまとめました。
<テーブル 名称 受取人 Cc チャン・ジュンホン1 [email protected] [email protected] チャン・ジュンホン2 [email protected] [email protected]このdfテーブルのメッセージを繰り返し処理するforループを書くだけで、次のようなコードの実装で、メッセージを別々に送信することができます。
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.application import MIMEApplication
host = "smtp.163.com"
port = 25
username = "[email protected]"
password = "123zjh"
smtp = smtplib.SMTP() # declare a link object
smtp.connect(host, port) # connect to the server
smtp.set_debuglevel(1) # show interaction information
smtp.login(username, password) # login to mailbox
sender = username
for i in zip(df["name"],df["recipient"],df["cc"]):
receiver = i[1] # Recipient
acc = i[2] # cc's
msg = MIMEMultipart() # declare a mail object
msg['from'] = username #sender
msg['to'] = receiver#receiver
msg['Cc'] = acc #Copier
msg['Subject'] = i[0] + "Task Details" # subject
# Write the body
text = MIMEText(i[0] + "Hello, this is your task details for this month",'plain', 'utf-8')
msg.attach(text)
# Add form attachment
f = open('C:/Users/zhangjunhong/Desktop/Task Details/' + i[0] + '.xlsx', 'rb').read()
filepart = MIMEApplication(f)
filepart.add_header('Content-Disposition','attachment',filename=i[0] + 'task-detail.xlsx') # add a title for the attachment
msg.attach(filepart)
smtp.sendmail(sender, receiver.split(',') + acc.split(','), msg.as_string()) # send mail
smtp.quit() # disconnect
上記のコードを実行することで、フォームdfの全員に一度にメールを送信する必要性を達成することができます。
以上、Pythonでメール送信を自動化する方法について詳しく説明しました。Pythonでのメール送信の詳細については、スクリプトハウスの他の関連記事をご参照ください
関連
-
RuntimeWarning: invalid value encountered in double_scalars in python の解決策です。
-
PythonをベースにしたMUIタイトルバーの最適化
-
[解決済み] pythonでjsonオブジェクトを読み込む方法 [重複]。
-
[解決済み] Pandas read_csv low_memory と dtype オプション。
-
[解決済み] Python AttributeError: 'module' オブジェクトに 'Serial' 属性がない [重複] 。
-
[解決済み] pandas dataframeの無名カラムを削除する [重複]。
-
[解決済み] jinja2 テンプレートでリストの長さを取得する
-
[解決済み] フロート値が整数であるかどうかを確認する方法
-
[解決済み] Pythonでvirtualenvの名前を変更する方法は?
-
Pythonのリクエストで "Max retries exceeded with url "というエラーが発生する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】TypeError: strのデコードはサポートされていません。
-
Pythonエラー集です。IndexError: スカラー変数へのインデックスが無効です。
-
[解決済み] matplotlib: RuntimeError: Python はフレームワークとしてインストールされていません
-
[解決済み] pip の `--no-cache-dir` は何のためにあるのですか?
-
[解決済み] この Python のエラーを修正するにはどうすればよいですか?OverflowError: float infinity を整数に変換できない。
-
[解決済み] "TypeError: int() 引数は 'NoneType' ではなく、文字列、バイト型オブジェクト、または数値でなければならない" を修正する方法
-
[解決済み] dict_keys' オブジェクトを取得すると、リストへのキャストにもかかわらずインデックスがサポートされない
-
AttributeErrorについて: 'numpy.ndarray' オブジェクトには 'index' という属性がありません。
-
python オブジェクトには '__getitem__' という属性がありません。