使用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. nginx解析漏洞复现

    nginx解析漏洞复现 一.漏洞描述 该漏洞与nginx.php版本无关,属于用户配置不当造成的解析漏洞 二.漏洞原理 1. 由于nginx.conf的如下配置导致nginx把以’.php’结尾的文件 ...

  3. antd pro中如何使用mock数据以及调用接口

    antd pro的底层基础框架使用的是dva,dva采用effect的方式来管理同步化异步 在dva中主要分为3层 services  models  components models层用于存放数据 ...

  4. springboot集成shiro集成mybatis-plus、redis、quartz定时任务

    完整项目代码位于码云上,点击获取:Git地址 主要介绍一下重点配置地方: 一.application.yml文件 server: port: 8084 servlet: context-path: / ...

  5. linux初学者-MariaDB图形管理篇

     linux初学者-MariaDB图形管理篇 MariaDB不仅有文本管理方式,也有借助工具的图形管理方式.其图形管理的工具是"phpmyadmin".这个软件可以在"p ...

  6. helm安装MINIO文件服务器

    MinIO Quickstart Guide MinIO 是一个基于Apache License v2.0开源协议的对象存储服务.它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例 ...

  7. Jenkins-slave实现并行的自动化测试

    前言 上篇文章搭建了Jenkins-slave的分布式测试环境,我一直在想一个问题,使用这种模式能不能实现并发的自动化测试?我的想法是:同一套UI自动化的测试代码,是否能够通过一个Job绑定多个sla ...

  8. Linux下安装配置Jmeter5.1,并执行jmx文件

    Windows下的jmeter是GUI模式,可查看操作,但是GUI对性能的干扰比较大,所有一般压测会在Linux上运行. 下面是Linux下安装配置Jmeter5.1,并执行jmx文件的步骤, 一.安 ...

  9. 现代c++与模板元编程

    最近在重温<c++程序设计新思维>这本经典著作,感慨颇多.由于成书较早,书中很多元编程的例子使用c++98实现的.而如今c++20即将带着concept,Ranges等新特性一同到来,不得 ...

  10. js常用事件列表

    onmousedown.onmouseup 以及 onclick 事件 onmousedown, onmouseup 以及 onclick 构成了鼠标点击事件的所有部分.首先当点击鼠标按钮时,会触发 ...