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

最近在学习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 = '[email protected]' 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 = '[email protected]' #邮箱账号 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 = ['[email protected]','[email protected]']#收件人多个人时以列表方式传入,否则只有第一个人能收到 56 57 copy_to = ['[email protected]','[email protected]']#抄送对象 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

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

猜你喜欢

转载自www.cnblogs.com/ceshixiaobai/p/10312060.html