上一篇关于自动发邮件的教程,我们讲解了如何使用yagmail进行简单的发邮件:大家都能看懂的Python自动发邮件教程在现实生活中,如果只是给自己发邮件,像上面这样的简单格式一篇文章是可以的,但是如果你想为每个人定制邮件,群发给公司客户、内部员工、亲戚朋友,就需要更高级的邮件发送方式了。我们可以通过HTML制作出精美的元旦问候邮件,但是邮件的内容——姓名、问候语等应该如何动态渲染呢?答案是jinja2。jinja2是一个Python模板引擎。使用jinja2,我们可以在邮件HTML中设置一个占位符,当Python发送邮件时,将指定的文本渲染到占位符中,达到动态渲染的目的。举一个jinja2的简单例子:`fromjinja2importTemplate``name='Peter'``age=34``tm=Template("Mynameis{{name}}andIam{{age}}")``msg=tm.render(name=name,age=age)``print(msg)`使用{{}}将占位符括起来,称为模板字符串。模板字符串提供两个变量:name和age。在这个例子中,将姓名和年龄的硬编码值传递到模板中,输出为:我叫彼得,我今年34在这篇文章中,我将教你如何自定义元旦问候邮件通过Html和Python+jinja2给你的亲戚朋友。本文所有素材和源码都可以在这里下载:https://pythondict.com/downlo...或者Python实战宝典公众号回复:元旦邮件直接从网盘获取下载链接。1.在开始之前,您需要确保您的计算机上已经成功安装了Python和pip。如果没有,请访问这篇文章:超详细的Python安装指南进行安装。如果使用Python进行数据分析,可以直接安装Anaconda:Python数据分析挖掘的好帮手——Anaconda,内置Python和pip。另外推荐大家使用VSCode编辑器,因为它有很多优点:Python编程的最佳拍档——VSCode详细指南。准备输入命令安装依赖。如果你没有VSCode编辑器,Windows环境下打开Cmd(开始-运行-CMD),苹果系统环境下打开Terminal(command+空格输入Terminal)。如果你使用VSCode编辑器或者Pycharm,你可以直接在下面的Terminal中输入命令:`pipinstalljinja2``pipinstallyagmail`2.编写HTML编写需要发送的邮件模板的HTML。占位符变量是提前用HTML编写的。由于我的HTML文件太大,这里没有全部展示,只展示了几个关键变量。为了简化教程的复杂度,尽可能覆盖知识点,这里我们使用了4个变量:1.LOGO图片(让大家更好的理解图片是如何渲染成HTML并发送邮件的)2.背景图片3.祝福对象4.祝福语言首先是图片变量的配置:`
````
``````{{name}}``
``2021元旦快乐``
````{{bless}}.``
`用{{}}包裹变量,name是祝福的对象,bless是祝福。这里简化了代码,还有很多样式需要详细配置。你可以在源代码中看到index\_detail.html。对了,我们的源码包括两份html,一份是index\_detail.html,是未压缩的源码,而index.html,是压缩后的源码。为什么要压缩HTML?因为邮件客户端在解析HTML的时候可能会将换行符解析成HTML,所以不保留任何空格和换行符的压缩HTML是最安全的方式。详细的HTML代码可以查看源码中的index\_detail.html。3、用Python代码发送邮件的方法,我们在Python自动发送邮件教程中已经详细讲过了大家都能看懂:`classMail:``"""``Mail相关类``"""``deflog(self,content):``now_time=time.strftime(``"%Y-%m-%d%H:%M:%S",time.localtime()``)``打印(f'{now_time}:{content}')``defsendmail(self,html,title,receivers):``"""``发送邮件``参数:``html{str}--邮件文本(html)``title{str}--邮件标题``receivers{list}--邮件接收者,数组``"""``yag=yagmail.SMTP(``host='你的邮箱SMTPHOST',user='你的邮箱',``password='你的邮箱密码',smtp_ssl=True``)``yag.send(receivers,title,html)``self.log("邮件发送成功")`另外,为了渲染图片,需要将图片转base64,方法如下:`defget_image_base64(path):``"""``获取图片的base64编码``Args:``path(str):图片路径``返回:``str:base64编码``"""``importbase64``f=open(path,"rb")``base64_data=base64.b64encode(f.read())``f.close()``returnbase64_data.decode("utf-8")`当然,最重要的是下面的代码,需要为大家定制的祝福,我们可以使用字典的数据结构来保存数据:`bless_info={``"admin@pythondict.com":{``“pythondict_img”:get_image_base64("./images/pythondict.png"),``"name":"实用书",``"background":"https://backgroundimage.jpg",``"bless":"愿一切好幸运,不期而遇...",``"title":"祝宝典哥明年粉丝破十万"`},``"test@qq.com":{``"pythondict_img":get_image_base64("./images/pythondict.png"),``"name":"老王",``"background":"https://backgroundimage.jpg",``"bless":"祝福你女儿明年考研顺利,全家幸福安康.",``"title":"老王,祝您元旦快乐!"``},``}`可以看到bless\_info字典中的每一个key都是发送对象的邮箱,这些key对应的值都有需要渲染到邮件的变量:pythondict\_img,name,背景和祝福祝福。最后一个变量title用来指定邮件的标题,渲染+发送做邮件就方便多了:`tm=Template(open('./index.html',encoding="utf-8")。read())``对于bless_info中的邮件:``msg=tm.render(bless_info[mail])``Mail().sendmail(html=msg,title=bless_info[mail]["title"],receivers=[mail])`Mail().sendmail():就是我们的发送邮件函数,不用多说了。bless\_info[mail]:是一个需要渲染的变量。里面的变量少了不够用,多了也没关系。bless\_info[mail]["title"]:是字典中刚刚指定的最后一个变量title。由于sendmail()函数中的收件人是支持多人的,所以该函数需要以数组的形式传入。但是这里有一个有趣的改进,如果你需要使用相同的模板邮件发送给同一个家庭,你可以这样做:`bless_info={``...,``"test1@qq.com,test2@qq.com,test3@qq.com":{``"pythondict_img":get_image_base64("./images/pythondict.png"),``"name":"老王一家",``"background":"https://背景图片.jpg",``"bless":"祝我的小女儿明年考研顺利成功,全家幸福、健康、吉祥...",``"title":"我的家人,祝大家元旦快乐!"``},``}``tm=Template(open('./index.html',encoding="utf-8").read())``对于bless_info中的邮件:``msg=tm.render(bless_info[mail])``Mail().sendmail(html=msg,title=bless_info[mail]["title"],receivers=mail.split(","))`是的,只需要在key中,把本家的邮箱用逗号隔开,然后在receivers中改成mail.split(","),就可以实现发送邮件的功能了给全家人的同一封电子邮件。是不是很方便?你可以自己找到你喜欢的背景图片,或者使用我在代码中提供给你的图片。如果要去除LOGO,将pythondict\_img设置为空即可,或者设置为自己的卡。运行源代码目录下的代码:pythonmail.py即可成功发送邮件,打开编辑器试试吧(记得先测试)!这是我们文章的结尾。如果喜欢今天的Python实战教程,请继续关注Python实战宝典。有问题可以在公众号后台回复:进群,回答对应的红字验证信息,进入互助群提问。原创不易,希望大家能在下方点赞观看支持我继续创作,谢谢!点击下方阅读原文,更好的阅读体验Python实战宝典(pythondict.com)不只是合集欢迎关注公众号:Python实战宝典