自动发送邮件脚本
2020-05-11 本文已影响0人
静小沐
做商业项目的同僚们,在每次结果进行交付的时候,每次的邮件编写,文字核查,收件人发件人编写是不是让你感觉心力交瘁?
跑流程的同僚们,在提交运行时间比较长的任务的时候,是不是时刻心系流程运行到哪一步了?
我转python没有多久,之前perl出身,但python有些模块确实很强大,比如我们今天要提到的一个模块是:smtplib。
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。该句话摘自python3的菜鸟教程。
该协议有三个主要的步骤:
- smtpObj.connect:连接邮箱协议,不同的邮箱类型协议也不一样。
- smtpObj.login:登录邮箱,需要用户名和密码。
- smtpObj.sendmail:指定收件人,抄送对象,发送内容等。
接下来我们进行一一代码讲解。
第一步:模块的导入。
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
第二步:发送前账号及协议的准备
mail_user = '123@qq.com'
mail_pass = '1234567'
mail_host = 'smtp.exmail.qq.com' ###腾讯邮箱协议
receivers = ['456@qq.com','789@qq.com'] ##类型为list
cc = ['456@qq.com','789@qq.com'] ##同上
第三步:发送内容的准备
发送内容一般包括文字,图片,表格,附件等。但不管是什么类型,我们要将内容转成html格式。
在开始前,我们先准备一个空的容器,用来存放我们要发送的内容。命令行如下:
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) #将图片放入容器中
接下来看表格。首先要把表格转成html形式,这里用到了panda进行表格读取,示例如下:
pd.set_option('max_colwidth',10000) ###pandas读取表格时,设置最大的列宽。使得表格内容不换行。
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表示为单外框线,默认为双外框线。
html_text = html_text_tmp.replace('<th>','<th Bgcolor=#92cddc>') ###设置表头填充颜色
html_text = html_text.replace('text-align: right','text-align: center') ###表格内容居中
msg.attach(MIMEText(html_text ,'html','utf-8')) ##将表格添加到容器中
最后看一下添加附件,示例如下:
basename = os.path.basename(rep_file) ##附件名称
qianz,ges = basename.strip().split('.') ###分割名称,这里使用的是‘.’进行名字与格式的分割
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) #将附件添加至容器中。
第四步:发送邮件,代码如下:
msg['From'] = Header(mail_user , 'utf-8') #发件人
msg['To'] = ";".join(receivers) #收件人
msg['CC'] = ";".join(cc) #抄送对象
msg['Subject'] = Header(subject, 'utf-8') ##添加主题,subject的形成参考邮件发送文字部分。
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 ("邮件发送成功")
except smtplib.SMTPException:
print ("Error: 无法发送邮件")
好了,以上为所有发送邮件的代码了,下一板块,介绍如何进行隐藏个人信息发送邮件。祝大家生活愉快~~~
参考:
1: https://www.runoob.com/python/python-email.html