如何用python进行邮件发送
使用Python调用邮件服务器发送邮件,使用的协议是SMTP(Simple Mail Transfer Protocol),下图为使用TCP/IP基于SMTP发送邮件的过程示意图:

SMTP协议工作原理:
SMTP工作在两种情况下:一是电子邮件从用户端传输到服务器:二是从某一个MTA(Message Transfer Agent)传输到另一个MTA。SMTP也是请求/响应协议,命令和响应都是基于NVT ASCII文本,并以CR和LF符结束。响应包括一个表示返回状态的三位数字代码。SMTP在TCP协议25号端口监听连续请求。
SMTP连接和发送过程
Python使用SMTP发送邮件
在python中,发送邮件主要包括email 和smtplib,其中email 实现邮件构造,smtplib实现邮件发送。在smtplib库中,主要主要用smtplib.SMTP()类,用于连接SMTP服务器,发送邮件。SMTP类中常用方法如
|
方法 |
描述 |
| SMTP.set_debuglevel(level) | 设置输出debug调试信息,默认不输出 |
| SMTP.docmd(cmd[, argstring]) | 发送一个命令到SMTP服务器 |
| SMTP.connect([host[, port]]) | 连接到指定的SMTP服务器 |
| SMTP.helo([hostname]) | 使用helo指令向SMTP服务器确认你的身份 |
| SMTP.ehlo(hostname) | 使用ehlo指令像ESMTP(SMTP扩展)确认你的身份 |
| SMTP.ehlo_or_helo_if_needed() | 如果在以前的会话连接中没有提供ehlo或者helo指令,这个方法会调用ehlo()或helo() |
| SMTP.has_extn(name) | 判断指定名称是否在SMTP服务器上 |
| SMTP.verify(address) | 判断邮件地址是否在SMTP服务器上 |
| SMTP.starttls([keyfile[, certfile]]) | 使SMTP连接运行在TLS模式,所有的SMTP指令都会被加密 |
| SMTP.login(user, password) | 登录SMTP服务器 |
| SMTP.sendmail(from_addr, to_addrs, msg, mail_options=[], rcpt_options=[]) |
发送邮件 from_addr:邮件发件人 to_addrs:邮件收件人 msg:发送消息 |
| SMTP.quit() | 关闭SMTP会话 |
| SMTP.close() | 关闭SMTP服务器连接 |
python中通过SMTP发送邮件主要包括以下几个步骤(以qq邮箱为例):
1. 开通邮箱SMTP服务,获取邮箱授权码,邮箱SMTP开通路径:邮箱设置/账户/POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

2. 编辑邮件内容,主要包括三部分内容:信封,首部和正文;其中信封包括发送邮箱,接收邮箱等;
3. 初始化配置信息,调用SMTP发送邮件
代码实现如下所示,其中python版本为3.7:
1 import smtplib
2 import email.utils
3 from email.mime.text import MIMEText
4
5 class Msg():
6 def __init__(self):
7 pass
8
9 @staticmethod
10 def creat_msg():
11 # Creat mail information
12 msg = MIMEText('Come on', 'plain', 'utf-8')
13 msg['From'] = email.utils.formataddr(('Author', 'xxxxxxxxxx@qq.com'))
14 msg['To'] = email.utils.formataddr(('Recipient', 'xxxxxxxxx@163.com'))
15 msg['Subject'] = email.utils.formataddr(('Subject', 'Good good study, day day up!'))
16
17 return msg
18
19 class EmailServer():
20 def __init__(self):
21 pass
22
23 @staticmethod
24 def config_server():
25 # Configure mailbox
26 config = dict()
27 config['send_email']= 'xxxxxxxxxx@qq.com'
28 config['passwd'] = 'xxxxxxxxxx'
29 config['smtp_server'] = 'smtp.qq.com'
30 config['target_email'] = 'xxxxxxxxxx@163.com'
31 return config
32
33 def send_email(self):
34 # Use smtp to send email to the target mailbox
35 msg = Msg.creat_msg()
36 config = self.config_server()
37
38 server = smtplib.SMTP()
39 server.connect(host=config['smtp_server'], port=25)
40 server.login(user=config['send_email'], password=config['passwd'])
41 server.set_debuglevel(True)
42
43 try:
44 server.sendmail(config['send_email'],
45 [config['target_email']],
46 msg.as_string())
47 finally:
48 server.quit()
49
50 if __name__ == '__main__':
51 emailServer = EmailServer()
52 emailServer.send_email()
发送邮件过程跟踪如下:

