【Python基础】SMTP发送邮件
Python使用SMTP发送邮件。
一、准备
1. 开启邮箱的SMTP 服务
这里使用第三方 SMTP 服务发送邮件,可以使用 QQ邮箱,163,Gmail 等的 SMTP 服务,但需要做以下配置,以QQ邮箱为例。
登录QQ邮箱,依次点击最上方的 设置,然后点击 账户。
往下翻页,找到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 这一版块,开启 POP3/SMTP服务。(不同版本的QQ可能会不一样,总之就是找到QQ邮箱的“POP3/SMTP服务”开启按钮。)
成功开启QQ邮箱的SMTP服务后,我们会得到一串授权码,在后面的代码里,这串授权码就是我们邮箱的登录密码。开启SMTP服务可能需要进行手机验证,根据提示来就好。
2. 常用的邮件服务器配置
下面整理了常用的邮件服务器名称、地址及SSL/非SSL协议端口号。
网易163免费邮箱相关服务器信息:
服务器名称 | 服务器地址 | SSL协议端口号 | 非SSL协议端口号 |
---|---|---|---|
IMAP | imap.163.com | 993 | 143 |
SMTP | smtp.163.com | 454/994 | 25 |
POP3 | pop.163.com | 995 | 110 |
网易163企业邮箱相关服务器信息:(免费企业邮箱的smtp服务器名及端口号为:smtp.ym.163.com / 25)
服务器名称 | 服务器地址 | SSL协议端口号 | 非SSL协议端口号 |
---|---|---|---|
IMAP | imap.qiye.163.com | 993 | 143 |
SMTP | smtp.qiye.163.com | 994 | 25 |
POP3 | pop.qiye.163.com | 995 | 110 |
网易126免费邮箱相关服务器信息:
服务器名称 | 服务器地址 | SSL协议端口号 | 非SSL协议端口号 |
---|---|---|---|
IMAP | imap.126.com | 993 | 143 |
SMTP | smtp.126.com | 465/994 | 25 |
POP3 | pop.126.com | 995 | 110 |
腾讯QQ免费邮箱相关服务器信息:
服务器名称 | 服务器地址 | SSL协议端口号 | 非SSL协议端口号 |
---|---|---|---|
IMAP | imap.qq.com | 993 | 143 |
SMTP | smtp.qq.com | 465/587 | 25 |
POP3 | pop.qq.com | 995 | 110 |
腾讯QQ企业邮箱相关服务器信息:
服务器名称 | 服务器地址 | SSL协议端口号 | 非SSL协议端口号 |
---|---|---|---|
IMAP | imap.exmail.qq.com | 993 | 143 |
SMTP | smtp.exmail.qq.com | 465/587 | 25 |
POP3 | pop.exmail.qq.com | 995 | 110 |
谷歌Gmail邮箱相关服务器信息:
服务器名称 | 服务器地址 | SSL协议端口号 | 非SSL协议端口号 |
---|---|---|---|
IMAP | imap.gmail.com | 993 | 143 |
SMTP | smtp.gmail.com | 465 | 25 |
POP3 | pop.gmail.com | 995 | 110 |
二、代码实现
下面开始编写代码,注意QQ邮箱SMTP服务器地址:smtp.qq.com,ssl端口:465。
1. 发送纯文本邮件
以下实例你需要修改:发件人邮箱(你的QQ邮箱),密码,收件人邮箱(可发给自己)。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import smtplib
from email.header import Header
from email.mime.text import MIMEText
# ----- 需要修改的参数 -----
# email相关
sender = 'wenyuanblog@qq.com'
password = 'hjenixkwghseowyxnclh12yx8je9l2au'
smtp_server = 'smtp.qq.com'
smtp_port = 465
receivers = ['recever1@163.com', 'recever1@qq.com']
# ------------------------
def send_email(subject, detail):
now_time = time.strftime('%Y-%m-%d %H:%M:%S')
mail_msg = """
时间:{now_time}
详情:{detail}
""".format(subject=subject, now_time=now_time, detail=detail)
msg = MIMEText(mail_msg, 'plain', 'utf-8')
msg['From'] = Header('wenyuanblog汇报人 <%s>' % sender, 'utf-8')
msg['To'] = Header('wenyuanblog订阅者', 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')
try:
smtp = smtplib.SMTP_SSL(smtp_server, smtp_port)
# smtp.set_debuglevel(1) # 打印和SMTP服务器交互的所有信息
smtp.login(sender, password)
smtp.sendmail(sender, receivers, msg.as_string())
smtp.quit()
print('邮件发送成功')
except smtplib.SMTPException as e:
print('Error: 无法发送邮件')
print(e)
if __name__ == "__main__":
email_title = 'Python SMTP 纯文本邮件测试'
detail = """
欢迎访问:www.wenyuanblog.com
这里是我的博客站点,专注于Python、前端和机器学习技术的分享。
"""
send_email(email_title, detail)
2. 发送HTML格式的邮件
以下实例你需要修改:发件人邮箱(你的QQ邮箱),密码,收件人邮箱(可发给自己)。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import smtplib
from email.header import Header
from email.mime.text import MIMEText
# ----- 需要修改的参数 -----
# email相关
sender = 'wenyuanblog@qq.com'
password = 'hjenixkwghseowyxnclh12yx8je9l2au'
smtp_server = 'smtp.qq.com'
smtp_port = 465
receivers = ['recever1@163.com', 'recever1@qq.com']
# ------------------------
def send_email(subject, detail):
now_time = time.strftime('%Y-%m-%d %H:%M:%S')
mail_msg = """
<h1 style='margin-top:10px;margin-bottom:10px;text-align:center'>{subject}</h1>
<hr>
<h2 style='margin-top:0;margin-bottom:10px'>时间</h2>
<div style='margin-left: 40px'>{now_time}</div>
<hr>
<h2 style='margin-top:0;margin-bottom:10px'>详情</h2>
<div style='margin-left: 40px'>{detail}</div>
<hr>
""".format(subject=subject, now_time=now_time, detail=detail)
msg = MIMEText(mail_msg, 'html', 'utf-8')
msg['From'] = Header('wenyuanblog汇报人 <%s>' % sender, 'utf-8')
msg['To'] = Header('wenyuanblog订阅者', 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')
try:
smtp = smtplib.SMTP_SSL(smtp_server, smtp_port)
# smtp.set_debuglevel(1) # 打印和SMTP服务器交互的所有信息
smtp.login(sender, password)
smtp.sendmail(sender, receivers, msg.as_string())
smtp.quit()
print('邮件发送成功')
except smtplib.SMTPException as e:
print('Error: 无法发送邮件')
print(e)
if __name__ == "__main__":
email_title = 'Python SMTP HTML格式邮件测试'
detail = """
<div>欢迎访问:<a href="http://www.wenyuanblog.com" target="_blank">www.wenyuanblog.com</a></div>
<div style='margin-bottom:5px'>这里是我的博客站点,专注于Python、前端和机器学习技术的分享。</div>
"""
send_email(email_title, detail)
2. 发送带附件的邮件
以下实例你需要修改:发件人邮箱(你的QQ邮箱),密码,收件人邮箱(可发给自己)。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# ----- 需要修改的参数 -----
# email相关
sender = 'wenyuanblog@qq.com'
password = 'hjenixkwghseowyxnclh12yx8je9l2au'
smtp_server = 'smtp.qq.com'
smtp_port = 465
receivers = ['recever1@163.com', 'recever1@qq.com']
# ------------------------
def send_email(subject, detail, attach_list):
now_time = time.strftime('%Y-%m-%d %H:%M:%S')
mail_msg = """
时间:{now_time}
详情:{detail}
""".format(subject=subject, now_time=now_time, detail=detail)
# 创建一个带附件的实例
msg = MIMEMultipart()
# msg = MIMEText(mail_msg, 'plain', 'utf-8')
msg['From'] = Header('wenyuanblog汇报人 <%s>' % sender, 'utf-8')
msg['To'] = Header('wenyuanblog订阅者', 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')
# 邮件正文内容
msg.attach(MIMEText(mail_msg, 'plain', 'utf-8'))
# 构造附件,传送指定目录下的文件
for att_path in attach_list:
att = MIMEText(open(att_path, 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att["Content-Disposition"] = 'attachment; filename={filename}'.format(filename=att_path)
msg.attach(att)
try:
smtp = smtplib.SMTP_SSL(smtp_server, smtp_port)
# smtp.set_debuglevel(1) # 打印和SMTP服务器交互的所有信息
smtp.login(sender, password)
smtp.sendmail(sender, receivers, msg.as_string())
smtp.quit()
print('邮件发送成功')
except smtplib.SMTPException as e:
print('Error: 无法发送邮件')
print(e)
if __name__ == "__main__":
email_title = 'Python SMTP 带附件邮件测试'
detail = """
欢迎访问:www.wenyuanblog.com
这里是我的博客站点,专注于Python、前端和机器学习技术的分享。
附件是网站源码,请查收。
"""
attach_list = ['send_email.py', 'README.md']
send_email(email_title, detail, attach_list)
三、总结
以上就是通过 Python SMTP 发送邮件的代码示例,一般情况下是够用了。还有一些图片email等特殊邮件,因为需要考虑到兼容性问题,有些邮箱默认不显示图片,个人感觉不太常用,就不整理了。