码迷,mamicode.com
首页 > 编程语言 > 详细

python3 发送邮件携带附件(可携带多个不同格式的附件)

时间:2019-01-24 00:20:56      阅读:1429      评论:0      收藏:0      [点我收藏+]

标签:carddav   xxxxx   attach   实现   filename   pytho   smtp   tip   循环   

 

最近在学习python,刚刚看完python3使用SMTP发送邮件,简单小节下。

python3 发送邮件携带附件(可携带多个不同格式的附件)

要了解SMTP的可以自行去百度,这里不做解释。

使用SMTP发送有邮件前要确保发件人的邮箱已开启SMTP服务。若发件人邮箱已开启此服务可跳过此教程直接参考代码。

一、163邮箱开启SMTP方式

1.登陆163邮箱网页版,进入"POP3/SMTP/IMAP"页面,开启smtp服务,一般默认开启,

直接去生成授权码即可。

技术分享图片

 

2、生成客户端授权码,进入"客户端授权密码"页面,开启客户端授权码。

技术分享图片

 

3、选择开启后需要进行短信验证

 

技术分享图片

 

 4、身份验证完成后进入设置授权码页面,自己设置就好了。

技术分享图片

二、qq邮箱开启SMTP服务

1、登陆qq邮箱,进入设置也页面。

技术分享图片

 

2、在账户页面找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务开启服务,开启时生成的授权码可以用于第三方登陆。

 

技术分享图片

 技术分享图片

 三、根据自己的实际使用的邮箱开启SMTP服务后,接下来就直接看代码

 1  1 import smtplib
 2  2 from email.header import Header
 3  3 from email.mime.text import MIMEText
 4  4 from email.mime.multipart import MIMEMultipart
 5  5 from email.header import  make_header
 6  6 class Email():
 7  7     def send(self,xx,receiver,copy_to,mail_title,text_part)
8 8 9 9 sender = xxxxxx@163.com 10 10 receiver = receiver 11 11 copy_to = copy_to 12 12 smtpserver = smtp.163.com #邮箱服务器,163邮箱为smtp.163.com,qq邮箱为smtp.qq.com,根据实际情况选择 13 13 username = xxxxxx@163.com #邮箱账号 14 14 # 如果是163邮箱,这里的密码是163的授权码而不是登陆密码。qq邮箱使用qq邮箱生成的授权吗。 15 15 password = xxxxxx 16 16 mail_title = mail_title 17 17 18 18 # 创建一个带附件的实例 19 19 message = MIMEMultipart() 20 20 message[From] = sender #发件人邮箱 21 21 22 22 23 23 message[To] = ,.join(receiver ) #将列表中的收件人拼接成用“,”连接的字符串 24 24
25 25 message[Cc] = ,.join(copy_to ) 26 26 message[Subject] = Header(mail_title, utf-8) 27 27 message.attach(MIMEText(text_part, plain, utf-8)) 28 28 29 29 att = [] 30 30 #通过循环统计附件个数,便于添加添加附件 31 31 for j in range(len(xx)): 32 32 att.append(j) 33 33 #通过for循环添加附件,这里的xx表示附件路径,xx为list 34 34 for i in range(len(xx)):35 35 print(xx[i-1].split("/")[-1]) 36 36 path_file = xx[i-1] #获取列表中的单个文件路径 37 37 file= xx[i-1].split("/")[-1]#获取附件名称 38 38 att[i]= MIMEText(open(path_file,rb).read(),base64,utf-8) 39 39 att[i]["Content-Type"] = application/octet-stream;name="%s" % make_header([(file, UTF-8)]).encode(UTF-8)#解决附件中文名乱码问题 40 40 att[i]["Content-Disposition"] = attachment;filename= "%s" % make_header([(file, UTF-8)]).encode(UTF-8) 41 41 message.attach(att[i]) 42 42 43 43 try: 44 44 smtpObj = smtplib.SMTP_SSL() # 注意:如果遇到发送失败的情况(提示远程主机拒接连接),这里要使用SMTP_SSL方法 45 45 smtpObj.connect(smtpserver) 46 46 smtpObj.login(username, password) 47 47 smtpObj.sendmail(sender, receiver+copy_to, message.as_string())#receiver+copy_to收件人和抄送对象需要放在同一列表中 48 48 print("邮件发送成功!!!") 49 49 smtpObj.quit() 50 50 except: 51 51 print (邮件发送失败) 52 52 smtpObj.quit() 53 53 if __name__ == __main__: 54 54 xx = [附件路径1,附件路径2]#附件路径以列表形式传。附件路径要用“/”方式表示,可以改为“\\"或”\",需要修改第35和37行代码中的“/” 55 56 receiver = [xxxxxx@163.com,xxxxxx@qq.com]#收件人多个人时以列表方式传入,否则只有第一个人能收到 56 57 copy_to = [xxxxxx@qq.com,xxxxxx@163.com]#抄送对象 57 58 58 59 mail_title = 邮件主题 59 60 text_part = 邮件正文 60 61 email = Email() 61 62 email.send(xx,receiver,copy_to,mail_title,text_part)

以上代码可以实现同时是发送,抄送邮件给多人,也可携带多个任意格式的附件,但该代码的缺陷,邮件发送成功后发件人看不到附件,收件人可以正常查看。等有时间时在做修改把。

以上代码参考于  https://blog.csdn.net/kunshanyuZ/article/details/78824971

小白第一次写,请各位大佬多多指教

python3 发送邮件携带附件(可携带多个不同格式的附件)

标签:carddav   xxxxx   attach   实现   filename   pytho   smtp   tip   循环   

原文地址:https://www.cnblogs.com/ceshixiaobai/p/10312060.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!