经过测试,从QQ邮箱向163邮箱可正常发送邮件,从163邮箱发送到QQ邮箱则会进入垃圾箱,翻阅了不少资料,目前还没有解决如何摆脱垃圾箱的困扰,如有知道的朋友,可在评论区解惑,不甚感谢~
参考文献:
(1)https://blog.51cto.com/lizhenliang/1875330
(2)TCP/IP详解卷1:协议
如何用python进行邮件发送的更多相关文章
- Python 基于Python实现邮件发送
基于Python实现邮件发送 by:授客 QQ:1033553122 测试环境: Python版本:Python 2.7 注:需要修改mimetypes.py文件(该文件可通过文章底部的网盘分 ...
- 用Python实现邮件发送Hive明细数据
代码地址如下:http://www.demodashi.com/demo/12673.html 一.需求描述 客户需要每周周一接收特定的活动数据,生成Excel或是CSV文件,并通过邮件发送给指定接收 ...
- python SMTP邮件发送(转载)
Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...
- python实现邮件发送完整代码(带附件发送方式)
实例一:利用SMTP与EMAIL实现邮件发送,带附件(完整代码) __author__ = 'Administrator'#coding=gb2312 from email.Header import ...
- python实现邮件发送
实例补充: #**************************利用STMP自动发送邮件******************************import smtplibsmtp = smtp ...
- Python SMTP邮件发送
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块: email负责构造邮件 ...
- 如何用python发邮件
python发送各类邮件的主要方法 一.相关模块介绍 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍: 1.smtplib模块 smtplib.SM ...
- 基于Python实现邮件发送
import smtplibfrom email.mime.text import MIMETextemail_host = 'smtp.163.com' # 邮箱地址email_user = 'sz ...
- Python之邮件发送
Python的smtplib提供了一种很方便的途径用来发送电子邮件,它有SMTP协议进行简单的封装,可以使用SMTP对象的sendmail方法发送邮件,通过help()查看SMTP所提供的方法如下: ...
随机推荐
- 从后端到前端之Vue(一)写个表格试试水
目录: 1.脚本式开发. 2.工程化开发 3.工程化和脚本的区别 4.来个table试试水 4,1.目标 4.2.思路 4.3.设计与编码 4.4.效果 5.业务分离 6.功能拓展——个性化设置 ...
- 1.jdk1.7到jdk1.8 Map发生了什么变化(底层)?
1.8之后hashMap的数据结构发生了变化,从之前的单纯的数组+链表结构变成数组+链表+红黑树.也就是说在JVM存储hashMap的K-V时仅仅通过key来决定每一个entry的存储槽位(Node[ ...
- 【基础算法-模拟-例题-玩具谜题】-C++
原题链接P1563 玩具谜题 这道题依然是一道模拟题目,就简单讲讲坑点: 1.有些时候在转圈的时候要用到它们站成了一个环的性质! 2.小人面朝的方向影响了它们左右的方向! 3.注意考虑顺时针逆时针与小 ...
- 自定义SSL证书实现单双向ssl认证记录
自定义SSL证书: 1.ca证书 #openssl genrsa -out ca.key 2048 #openssl req -new -key ca.key -out ca.csr #openssl ...
- 目标检测:keras-yolo3之制作VOC数据集训练指南
制作VOC数据集指南 Github:https://github.com/hyhouyong/keras-yolo3 LabelImg标注工具(windows环境下):https://github.c ...
- Orleans 知多少 | 2. 核心概念一览
Orleans 术语解读 上面这张图中包含了Orleans中的几个核心概念: Grain Silo Orleans Cluster Orleans Client 从这张图,我们应该能理清他们之间的关系 ...
- Excel催化剂开源第24波-较VBA更强大的.Net环境的正则表达式
在VBA上可以调用正则表达式库,从而编写正则表达式自定义函数,这个相信不少VBA开发者已经熟知,但VBA的VBScript正则表达式库毕竟是一个过时的产品,不像.Net那样是与时俱进的,所以两者实现出 ...
- SpringMVC面试题:什么是Servlet?
一.什么是servlet? servlet是一个Java编写的程序,此程序是基于http协议的,在服务器端(如Tomcat)运行的,是按照servlet规范编写的一个Java类.客户端发送请求至服务器 ...
- 一文带你实现RPC框架
想要获取更多文章可以访问我的博客 - 代码无止境. 现在大部分的互联网公司都会采用微服务架构,但具体实现微服务架构的方式有所不同,主流上分为两种,一种是基于Http协议的远程调用,另外一种是基于RPC ...
- sql server还原数据库(请选择用于还原的备份集)
还原数据库的时候明明选择了备份集,还是提示未选择还原的备份集 后来查了下,是因为我本地有两个数据库(2008R2和2014),对应的两个数据库实例.而还原bak是sqlserver2014的备份,我默 ...