说在前面:
SMTP:SMTP 是发送邮件的协议,Python 内置了对 SMTP 的操作,可以发送 Text,HTML以及带附件的邮件
Python 中有 smtplib
和 email
两个模块对 SMTP 进行操作
- smtplib:负责发送邮件
- email:负责构建邮件
步入正题:
网上很多教程,在此记录我操作的步骤;
-
首先我们需要一个可以发送邮件的邮箱作为发送邮件的一方,一开始我使用的是网易的 163 邮箱,但是在后面发现 163 的邮箱限制比较多,卡了一段时间,如果是一开始的话建议直接使用 QQ 邮箱。
-
需要打开邮箱的 SMTP 服务
拿 QQ 邮件来举例
由于我以前开启过这个服务,其中有些东西不再重复操作
记住最后生成的授权码,后期会使用到
到这里发送邮件的邮箱
就搞定了 -
开始 Python 的操作
#/usr/bin/python3 # -*- encoding: utf-8 -*- import smtplib from email import encoders from email.mime.base import MIMEBase from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header from email.utils import formataddr, parseaddr def _format_addr(s): name, addr = parseaddr(s) return formataddr([ \ Header(name, 'utf-8').encode(), \ addr.encode('utf-8') if isinstance(addr, bytes) else addr]) from_addr = 'xxxxxx@qq.com' password = 'xxxxxxxxxxxxxx' # 在上面获取的授权码 smtp_server = 'smtp.qq.com' # 这个都是一样的 to_addr = 'xxxxxxx@163.com' # 收邮件的邮箱 # 创建邮件对象 msg = MIMEMultipart() # msg = MIMEText('Python SMTP Test...', 'plain', 'utf-8') msg.attach(MIMEText('<html><body><h1>SMTP</h1>' '<p>send by<a href="http://www.python.org">Python</a>...</p>' '</body></html>', 'html', 'utf-8')) msg['From'] = _format_addr(u'Python <%s>' % from_addr) # 如果有多个邮件对象,最后的结果会有问题,但不影响使用,可以将其写死,不对其进行格式化 msg['To'] = _format_addr(u'my_python <%s>' % to_addr) # msg['To'] = Header('my_python', 'utf-8') msg['Subject'] = Header(u'Python SMTP TEST......', 'utf-8').encode() # 添加附件 with open('./smtp_mail.py', 'rb') as f: mime = MIMEBase('text', 'py', filename='smtp.py') # filename 表示的是邮件中显示的附件名称 mime.add_header('Content-Disposition', 'attachment', filename = 'smtp.py') mime.add_header('Content-ID', '<0>') mime.add_header('X-Attachment-Id', '0') mime.set_payload(f.read()) encoders.encode_base64(mime) msg.attach(mime) # 正式发送 try: server = smtplib.SMTP(smtp_server, 25) server.set_debuglevel(1) # 输出发送时候的具体操作 server.login(from_addr, password) # split 返回的是 list 所以不需要再加中括号 server.sendmail(from_addr, to_addr.split(','), msg.as_string()) server.quit() print('邮件发送成功!') except smtplib.SMTPException as e: print('邮件发送失败!') print(e)
很杂,还有一种附件显示的部分没有做
在写文章的时候想到一个很重要的问题:
我们实现的群发实际上是分成多个邮件发给不同的人,而不是一封邮件抄送给不同的人,值得思考。参考: 廖雪峰的官方网站
End