通过 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