??做商業(yè)項目的同僚們法绵,在每次結(jié)果進(jìn)行交付的時候凭戴,每次的郵件編寫涧狮,文字核查,收件人發(fā)件人編寫是不是讓你感覺心力交瘁簇宽?
??跑流程的同僚們勋篓,在提交運行時間比較長的任務(wù)的時候,是不是時刻心系流程運行到哪一步了魏割?
??我轉(zhuǎn)python沒有多久譬嚣,之前perl出身,但python有些模塊確實很強(qiáng)大钞它,比如我們今天要提到的一個模塊是:smtplib拜银。
??SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則殊鞭,由它來控制信件的中轉(zhuǎn)方式。python的smtplib提供了一種很方便的途徑發(fā)送電子郵件尼桶。它對smtp協(xié)議進(jìn)行了簡單的封裝操灿。該句話摘自python3的菜鳥教程。
??該協(xié)議有三個主要的步驟:
- smtpObj.connect:連接郵箱協(xié)議泵督,不同的郵箱類型協(xié)議也不一樣趾盐。
- smtpObj.login:登錄郵箱,需要用戶名和密碼小腊。
- smtpObj.sendmail:指定收件人救鲤,抄送對象,發(fā)送內(nèi)容等秩冈。
??接下來我們進(jìn)行一一代碼講解本缠。
第一步:模塊的導(dǎo)入。
import smtplib
import argparse
import os
import sys
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
from email.utils import formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import pandas as pd
import codecs
import subprocess
import time
第二步:發(fā)送前賬號及協(xié)議的準(zhǔn)備
mail_user = '123@qq.com'
mail_pass = '1234567'
mail_host = 'smtp.exmail.qq.com' ###騰訊郵箱協(xié)議
receivers = ['456@qq.com','789@qq.com'] ##類型為list
cc = ['456@qq.com','789@qq.com'] ##同上
第三步:發(fā)送內(nèi)容的準(zhǔn)備
??發(fā)送內(nèi)容一般包括文字入问,圖片丹锹,表格,附件等芬失。但不管是什么類型楣黍,我們要將內(nèi)容轉(zhuǎn)成html格式。
??在開始前棱烂,我們先準(zhǔn)備一個空的容器锡凝,用來存放我們要發(fā)送的內(nèi)容。命令行如下:
msg = MIMEMultipart()
??先看文字垢啼,文字的格式寫法參考html的格式,這里給大家提供一個示例张肾。
message_qc = '<br><p style="text-indent:">該郵件為測試郵件芭析。</p>'
msg.attach(MIMEText(message_qc,'html','utf-8'))
??再看圖片。示例如下:
file = open("QR.png", "rb")
img_data = file.read()
file.close()
img = MIMEImage(img_data)
img.add_header('Content-ID', 'imageid')
msg.attach(img) #將圖片放入容器中
??接下來看表格吞瞪。首先要把表格轉(zhuǎn)成html形式馁启,這里用到了panda進(jìn)行表格讀取,示例如下:
pd.set_option('max_colwidth',10000) ###pandas讀取表格時芍秆,設(shè)置最大的列寬惯疙。使得表格內(nèi)容不換行。
data_gender = pd.read_csv(rep_file,sep='\t',index_col = False)
temp = data_gender.to_html(index=False)
html_text_tmp = temp.replace('class', 'cellspacing=\"0\" class') ###表格類型妖啥,0表示為單外框線霉颠,默認(rèn)為雙外框線。
html_text = html_text_tmp.replace('<th>','<th Bgcolor=#92cddc>') ###設(shè)置表頭填充顏色
html_text = html_text.replace('text-align: right','text-align: center') ###表格內(nèi)容居中
msg.attach(MIMEText(html_text ,'html','utf-8')) ##將表格添加到容器中
??最后看一下添加附件荆虱,示例如下:
basename = os.path.basename(rep_file) ##附件名稱
qianz,ges = basename.strip().split('.') ###分割名稱蒿偎,這里使用的是‘.’進(jìn)行名字與格式的分割
mime = MIMEBase(qianz, ges, filename = basename) ###以下操作添加附件名稱
mime.add_header('Content-Disposition', 'attachment', filename = basename)
mime.add_header('Content-ID', '<0>')
mime.add_header('X-Attachment-Id', '0')
f = open(rep_file,'rb')
mime.set_payload(f.read())
encoders.encode_base64(mime)
msg.attach(mime) #將附件添加至容器中朽们。
第四步:發(fā)送郵件,代碼如下:
msg['From'] = Header(mail_user , 'utf-8') #發(fā)件人
msg['To'] = ";".join(receivers) #收件人
msg['CC'] = ";".join(cc) #抄送對象
msg['Subject'] = Header(subject, 'utf-8') ##添加主題诉位,subject的形成參考郵件發(fā)送文字部分骑脱。
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 為 SMTP 端口號
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers+cc, msg.as_string())
print ("郵件發(fā)送成功")
except smtplib.SMTPException:
print ("Error: 無法發(fā)送郵件")
好了,以上為所有發(fā)送郵件的代碼了苍糠,下一板塊叁丧,介紹如何進(jìn)行隱藏個人信息發(fā)送郵件。祝大家生活愉快~~~
參考:
1: https://www.runoob.com/python/python-email.html