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

SMTP协议工作原理:

  SMTP工作在两种情况下:一是电子邮件从用户端传输到服务器:二是从某一个MTA(Message Transfer Agent)传输到另一个MTASMTP也是请求/响应协议,命令和响应都是基于NVT ASCII文本,并以CRLF符结束。响应包括一个表示返回状态的三位数字代码。SMTPTCP协议25号端口监听连续请求。

SMTP连接和发送过程

 (1)建立TCP 连接。
   (2)客户端发送HELO命令以标识发件人自己的身份,然后客户通过发送MIAL命令标识出电子邮件的发起人;服务器端正希望以OK作为响应,表明准备接收。
   (3)客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行;服务器端则表示是否愿意为收件人接收邮件。
   (4)协商结束,发送邮件,用命令DATA发送。
   (5)以“.”号表示结束输入内容一起发送出去,结束此次发送,用QUIT命令退出。

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进行邮件发送的更多相关文章

  1. Python 基于Python实现邮件发送

    基于Python实现邮件发送   by:授客 QQ:1033553122 测试环境: Python版本:Python 2.7   注:需要修改mimetypes.py文件(该文件可通过文章底部的网盘分 ...

  2. 用Python实现邮件发送Hive明细数据

    代码地址如下:http://www.demodashi.com/demo/12673.html 一.需求描述 客户需要每周周一接收特定的活动数据,生成Excel或是CSV文件,并通过邮件发送给指定接收 ...

  3. python SMTP邮件发送(转载)

    Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...

  4. python实现邮件发送完整代码(带附件发送方式)

    实例一:利用SMTP与EMAIL实现邮件发送,带附件(完整代码) __author__ = 'Administrator'#coding=gb2312 from email.Header import ...

  5. python实现邮件发送

    实例补充: #**************************利用STMP自动发送邮件******************************import smtplibsmtp = smtp ...

  6. Python SMTP邮件发送

    SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块: email负责构造邮件 ...

  7. 如何用python发邮件

    python发送各类邮件的主要方法 一.相关模块介绍 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍:     1.smtplib模块 smtplib.SM ...

  8. 基于Python实现邮件发送

    import smtplibfrom email.mime.text import MIMETextemail_host = 'smtp.163.com' # 邮箱地址email_user = 'sz ...

  9. Python之邮件发送

    Python的smtplib提供了一种很方便的途径用来发送电子邮件,它有SMTP协议进行简单的封装,可以使用SMTP对象的sendmail方法发送邮件,通过help()查看SMTP所提供的方法如下: ...

随机推荐

  1. Jenkins Ci系列目录

    Jenkins入门篇 1.Jenkins入门之界面概览 2.Jenkins入门之新建任务 3.Jenkins入门之导航操作 4.Jenkins入门之任务基本操作 5.Jenkins入门之执行Power ...

  2. JVM(九):垃圾回收算法

    JVM(九):垃圾回收算法 在本文中,我们将从概念模型的角度探讨 JVM 是如何回收对象,包括 JVM 是如何判断一个对象已经死亡,什么时候在哪里进行了垃圾回收,垃圾回收有几种核心算法,每个算法优劣是 ...

  3. Spring Bean 的装配方式

    Spring Bean 的装配方式 装配 Bean 的三种方式 一个程序中,许多功能模块都是由多个为了实现相同业务而相互协作的组件构成的.而代码之间的相互联系又势必会带来耦合.耦合是个具有两面性的概念 ...

  4. 记录一次pycharm中,引入其他类可用,下面总是有波浪线,而且Ctrl+b 无法查看类函数的源码

    最近在玩python,发现引入其他的函数们总是有波浪线,但是能够使用,crtl+b却无法看到,非常尴尬,然后查看了原因,记录如下: This inspection detects names that ...

  5. Java面试题必备知识之ThreadLocal

    老套路,先列举下关于ThreadLocal常见的疑问,希望可以通过这篇学习笔记来解决这几个问题: ThreadLocal是用来解决什么问题的? 如何使用ThreadLocal? ThreadLocal ...

  6. 《C# 语言学习笔记》——事件

    对象可以激活事件,作为它们处理的一部分.给代码添加事件处理程序,这是一种特殊的函数,在事件发生时调用.还可以配置这个处理程序,以监听我们感兴趣的事件. 使用事件可以创建事件驱动的应用程序.许多基于Wi ...

  7. python基础之元祖、嵌套,for循环、 enumerate、range的试用案例

    元祖又叫做只读列表,可循环查询.可切片,元祖里的直接元素不能更改,但是若里面有嵌套的列表,则可以修改列表里的元素 tu = (1,2,3,'sun',[3,4,5,'cat']) tu[4][3] = ...

  8. typescript 公共,私有与受保护的修饰符

    public理解 当你在程序中没有指明修饰符时,默认为public,也就是在类内类外都可以访问,我们以下面的例子来解释. class Person{ name:string sex:string ag ...

  9. 配置没有问题,虚拟机Ubuntu系统ifconfig没有网卡信息

    如果没有问题,前几天都好好的,突然出现这个问题 sudo ifconfig etho up 其中eth0是我的网卡名称

  10. webgl图库研究(包括BabylonJS、Threejs、LayaboxJS、SceneJS、ThingJS等框架的特性、适用范围、支持格式、优缺点、相关网址)

    3D图库框架范围与示例 摘要: 为实现企业80%以上的生产数据进行智能转化,在烟草.造纸.能源.电力.机床.化肥等行业,赢得领袖企业青睐,助力企业构建AI赋能中心,实现智能化转型升级.“远舢文龙数据处 ...