一丶简单邮件传输协议 简单邮件传输协议 简单邮件传输协议 SMTP
- smtplib 模块:(在 Python3版本中,可以通过 SMTP协议发送邮件的模块常为 smtplib, 并且这个模块属于内置模块,不需要额外安装,以下为该模块常用函数介绍 )
- smtplib.SMTP(host='', port=0, local_hostname=None, [timeout,]) (实例化 SMTP对象,并可以远程 SMTP服务器进行连接;)
- host:远程 smtp主机 地
- port:远程 smtp主机端口。
- local_hostname:标示本地连接用户身份
- timeout:连接超时选项
- smtplib.SMTP_SSL(host='',port=0,local_hostname=None,keyfile=None,certfile=None,[timeout, ]context=None,) (用于连接需要 SSL安全加持才可以连接的MSTP服务器, 是现在比较常用的SMTP实例化连接方式 ;)
- host:远程 smtp主机地址。
- port:远程 smtp主机端口。
- local_hostname:标示本地连接用户身份 。
- keyfile、certfile:ssl连接时使用的 验证书及 私人秘钥文件。
- timeout:连接超时选项。
- context:ssl连接时配置选项 ;
- 参考 :https://docs.python.org/3.6/library/ssl.html#ssl.SSLContext
- SMTP实例化对象内置函数:
- SMTP.set_debuglevel(level):
- level设置实例的调试级别。
- 0,不输出任何调试信息,同时,0也是默认值。
- 1:输出每次请求的单行信息。
- 2:*别调试信息输出,记录每一行发送及接收时的命令。
- SMTP.connect(host='localhost', port=0)
- 如果在实例化 SMTP对时候,我们并没有指出连接的主机及端口地址,那么可以在后续的示例中使用该函数进行 smtp服务器的连接 ,其中参数部分为:
- host:smtp主机地址。
- port:smtp主机端口,常用主机端口为 25。
- 如果采用加密方式连接时,常端口为 465或 587
- SMTP.helo([hostname])
- 使用 helo指令向服务器确认身份,告知 smtp服务器连接者身份
- SMTP.verify(address)
- 判断 address所指向的smtp服务器是否存在 ;
- 不过出于安全考虑,一般 smtp邮件服务器都会屏蔽这个指令。
- SMTP.login(user,passwd)
- 成功连接到smtp服务器之后,可以通过该函数登录对应邮箱账号。
- user:对应 smtp服务器邮件登录用户名。
- passwd:对应 smtp服务器邮件登录密码。
- STMP.starttls(keyfiles=None,cerfile=None,context=None)
- 启用 TLS安全传输命令,之后所有的 SMTP指令在传输的时候,都会加密传输。
- SMTP.sendmail(from_addr,to_addrs,msg)
- 通过登录邮件服务器用户向目标发送。
- from_addr:发送者邮箱
- to_addrs:接收邮件的用户箱。
- 这个值可以是一有效邮箱用户列表 [ ''xx1@xx.com", 'xx2@xx.com']
- 这里需要注意的是,邮件内容有一定格式字符串 :
'From: from@xx.com \r\n' + \ #其中第一行为发件人信息;'To: to@xx.com \r\n' + \ #第二行为接收邮件用户信息;'Subject:主题 ' \r\n + \ #第三行为邮件主题;'\r\n' + \ #第四行为与邮件内容分隔的一个'\r\n';'邮件内容 ' #第五行为具体邮件内容。
- SMTP.quit()
- 断开与 smtp主机的连接 。
smtplib 发送邮件(这里要看对应服务器是否支持ssl加密,不支持就用25端口)
#发送简单的邮件.py import smtplib mail_host = 'smtp.qq.com' #qq邮箱服务器 from_addr = "1039821294@qq.com" #发送者用户 from_addr_passwd = "**************" #记住的密码并不是你的qq邮箱登录的密码,而是IMAP/SMTP服务,在第三方客户端登录时,密码框里的授权码: to_addrs = ["1039821294@qq.com","1039821294@qq.com"] #接受者用户 smtp = smtplib.SMTP_SSL(mail_host,465) #连接qq邮箱服务器,端口465 smtp.set_debuglevel(2) smtp.login(from_addr, from_addr_passwd) content = '这是一封测试邮件!' #这里是定义发送内容的变量 for to_addr in to_addrs: msg = 'From: %s\r\n' % from_addr + \ 'To: %s\r\n' % to_addr + \ 'Subject: %s\r\n' % '测试邮件' + \ '\r\n' + \ '%s' % content #记住换行要加 \ smtp.sendmail(from_addr, to_addr, msg.encode('utf-8'))运行结果:
通过 MIME标准定制邮件
MIME(Multipurpose Internet Mail Extensions)名为多用途互联网邮件扩展类型 ,可以让 可以让 我们在使用 我们在使用 我们在使用 SMTP协议进行发送邮件时,让内容更加丰富多彩。浏览器也会根据MIME格式对应支持的内容来打开一些特殊文件 , 比如图像音频HTML文件等。
- 其中 MIME Type类型 定义在邮件传输时的 Content-type Herder中,常见MIME类型格式如下:
Content-Type : type/subtype; charset='utf-8' - 其中 type对应的格式有如下:
- Text:用于 标准文本信息, 文本信息可以使多种字符集或格式的。
- Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型单独的数据
- Application:用于传输应程序数据或者二进制。
- Message:用于包装一个简单消息。
- Image:用于传输静态图片资源。
- Audio:用于传输音频 用于传输音频
- Video:用于传输视频资源
- text/plain:纯文本内容
- text/html:HTML内容
- image/gif:GIF图像
- image/jpeg:JPEG图像
- mage/png:PNG图像
- application/octet-stream:二进制数据
- application/xhtml+xml:XHTML 文档
- application/pdf:PDF文档
- application/msword:Mirosoft Word文件
- multipart/alternative:HTML邮件的 HTML形式 和纯文本形式
- application/x-www-form-urlencoded:使用 HTTP的 POST方法提交的表单
- 发送 HTML格式邮件:(常用这个)
- 发送 HTML格式邮件时,我们需要额外导入 email.mime.text模块下的 MIMEText,该类可以为我们初始化 HTML邮件数据, 之后可以很方便的通过 smtp实例进行发送 。
- email.mime.text.MIMEText(_text, _subtype='plain', _charset=None )
- _text:发送邮件的 HTML内容
- _subtype:文本类型 。
- plain:纯文本格式 纯文本格式 纯文本格式 。
- html:html格式
- _charset:邮件 HTML数据编码格式 ;为了支持中文, 常为 'utf-8'。
#发送简单的html格式邮件.py import smtplib from email.mime.text import MIMEText mail_host = 'smtp.qq.com' #qq邮箱服务器 from_addr = "1039821294@qq.com" #发送者用户 from_addr_passwd = "****************" #记住的密码并不是你的qq邮箱登录的密码,而是IMAP/SMTP服务,在第三方客户端登录时,密码框里的授权码: to_addrs = ["1039821294@qq.com","1039821294@qq.com"] #接受者用户 smtp = smtplib.SMTP_SSL(mail_host,465) #连接qq邮箱服务器,端口465 smtp.set_debuglevel(2) smtp.login(from_addr, from_addr_passwd) content = '<a href="http://www.python.org">>学习python使我快乐!<</a>' #这里是定义发送内容的变量 msg = MIMEText(content,'html','utf-8') #创建 MIME格式 HTML邮件 msg['From'] = from_addr #邮件内容中的发送人信息 msg['Subject'] = 'HTML邮件测试' #邮件主题 for to_addr in to_addrs: msg['To'] = to_addr #邮件内容中的接收人信息 smtp.sendmail(from_addr, to_addr, msg.as_string())运行结果: