Python实现电子邮件发送
在生活中或许我们多数都在用微信或者是QQ,但是工作中就会涉及邮件了,我也是最近在工作中用到了,所以找了些资料,有的较为完备有的就特别零散,所以自己也来整理分享一下。这里主要整理关于SMTP模块的邮件发送。
smtplib官网
SMTP(Simple Mail Transfer Protocol) 即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.
下面大概讲述一下SMTP发送邮件的流程:
- 连接服务器
- 登录
- 发送服务请求
- 退出
SMTP服务开启以授权码获取
想要进行邮件的发送操作,首先要搞清楚发件的邮箱的 SMTP 服务器地址和加密方式,当然别忘了打开 SMTP 服务。这里以qq邮箱和163邮箱为例子:
登录邮箱进入设置:
进入设置之后,选择账户,往下拉一点儿就可以看到各个服务了:
跟着他的步骤走就收到一个授权码,这个授权码是用于后面邮箱登录的,要保存下来哦
设置好了还要获取授权码:
如果忘记了授权码就重设授权码。
163邮箱是可以自己设置授权码的。
Python中SMTP使用
由于腾讯企业邮箱使用 SSL 加密方法,因此需要调用 smtplib 的 SMTP_SSL() 方法并提供 465 端口号。
login() 用于登陆到 SMTP 服务器,第一个参数为邮件地址,第二个参数为密码(亲测为授权码)。login()的返回码
# 235 == 'Authentication successful'
# 503 == 'Error: already authenticated'
import smtplib
#定义输入信息
from_email = r'填发送的邮箱'
password = r'填授权码'
to_email = r'发送邮箱的地址'
smtp_ssl = 'smtp.'+from_email.split('@')[-1]#自动去适配邮箱的smtp
smtp_ssl_num =465#看情况修改
# 连接 SMTP 服务器并登陆
smtp = smtplib.SMTP_SSL(smtp_ssl, port=smtp_ssl_num)
status = smtp.login(from_email,password)
print(status)
print(type(status))
print('状态:',status[1])
输出结果:
(235, b'Authentication successful')
<class 'tuple'>
状态: b'Authentication successful'
这样就成功连接到服务器了。
加密SMTP
使用标准的25端口连接SMTP服务器时,使用的是明文传输,为了安全起见,要更安全地发送邮件,可以加密SMTP会话,就是先创建SSL安全连接,然后再使用SMTP协议发送邮件。
邮件服务商 | SMTP | SSL加密端口 |
---|---|---|
qq. | smtp.qq.com | 465或587 |
网易 | smtp.163.com | 465或994 |
构建邮件主体
邮件格式遵循一定的规范,MIME(多用途互联网邮件扩展类型)。如果对此不熟悉,也没有关系,我们使用 Python 内置的 email 模块中的 MIME 模块来构建一个文本邮件对象。
import smtplib
from email.mime.text import MIMEText
from email.header import Header
#定义输入信息
from_email = r'填发送的邮箱'
password = r'填授权码'
to_email = r'发送邮箱的地址'
smtp_ssl = 'smtp.'+from_email.split('@')[-1]#自动去适配邮箱的smtp
smtp_ssl_num =465
# 构建要发送的邮件内容
text = '正文内容'
title = '我是标题'
m = MIMEText(text, 'plain', 'utf-8')
m['Subject'] = Header(title, 'utf-8')
m['From'] = Header(from_email, 'utf-8')
m['To'] = Header(to_email, 'utf-8')
try:
smtp = smtplib.SMTP_SSL(smtp_ssl, port=smtp_ssl_num)
smtp.login(fromaddr,password)
smtp.sendmail(from_email, to_email, m.as_string())
print('success')
smtp.close()#关闭连接
except smtplib.SMTPException as e:
print('error:',e) #打印错误
注意:连接上了,操作结束后要关闭连接。
发送带多附件的邮件
发送各种带附件的邮件
使用MIMEMultipart来标示这个邮件是多个部分组成的,然后attach各个部分。如果是附件,则add_header加入附件的声明。
MIME有很多种类型,比较麻烦,如果附件是:
- 图片格式,用MIMEImage,
- 音频,要用MIMEAudio,
- word、excel,我都不知道该用哪种MIME类型
如果想偷懒就不管什么类型的附件,都用MIMEApplication,MIMEApplication默认子类型是application/octet-stream。
看代码你就明白了:
import smtplib
from email.mime.text import MIMEText#用于发送纯文本或者HTML
from email.mime.image import MIMEImage#用于发送图片
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication #万能附件发送
from_email = r'填发送的邮箱'
password = r'填授权码'
to_email = r'发送邮箱的地址'
smtp_ssl = 'smtp.' + from_email.split('@')[-1]#自动去适配邮箱的smtp
smtp_ssl_num =465
title = '送给宝贝的一封信'
content = '正文信息:我给你发了许多附件,请查收!.'
textApart = MIMEText(content)
#正文文字无需通过add_header加入到
imageFile = r'E:/emailtest/test.jpg'
imageApart = MIMEImage(open(imageFile, 'rb').read(), imageFile.split('.')[-1])
imageApart.add_header('Content-Disposition', 'attachment', filename=imageFile.split('/')[-1])
pdfFile = r'E:/emailtest/《Python进阶》.pdf'
pdfApart = MIMEApplication(open(pdfFile, 'rb').read())
pdfApart.add_header('Content-Disposition', 'attachment', filename=('gbk','',pdfFile.split('/')[-1]))
zipFile = r'E:/emailtest/《Python进阶》.zip'
zipApart = MIMEApplication(open(zipFile, 'rb').read())
zipApart.add_header('Content-Disposition', 'attachment', filename=('gbk','',zipFile.split('/')[-1]))
m = MIMEMultipart()
m.attach(textApart)#加入正文信息
m.attach(imageApart)#加入图片
m.attach(pdfApart)#加入pdf
m.attach(zipApart)#加入压缩包
m['Subject'] = Header(title, 'utf-8')
m['From'] = Header(from_email, 'utf-8')
m['To'] = Header(to_email[i], 'utf-8')
try:
smtp = smtplib.SMTP_SSL(smtp_ssl, port=smtp_ssl_num)
smtp.login(from_email,password)
smtp.sendmail(from_email, to_email, m.as_string())
print('successful')
smtp.quit()
except smtplib.SMTPException as e:
print('error:',e) #打印错误
其中filename=('gbk','',zipFile.split('/')[-1])
是为了避免显示出现乱码情况而加入的,如果gbk还是乱码可以试试utf-8
,我的用gbk
没有问题。
写在最后
希望你看了能够有所收获,不用要那么多弯路。接触到python邮件发送是因为工作中需要编写一个exe给别的程序去调用,所以查了些资料,然后整理了一下有空就分享一下。下一篇博客再把多人接受多附件的邮件发送python脚本分享出来(要去看看哦,可以封装成为exe然后通过cmd命令行就可以调用了,当然参数是可以自定义的啦)。