最近在学习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 importsmtplib2 2 from email.header importHeader3 3 from email.mime.text importMIMEText4 4 from email.mime.multipart importMIMEMultipart5 5 from email.header importmake_header6 6 classEmail():7 7 defsend(self,xx,receiver,copy_to,mail_title,text_part) 8 8
9 9 sender = ‘xxxxxx@163.com‘
10 10 receiver =receiver11 11 copy_to =copy_to12 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_title17 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 inrange(len(xx)):32 32att.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 41message.attach(att[i])42 42
43 43 try:44 44 smtpObj = smtplib.SMTP_SSL() #注意:如果遇到发送失败的情况(提示远程主机拒接连接),这里要使用SMTP_SSL方法
45 45smtpObj.connect(smtpserver)46 46smtpObj.login(username, password)47 47 smtpObj.sendmail(sender, receiver+copy_to, message.as_string())#receiver+copy_to收件人和抄送对象需要放在同一列表中
48 48 print("邮件发送成功!!!")49 49smtpObj.quit()50 50 except:51 51 print (‘邮件发送失败‘)52 52smtpObj.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)
以上代码可以实现同时是发送,抄送邮件给多人,也可携带多个任意格式的附件,但该代码的缺陷,邮件发送成功后发件人看不到附件,收件人可以正常查看。等有时间时在做修改把。
小白第一次写,请各位大佬多多指教