python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
smtp协议的基本命令包括:
HELO 向服务器标识用户身份
MAIL 初始化邮件传输 mail from:
RCPT 标识单个的邮件接收人;常在MAIL命令后面,可有多个rcpt to:
DATA 在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化数据传输,以.结束
VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELP 查询服务器支持什么命令
NOOP 无操作,服务器应响应OK
QUIT 结束会话
RSET 重置会话,当前传输被取消
MAIL FROM 指定发送者地址
RCPT TO 指明的接收者地址
一般smtp会话有两种方式,一种是邮件直接投递,就是说,比如你要发邮件�zzz@163,那就直接连接163的邮件服务器,把信投�zzz@163; 另一种是验证过后的发信,它的过程是,比如你要发邮件�zzz@163,你不是直接投到163,而是通过自己在sina的另一个邮箱来发。这样就要先连接sina的smtp服务器,然后认证,之后在把要发到163的信件投到sina上,sina会帮你把信投递到163。
第一种方式的命令流程基本是这样:1. helo
2. mail from
3. rcpt to
4. data
5. quit
但是第一种发送方式一般有限制的,就是rcpt to指定的这个邮件接收者必须在这个服务器上存在,否则是不会接收的。 先看看代码: 代码如下:
#-*- encoding: gb2312 -*-
import os, sys, string
import smtplib
# 邮件服务器地址
mailserver = "smtp.163"
# smtp会话过程中的mail from地址
from_addr = "asfgysg@zxsdf"
# smtp会话过程中的rcpt to地址
to_addr = "zhaoweikid@163"
# 信件内容
msg = "test mail"
svr = smtplib.SMTP(mailserver)
# 设置为调试模式,就是在会话过程中会有输出信息
svr.set_debuglevel(1)
# helo命令,docmd方法包括了获取对方服务器返回信息
svr.docmd("HELO server")
# mail from, 发送邮件发送者
svr.docmd("MAIL FROM: " % from_addr)
# rcpt to, 邮件接收者
svr.docmd("RCPT TO: " % to_addr)
# data命令,开始发送数据
svr.docmd("DATA")
# 发送正文数据
svr.send(msg)
# 比如以 . 作为正文发送结束的标记,用send发送的,所以要用getreply获取返回信息
svr.send(" . ")
svr.getreply()
# 发送结束,退出
svr.quit()
注意的是,163是有反垃圾邮件功能的,想上面的这种投递邮件的方法不一定能通过反垃圾邮件系统的检测的。所以一般不推荐个人这样发送。
第二种有点不一样:
W WW.002PC .COM从python smtplib模块发送SSL/TLS安全邮件实例分析来看,对python smtplib模块发送SSL/TLS安全邮件实例的结果。
1.ehlo
2.auth login
3.mail from
4.rcpt to
5.data
6.quit
相对于第一种来说,多了一个认证过程,就是auth login这个过程。 代码如下:
#-*- encoding: gb2312 -*-
import os, sys, string
import smtplib
import base64
# 邮件服务器地址
mailserver = "smtp.163"
# 邮件用户名
username = "xxxxxx@163"
# 密码
password = "xxxxxxx"
# smtp会话过程中的mail from地址
from_addr = "xxxxxx@163"
# smtp会话过程中的rcpt to地址
to_addr = "yyyyyy@163"
# 信件内容
msg = "my test mail"
svr = smtplib.SMTP(mailserver)
# 设置为调试模式,就是在会话过程中会有输出信息
svr.set_debuglevel(1)
# ehlo命令,docmd方法包括了获取对方服务器返回信息
svr.docmd("EHLO server")
# auth login 命令
svr.docmd("AUTH LOGIN")
# 发送用户名,是base64编码过的,用send发送的,所以要用getreply获取返回信息
svr.send(base64.encodestring(username))
svr.getreply()
# 发送密码
svr.send(base64.encodestring(password))
svr.getreply()
# mail from, 发送邮件发送者
svr.docmd("MAIL FROM: " % from_addr)
# rcpt to, 邮件接收者
svr.docmd("RCPT TO: " % to_addr)
# data命令,开始发送数据
svr.docmd("DATA")
# 发送正文数据
svr.send(msg)
# 比如以 . 作为正文发送结束的标记
svr.send(" . ")
svr.getreply()
# 发送结束,退出
svr.quit()
上面说的是最普通的情况,但是不能忽略的是现在好多企业邮件是支持安全邮件的,就是通过SSL发送的邮件,这个怎么发呢?SMTP对SSL安全邮件的支持有两种方案,一种老的是专门开启一个465端口来接收ssl邮件,另一种更新的做法是在标准的25端口的smtp上增加一个starttls的命令来支持。
更多:python 文字 坐标python smtplib模块发送SSL/TLS安全邮件实例
/python/107.html
你可能感兴趣的TLS,python,SSL,smtplib,实例,模块
No alive nodes found in your cluster
0踩
赏
0 赞