Python如何實現(xiàn)自動發(fā)送郵件
自動發(fā)送郵件
我們把報表做出來以后一般都是需要發(fā)給別人查看,對于一些每天需要發(fā)的報表或者是需要一次發(fā)送多份的報表,這個時候可以考慮借助Python來自動發(fā)送郵件。
使用郵箱的第一步
一般我們在使用QQ郵箱、163郵箱、126郵箱等這些比較常用的郵箱時,只需要輸入賬號和密碼就可以。但是在使用手機端的企業(yè)郵箱的時候,一般都需要配置一下,常規(guī)的配置界面如下所示:

就是除了在輸入賬號密碼以外,還需要輸入一個服務(wù)器鏈接地址,這個地址每個公司都會不太一樣。
一份郵件的組成
下圖是outlook中發(fā)送一份郵件的界面,主要包含發(fā)件人、收件人、抄送人、主題、正文、附件這幾部分。這也是一般郵件比較通用的組成部分。

如何發(fā)送郵件
在發(fā)送郵件之前首先需要與服務(wù)器進行連接,在Python中主要利用smtplib模塊來建立服務(wù)器連接接、服務(wù)器斷開的工作。
不同郵箱的服務(wù)器鏈接地址不一樣,大家根據(jù)自己使用的郵箱設(shè)置相應(yīng)的服務(wù)器鏈接。下表為常見郵箱對應(yīng)的服務(wù)器鏈接:
| 郵箱 | 服務(wù)器地址 |
|---|---|
| 新浪郵箱 | smtp.sina.com |
| 搜狐郵箱 | smtp.sohu.com |
| 126郵箱 | smtp.126.com |
| 139郵箱 | smtp.139.com |
| 163網(wǎng)易郵箱 | smtp.163.com |
在與163郵箱服務(wù)器進行連接之前,需要先登陸自己的163郵箱進行授權(quán)設(shè)置,授權(quán)碼設(shè)置如下:

點擊設(shè)置中的POP3/SMTP/IMAP,勾選SMTP服務(wù),根據(jù)提是進行授權(quán)碼設(shè)置,設(shè)置授權(quán)成功后,在Python中利用授權(quán)碼進行登陸,而不是你本來的郵箱密碼,如果使用本來的郵箱密碼登陸,會報錯。
連接設(shè)置好以后就可以使用賬戶密碼進行登錄了,登錄成功以后就可以對郵件內(nèi)容進行編輯,編輯完成以后就可以點擊發(fā)送了,發(fā)送完成后斷開服務(wù)器鏈接。
如下展示了發(fā)送一份郵件的簡短流程代碼:
import smtplib smtp = smtplib.SMTP() smtp.connect(host, port) # 與服務(wù)器進行連接 smtp.set_debuglevel(1) #顯示出交互信息 smtp.login(username, password) # 登陸郵箱 smtp.sendmail(sender, receiver, msg.as_string()) # 發(fā)送郵件 smtp.quit() # 斷開連接
正式發(fā)送一份郵件
如下以163郵箱為例,展示了發(fā)送一份郵件完整的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
#發(fā)件人郵箱
asender="zhangjunhongdata@163.com"
#收件人郵箱
areceiver="zhangjunhong@163.com"
#抄送人郵箱
acc = 'zhangjunhong@qq.com'
#郵件主題
asubject = '這是一份測試郵件'
#發(fā)件人地址
from_addr = "zhangjunhongdata@163.com"
#郵箱密碼(授權(quán)碼)
password="123data"
#郵件設(shè)置
msg = MIMEMultipart()
msg['Subject'] = asubject
msg['to'] = areceiver
msg['Cc'] = acc
msg['from'] = "張俊紅"
#郵件正文
body = "你好,這是一份測試郵件"
#添加郵件正文:
msg.attach(MIMEText(body, 'plain', 'utf-8'))
#添加附件
#注意這里的文件路徑是斜杠
xlsxpart = MIMEApplication(open('C:/Users/zhangjunhong/Desktop/這是附件.xlsx', 'rb').read())
xlsxpart.add_header('Content-Disposition', 'attachment', filename='這是附件.xlsx')
msg.attach(xlsxpart)
#設(shè)置郵箱服務(wù)器地址以及端口
smtp_server ="smtp.163.com"
server = smtplib.SMTP(smtp_server, 25)
server.set_debuglevel(1)
#登陸郵箱
server.login(from_addr, password)
#發(fā)送郵件
server.sendmail(from_addr, areceiver.split(',')+acc.split(','), msg.as_string())
#斷開服務(wù)器鏈接
server.quit()
最后的結(jié)果如下圖:

關(guān)于自動發(fā)送郵件還有一些進階的內(nèi)容,比如定時發(fā)送,正文顯示html內(nèi)容等,大家有興趣的可以自行上網(wǎng)搜索學(xué)習(xí)。
批量發(fā)送郵件
如果是需要同時發(fā)送多份郵件,可以把收件人整理成一個表格進行循環(huán)遍歷,挨個進行發(fā)送。
比如我們現(xiàn)在需要給銷售部門好幾百銷售人員分別發(fā)送本月各自的銷售任務(wù),在發(fā)送郵件的時候主題需要命名成xxx任務(wù)明細,在正文中的稱呼也需要改成對應(yīng)的收件人,附件中需要添加各自的任務(wù)明細表,而且需要抄送給各自的直屬上級。
根據(jù)上述的需要,我們整理了如下收件人信息相關(guān)的表格df:
| 姓名 | 收件人 | 抄送人 |
|---|---|---|
| 張俊紅1 | zhangjunhong11@163.com | zhangjunhong@163.com |
| 張俊紅2 | zhangjunhong22@163.com | zhangjunhong@163.com |
只需要寫一個for循環(huán)去遍歷這個df表格中的信息,然后就可以分別發(fā)送出去,具體實現(xiàn)代碼如下:
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 = "zhangjunhong1227@163.com"
password = "123zjh"
smtp = smtplib.SMTP() #聲明一個鏈接對象
smtp.connect(host, port) # 與服務(wù)器進行連接
smtp.set_debuglevel(1) #顯示出交互信息
smtp.login(username, password) # 登陸郵箱
sender = username
for i in zip(df["姓名"],df["收件人"],df["抄送人"]):
receiver = i[1] #收件人
acc = i[2] #抄送人
msg = MIMEMultipart() #聲明一個郵件對象
msg['from'] = username #發(fā)件人
msg['to'] = receiver#收件人
msg['Cc'] = acc #抄送人
msg['Subject'] = i[0] + "任務(wù)明細" #主題
# 編寫正文
text = MIMEText(i[0]+"您好,這是您這個月的任務(wù)明細",'plain', 'utf-8')
msg.attach(text)
# 添加表格附件
f = open('C:/Users/zhangjunhong/Desktop/任務(wù)明細/'+ i[0] + '.xlsx', 'rb').read()
filepart = MIMEApplication(f)
filepart.add_header('Content-Disposition','attachment',filename=i[0] + '任務(wù)明細.xlsx') #為附件添加一個標題
msg.attach(filepart)
smtp.sendmail(sender, receiver.split(',') + acc.split(','), msg.as_string()) # 發(fā)送郵件
smtp.quit() # 斷開連接
通過運行上面的代碼,就可以達到一次性給表格df中的所有人發(fā)送郵件的需求。
以上就是 Python如何實現(xiàn)自動發(fā)送郵件的詳細內(nèi)容,更多關(guān)于 Python發(fā)送郵件的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信