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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值