smtplib + email 操作邮件 及 string.Template模板替换 + openpyxl模块 来实现个性化操作邮件相关

it2022-05-05  110

通过 smtplib模块 + emaill模块 来操作邮件

源代码如下:

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 #处理附件类(包括文件、图片等都可) fromAddr='29xxxxx68@qq.com' #(更改成 发件邮箱) toAddr=['29xxxxx68@qq.com','83xxxx32@qq.com'] #可以写成列表,用,逗号隔开 (更改成 收件邮箱列表) fromPass='xxxxxxxxxxxxx' #(更改成 发件邮箱密码) msg=MIMEMultipart() #创建实例 多文本处理 msg['from']=fromAddr #发件邮箱 msg['to']=';'.join(toAddr) #收件邮箱 这里通过使用列表重建的方式实现同时发送给多个收件账户 msg['subject']='测试标题!' #标题内容 #处理邮件文本内容,然后添加进邮件 text1=MIMEText('这里是测试文本输出内容...','plain','utf-8') #三个参数(文本、格式、编码) msg.attach(text1) #添加邮件文本内容 # ============================================================================= # #下面开始进行处理附件: # #其中:MIMEApplication() 可处理图片、文件等多种类型附件 # #注意:add_header()附件如果不添加信息,则读取显示的内容不正常' # ============================================================================= #用 MIMEImage() 处理邮件图片附件,然后添加 #注意:add_header()附件如果不添加信息,则读取显示的内容不正常' image1File='reba1.jpg' image1=MIMEImage(open(image1File,'rb').read(),image1File.split('.')[-1]) image1.add_header('Content-Disposition','attachment',filename=image1File) msg.attach(image1) #添加图片附件 #用 MIMEApplication() 可处理图片、文件等多种类型附件 #处理图片附件,然后添加 image2File='reba2.jpg' image2=MIMEApplication(open(image2File,'rb').read(),image2File.split('.')[-1]) image2.add_header('Content-Disposition','attachment',filename=image2File) msg.attach(image2) #添加图片附件 #处理PDF附件,然后添加 pdf1File='F:\\日常工作日志及上市公司分析报告文件夹\\八菱科技:2019年半年度业绩预告修正公告.pdf' pdf1=MIMEApplication(open(pdf1File,'rb').read()) pdf1.add_header('Content-Disposition','attachment',filename=pdf1File.split('\\')[-1]) msg.attach(pdf1) #添加pdf附件 #处理xlsx类型excel附件,然后添加 xlsx1File='F:\\日常工作日志及上市公司分析报告文件夹\\002592八菱科技细分分析-YSK.xlsx' xlsx1=MIMEApplication(open(xlsx1File,'rb').read()) xlsx1.add_header('Content-Disposition','attachment',filename=xlsx1File.split('\\')[-1]) msg.attach(xlsx1) #登陆服务器处理邮件 server=smtplib.SMTP_SSL('smtp.qq.com',465) server.login(fromAddr,fromPass) #server.sendmail(fromAddr,toAddr,msg.as_string()) server.send_message(msg) server.quit()

另外,

通过 smtplib模块 + email模块l +string.Template 的模板替换模块 来个性化输出邮件

源代码如下:

import smtplib #邮箱服务器 from email.mime.multipart import MIMEMultipart #邮件多内容类 from email.mime.text import MIMEText #邮件文本处理类 #引入字符串的 模板类,通过替换模板内容里的变量$,来实现个性化输出的目的 from string import Template #字符串模板类 fromAddr='29xxxxx68@qq.com' #发件邮箱账户 (需替换为自己的发件邮箱) fromPass='xxxxxxxxxxxx' #发件邮箱密码 (需替换为自己的发现油箱密码) #自建函数(参数为文件名称):打开文件,读取姓名邮箱后组成返回zip内容 def get_contacts(filename): names=[] emails=[] with open(filename,mode='r',encoding='utf-8') as contacts_file: for a_contact in contacts_file: #for循环后会读取每一行内容 names.append(a_contact.split()[0]) #用空格来分割内容 emails.append(a_contact.split()[1]) return names,emails #自建函数(参数为文件名称):打开文件,读取模板内容后返回模板实例,为实例化模板准备 def read_template(filename): with open(filename,'r',encoding='utf-8') as template_file: template_file_content=template_file.read() #string.Template默认用符号$来标识出变量(延伸:自建myTemplate类,可以实现将$改为其他符号) return Template(template_file_content) names,emails=get_contacts('姓名地址.txt') #运用自建函数 读取本地存储的 姓名地址文件,准备for对应循环 message_template=read_template('内容模板.txt') #运用自建函数来 读取本地存储的 内容模板文件,准备模板内容替换变量$ #连接登录邮件服务器 server=smtplib.SMTP_SSL('smtp.qq.com',465) server.login(fromAddr,fromPass) #循环发送邮件:for循环逐个发送对应每一个姓名、地址。 for name,email in zip(names,emails): msg=MIMEMultipart() msg['from']=fromAddr msg['to']=email msg['subject']='你是人间的四月天...' #引用 string 的模板类来替换 $变量字符内容 从而达到个性化输出的目的 #string.Template.safe_substitute()安全替换 类方法 message=message_template.safe_substitute(PERSON_NAME=name.title()) text1=MIMEText(message,'plain') #处理文本信息 msg.attach(text1) #添加文本信息 server.send_message(msg) #发送邮件 server.quit() #关闭邮件服务器

还有

个性化邮件操作: 通过 openpyxl模块 来结合excel表格查询电费缴纳情况,邮件通知未缴纳账户。

源代码全文如下:

