1. ホーム
  2. スクリプト・コラム
  3. パイソン

Pythonでメール配信を自動化する方法

2022-01-25 08:56:14

メールの自動送信

毎日送信する必要があるレポートや、複数回送信する必要があるレポートについては、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.com

163メールボックスサーバーと接続する前に、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でのメール送信の詳細については、スクリプトハウスの他の関連記事をご参照ください