当前位置: 首页 > 后端技术 > Python

用Markdown写邮件,用Python发邮件

时间:2023-03-25 20:55:38 Python

',str(css),'用Markdown写邮件,用Python发邮件痛苦。从我有限的生活经验来看,所见即所得的编辑软件往往不如纯文本编辑体验流畅。近年来,Markdown逐渐成为写作利器,甚至现在也有一些出版社接受Markdown稿件。那么,我们是不是可以用Markdown来写邮件,然后写个Python小脚本来发邮件呢?邮件通信的内容使用MIME(多用途Internet邮件扩展)进行编码。MIME就是把类似html的邮件客户端发给浏览器。MIME支持邮件携带多媒体内容,MIME可以理解为受限制的html/css,但是MIME不支持js脚本(出于安全考虑)。整个程序的工作原理如下:在你喜欢的Markdown编辑器中编辑markdown文档/邮件,记得加上formatterFrom:fooTo:barSubject:TestMarkdownemail---配置个人邮箱账号和密码(切记不要把个人密码存放在公用电脑,也不要上传到公网)可以存放在~/.markdown-to-email.json{"username":"your_account","smtp":"smtp.qq.com:587","password":"您的密码/授权码"}QQ邮箱服务使用第三方客户端登录时需要申请授权码。有关详细信息,请参阅:什么是授权码以及如何设置?执行以下Python代码的完整示例,参考git仓库:https://gitee.com/dearyiming/...本地预览pythonmarkdown_email.py-p--md注:Mac电脑可以使用open命令直接调用邮箱APP打开预览,其他操作系统可以使用邮箱APP导入邮件(eml文件)预览发送邮件pythonmarkdown_email.py-s--md<你的markdown文件>#!/usr/bin/envpython'''发送包含HTML和纯文本替代项的多部分电子邮件。该消息应构建为以下格式的纯文本文件:发件人:您的姓名收件人:一号收件人主题:您的主题行---此处的Markdown内容脚本接受来自stdin的内容,默认情况下,将原始生成的电子邮件内容打印到stdout。通过使用`-p`或`--preview`调用脚本在OSX上预览您的消息,它将在您的默认邮件客户端中打开。要发送消息,请使用“-s”或“--send”调用。您的主目录中必须有一个名为.markdown-to-email.json的JSON文件,其中包含以下内容ys:{"username":"smtp-username","smtp":"smtp.gmail.com:587","password":"your-password"}享受吧!'''importosimportsysimportjsonimportargparseimportsmtplibimportsubprocessfromemail.mime.multipartimportMIMEMultipartfromemail.mime.textimportMIMETextimportpygmentsimportmarkdown2asmarkdown#defineargumentsparser=argparse.ArgumentParser(description='Formatandsendmarkdown-basedemails.',formatter_class=argparse.RawDescriptionHelpFormatter,epilog=__doc__)解析器。add_argument('-p','--preview',action='store_true',help='在AppleMail中预览电子邮件。')parser.add_argument('-s','--send',action='store_true',help='使用您的配置发送电子邮件。')parser.add_argument('--md',dest='markdown',type=str,nargs=1,required=True)args=parser.parse_args()print(args)#读入原始消息contentraw_content=open(args.markdown[0],'r').read()#从markdown消息中分离出标题bodyheader_content,markdown_content=raw_content.split('---',1)#将markdown渲染成HTMLcss=subprocess.check_output(['pygmentize','-S','default','-f','html'])markdown_content=markdown_content.strip()html_content=markdown.markdown(markdown_content)html_content=''.join(['',str(css),'',html_content])#创建一个多部分emailmessagemessage=MIMEMultipart('alternative')#parsetheheadersheaders={}forlineinheader_content.strip().split('\n'):ifnotline.strip():continuekey,value=line.split(':',1)headers[key.strip()]=value.strip()#settheheadersmessage['To']=headers.get('To','')message['From']=headers.get('From','')message['Subject']=headers.get('Subject','Nosubject')#附加消息部分message.attach(MIMEText(markdown_content,'plain'))#如果邮件客户端不支持html,显示Markdown源message.attach(MIMEText(html_content,'html'))#如果邮件客户端支持html,在Markdown渲染后显示HTMLifargs.send:to=message['To'].split(',')withopen(os.path.expanduser('~/.markdown-to-email.json'),'rb')asf:config=json.loads(f.read())server=smtplib.SMTP(config['smtp'])server.starttls()server.login(config['username'],config['密码'])server.sendmail(message['From'],to,message.as_string())server.quit()elifargs.preview:email_dump='/tmp/preview-with-css.eml'open(email_dump,'w').write(message.as_string())os.system('open-aMail{}'.format(email_dump))else:print(message.as_string())邮件效果参考资料了解邮件传输协议(SMTP、POP3、IMAP、MIME)cleverdevil/markdown-to-email