# ============================================================================= # #个性化邮件操作: 结合excel表格查询电费缴纳情况,邮件通知未缴纳账户。 # ============================================================================= import openpyxl #操作EXCEL import sys #设置CMD执行文件时,输入邮箱密码,格式如: python 文件名 邮箱密码 import smtplib #邮箱服务器 from email.mime.text import MIMEText #处理邮箱文本类 wb1=openpyxl.load_workbook('电费统计.xlsx') #加载工作簿 ws1=wb1.get_sheet_by_name('Sheet1') #获取工作表 lastCol=ws1.max_column #获取最后的一列 latestMonth=ws1.cell(row=1,column=lastCol).value #获取最后的月份值 unPaidMembers={} #创建空字典,用来存储未交费名单 for r in range(2,ws1.max_row+1): #for循环最后一列表单,来获取未交费名单和邮箱,并存入字典 payment=ws1.cell(row=r,column=lastCol).value if payment !='paid': name=ws1.cell(row=r,column=1).value email=ws1.cell(row=r,column=2).value if email != None: unPaidMembers[name]=email server=smtplib.SMTP_SSL('smtp.qq.com',465) #打开邮箱服务器 #server.login('29xxxxx68@qq.com',sys.argv[1]) #可在CMD中执行文件: python 文件名 油箱密码 server.login('29xxxxx68@qq.com','xxxxxxxxxxxxxx') #登录邮箱服务器 for name,email in unPaidMembers.items(): #for循环字典,来逐个输出发送邮件。 body='''\n\ 我说内个{}啊,\n\n{}的电费你想拖到什么时候呀,赶紧交!明天不把账结清我停了你家的水电!\n\n\ 电管局 '''.format(name,latestMonth) print('正在发送邮件给{},邮箱地址是:{}'.format(name,email)) # msg=MIMEMultipart() # text2=MIMEText(body) # msg.attach(text2) #通用添加文本 msg=MIMEText(body) #如果存文本内容,可直接使用msg msg['from']='29xxxxx68@qq.com' msg['to']=email msg['subject']='欠电费可耻!' server.send_message(msg) #发送邮件 server.quit() #关闭邮箱服务器

封装smtplib的 sendMsg 函数

最后封装一个smtplib的 sendMsg 函数操作,用来在以后的程序中进行引用发送提醒。 此部分仅仅封装了邮件发送文本内容,至于附件的封装操作还需要继续完善,邮件提醒功能已经具备。 代码如下:

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 #处理附件类(包括文件、图片等都可) import re def sendMsg(msgText='这里是封装测试文本...',toAddr='29xxxxxx68@qq.com',msgSub='邮件测试'): #处理地址列表 toAddrList=re.split('[,;\s]',toAddr) toAddr=[] for addr in toAddrList: toAddr.append(addr) fromAddr='83xxxx32@qq.com' # toAddr=['29xxxxxx68@qq.com','83xxxx32@qq.com'] #可以写成列表,用,逗号隔开 fromPass='zwxxxxxxvxwcaaf' msg=MIMEMultipart() #创建实例 多文本处理 msg['from']=fromAddr #发件邮件 msg['to']=';'.join(toAddr) #收件邮箱 这里通过使用列表重建的方式实现同时发送给多个收件账户 msg['subject']=msgSub #标题内容 #处理邮件文本内容,然后添加进邮件 text1=MIMEText(msgText,'plain','utf-8') #三个参数(文本、格式、编码) msg.attach(text1) #添加邮件文本内容 # ============================================================================= # #下面开始进行处理附件: # #其中:MIMEApplication() 可处理图片、文件等多种类型附件 # #注意:add_header()附件如果不添加信息,则读取显示的内容不正常' # ============================================================================= #此部分后期完善 #登陆服务器处理邮件 server=smtplib.SMTP_SSL('smtp.qq.com',465) server.login(fromAddr,fromPass) #server.sendmail(fromAddr,toAddr,msg.as_string()) server.send_message(msg) server.quit() if __name__ == '__main__': sendMsg('测试封装文本','29xxxxxx68@qq.com') # ============================================================================= # #引入包 调用函数(如果找不到模块就自行添加临时环境变量) # #import os,sys # #sys.path.append(os.path.dirname(os.path.abspath('.'))) #添加临时环境变量 上层目录 # # from smtplibSendMsg import SendMsg as smtp_SendMsg # # smtp_SendSMS('这是测试封装邮件发送内容','29xxxxxx68@qq.com') #调用函数方法实现向手机发送短信内容 # =============================================================================

附件内容:

个性化操作邮件相关内容中需要用到的文件如下:

姓名地址.txt

心如 29xxxxxx68@qq.com 千骨 83xxxx32@qq.com

内容模板.txt

亲爱的${PERSON_NAME}:

我说你是人间的四月天; 笑响点亮了四面风; 轻灵在春的光艳中交舞着变。

你是四月早天里的云烟, 黄昏吹着风的软, 星子在无意中闪, 细雨点洒在花前。

那轻,那娉婷,你是, 鲜妍百花的冠冕你戴着, 你是天真,庄严, 你是夜夜的月圆。

雪化后那片鹅黄,你像; 新鲜初放芽的绿,你是; 柔嫩喜悦, 水光浮动着你梦中期待的白莲。

你是一树一树的花开, 是燕在梁间呢喃,

你是爱,是暖,是希望, 你是人间的四月天。

电费统计.xlsx

Member Email 一月 二月 三月 四月 五月 六月 周润发 29xxxxx68@qq.com paid paid paid paid paid 成龙 paid paid paid paid paid paid 周星驰 paid paid paid paid paid paid 梁朝伟 paid paid paid paid paid paid 张学友 83xxxx32@qq.com paid paid paid paid paid 刘德华 paid paid paid paid paid paid


最新回复(0)