python模块之smtplib: 用python发送SSL/TLS安全邮件

原文出自 http://blog.youkuaiyun.com/zhaoweikid/

    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.com,那就直接连接163.com的邮件服务器,把信投給 zzz@163.com; 另一种是验证过后的发信,它的过程是,比如你要发邮件給zzz@163.com,你不是直接投到163.com,而是通过自己在sina.com的另一个 邮箱来发。这样就要先连接sina.com的smtp服务器,然后认证,之后在把要发到163.com的信件投到sina.com上,sina.com会 帮你把信投递到163.com。
    第一种方式的命令流程基本是这样:
      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.com "
# smtp会话过程中的mail from地址
from_addr = " asfgysg@zxsdf.com "
# smtp会话过程中的rcpt to地址
to_addr = " zhaoweikid@163.com "
# 信件内容
msg = " test mail "

svr
= smtplib.SMTP(mailserver)
# 设置为调试模式,就是在会话过程中会有输出信息
svr.set_debuglevel( 1 )
# helo命令,docmd方法包括了获取对方服务器返回信息
svr.docmd( " HELO server " )
# mail from, 发送邮件发送者
svr.docmd( " MAIL FROM: <%s> " % from_addr)
# rcpt to, 邮件接收者
svr.docmd( " RCPT TO: <%s> " % to_addr)
# data命令,开始发送数据
svr.docmd( " DATA " )
# 发送正文数据
svr.send(msg)
# 比如以 . 作为正文发送结束的标记,用send发送的,所以要用getreply获取返回信息
svr.send( " . " )
svr.getreply()
# 发送结束,退出
svr.quit()


    注意的是,163.com是有反垃圾邮件功能的,想上面的这种投递邮件的方法不一定能通过反垃圾邮件系统的检测的。所以一般不推荐个人这样发送。

 

 

第二种有点不一样:
      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.com "
# 邮件用户名
username = " xxxxxx@163.com "
# 密码
password = " xxxxxxx "
# smtp会话过程中的mail from地址
from_addr = " xxxxxx@163.com "
# smtp会话过程中的rcpt to地址
to_addr = " yyyyyy@163.com "
# 信件内容
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: <%s> " % from_addr)
# rcpt to, 邮件接收者
svr.docmd( " RCPT TO: <%s> " % to_addr)
# data命令,开始发送数据
svr.docmd( " DATA " )
# 发送正文数据
svr.send(msg)
# 比如以 . 作为正文发送结束的标记
svr.send( " . " )
svr.getreply()
# 发送结束,退出
svr.quit()

   
    上面说的是最普通的情况,但是不能忽略的是现在好多企业邮件是支持安全邮件的,就是通过SSL发送的邮件,这个怎么发呢?SMTP对SSL安全邮件的支持 有两种方案,一种老的是专门开启一个465端口来接收ssl邮件,另一种更新的做法是在标准的25端口的smtp上增加一个starttls的命令来支 持。
    看看第一种怎么办:

# -*- encoding: gb2312 -*-
import os, sys, string, socket
import smtplib


class SMTP_SSL (smtplib.SMTP):
    
def __init__ (self, host = '' , port = 465 , local_hostname = None, key = None, cert = None):
         self.cert
= cert
         self.key
= key
         smtplib.SMTP.
__init__ (self, host, port, local_hostname)
        
    
def connect(self, host = ' localhost ' , port = 465 ):
        
if not port and (host.find( ' : ' ) == host.rfind( ' : ' )):
             i
= host.rfind( ' : ' )
            
if i >= 0:
                 host, port
= host[:i], host[i + 1 :]
                
try : port = int(port)
                
except ValueError:
                    
raise socket.error, " nonnumeric port "
        
if not port: port = 654
        
if self.debuglevel > 0: print >> stderr, ' connect: ' , (host, port)
         msg
= " getaddrinfo returns an empty list "
         self.sock
= None
        
for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
             af, socktype, proto, canonname, sa
= res
            
try :
                 self.sock
= socket.socket(af, socktype, proto)
                
if self.debuglevel > 0: print >> stderr, ' connect: ' , (host, port)
                 self.sock.connect(sa)
                
# 新增加的创建ssl连接
                 sslobj = socket.ssl(self.sock, self.key, self.cert)
            
except socket.error, msg:
                
if self.debuglevel > 0:
                    
print >> stderr, ' connect fail: ' , (host, port)
                
if self.sock:
                     self.sock.close()
                 self.sock
= None
                
continue
            
break
        
if not self.sock:
            
raise socket.error, msg

        
# 设置ssl
         self.sock = smtplib.SSLFakeSocket(self.sock, sslobj)
         self.file
= smtplib.SSLFakeFile(sslobj);

         (code, msg)
= self.getreply()
        
if self.debuglevel > 0: print >> stderr, " connect: " , msg
        
return (code, msg)
        
if __name__ == ' __main__ ' :
     smtp
= SMTP_SSL( ' 192.168.2.10 ' )
     smtp.set_debuglevel(
1 )
     smtp.sendmail(
" zzz@xxx.com " , " zhaowei@zhaowei.com " , " xxxxxxxxxxxxxxxxx " )
     smtp.quit()

   
    这里我是从原来的smtplib.SMTP派生出了新的SMTP_SSL类,它专门来处理ssl连接。我这里测试的192.168.2.10是我自己的测试服务器.
    第二种是新增加了starttls的命令,这个很简单,smtplib里就有这个方法,叫smtplib.starttls()。当然,不是所有的邮件系 统都支持安全邮件的,这个需要从ehlo的返回值里来确认,如果里面有starttls,才表示支持。相对于发送普通邮件的第二种方法来说,只需要新增加 一行代码就可以了:

# -*- encoding: gb2312 -*-
import os, sys, string
import smtplib
import base64

# 邮件服务器地址
mailserver = " smtp.163.com "
# 邮件用户名
username = " xxxxxx@163.com "
# 密码
password = " xxxxxxx "
# smtp会话过程中的mail from地址
from_addr = " xxxxxx@163.com "
# smtp会话过程中的rcpt to地址
to_addr = " yyyyyy@163.com "
# 信件内容
msg = " my test mail "

svr
= smtplib.SMTP(mailserver)
# 设置为调试模式,就是在会话过程中会有输出信息
svr.set_debuglevel( 1 )
# ehlo命令,docmd方法包括了获取对方服务器返回信息,如果支持安全邮件,返回值里会有starttls提示
svr.docmd( " EHLO server " )
svr.starttls()  
# <------ 这行就是新加的支持安全邮件的代码!
#
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: <%s> " % from_addr)
# rcpt to, 邮件接收者
svr.docmd( " RCPT TO: <%s> " % to_addr)
# data命令,开始发送数据
svr.docmd( " DATA " )
# 发送正文数据
svr.send(msg)
# 比如以 . 作为正文发送结束的标记
svr.send( " . " )
svr.getreply()
# 发送结束,退出
svr.quit()


注意: 以上的代码为了方便我都没有判断返回值,严格说来,是应该判断一下返回的代码的,在smtp协议中,只有返回代码是2xx或者3xx才能继续下一步,返回4xx或5xx的,都是出错了。

OpenClaw 超级 AI 实战专栏【实战案例】(五)邮件收发 + 日历日程 + 文件管理一站式搞定 OpenClaw 实现办公自动化核心是模块解耦:邮件收发、文件管理、日历日程各自封装,便于维护和扩展;开发中需重点解决编码兼容、权限配置、时间格式、重复处理四大类坑点,核心思路是 “提前校验 + 异常兜底 + 统一格式”;敏感信息(邮箱密码、API Token)务必通过.env管理,避免硬编码泄露。 阅读详情

相关推荐

nRF52840 低功耗蓝牙开发指南:从硬件架构到物联网应用实战

本文深入解析nRF52840低功耗蓝牙芯片的硬件架构与开发实践,涵盖从开发环境搭建到BLE协议栈开发的详细指南。通过实战案例分享低功耗优化技巧,帮助开发者高效实现物联网应用,特别适合智能家居和工业场景。

d3e4f的博客 417

Python smtplib.SMTP()和smtplib.SMTP_SSL() 登录邮箱并发送邮件比较

邮件发送流程 邮件的发送是主动行为:主要通过 MUA/邮件客户端软件,将邮件内容发送给对应的服务器 暂存到投递服务区,然后由当前运营商根据邮件特征信息将邮件转发给目标服务器的投递服 务区,此时目标用户的邮件已经发送完成,等待对方收取即可。 邮件的收取也是主动行为,用户可以打开邮件客户端软件,通过点击类似于收取这样的行为 就可以从自己邮箱所属的服务器投递区中提取邮件了。 什么是POPO3、SMTP和IMAP?服务器地址和端口是什么?返回   POP3   POP...

helloxiaozhe的博客 2万+

国产AI芯动力:复旦微FMQL100TAI900 FPGA原型验证板全解析

本文全面解析了复旦微FMQL100TAI900 FPGA原型验证板在国产AI硬件领域的创新突破。该板卡采用全栈国产化设计,具备出色的AI推理性能、视频处理能力和接口生态,特别适合工业质检、智能交通等场景。文章详细介绍了其芯片架构、存储子系统、接口扩展及电源设计,并分享了实战开发经验,为开发者提供了一套可靠的国产计算平台解决方案。

weixin_29250573的博客 457

TC企业邮Python3 SMPT SSL 发件脚本

#!/usr/bin/python3 import smtplib from email import encoders from email.header import Header from email.mime.text import MIMEText from email.mime.multipart import MIM...

weixin_34234829的博客 139

Pixhawk变砖自救指南:从DFU模式到固件重刷全流程(附2.4.8实测)

本文详细介绍了Pixhawk飞控变砖后的自救方法,从DFU模式进入、固件重刷到高级恢复技巧全流程。特别针对国产版本boot0引脚未引出的特殊情况提供了解决方案,帮助用户通过QGC或Mission Planner地面站工具恢复飞控功能,适用于2.4.8等常见固件版本。

weixin_29168813的博客 338

如何玩转腾讯云轻量级服务器(新手向)

如何玩转腾讯云轻量级服务器(新手向) ​ 相信不少同学都想将自己的服务器部署到云服务器,让别人通过自己的域名就可以访问到自己的项目,而腾讯云轻量级服务器作为一个小型的应用,支持域名解析和可视化运维等。比较适合新手入门 ​ 本文服务器操作系统为Centos7 一. 购买以及基本配置 1.购买方式 ​ 本文主要面向新手,毕竟一般只有新手才会购买轻量级服务器。所以可以选择购买一年的来学习,以后再根据需要换,前提提示(轻量级服务器没有安全组的,开放端口直接开启防火墙里的即可) ​ 购买连接 购买完成后点击控制

qq_46160687的博客 1万+

Python使用SMTP协议实现邮件发送(含明文/SSL加密/TLS加密)

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。 Python对SMTP支持有smtplib和email两个模块 email负责构造邮件 smtplib负责发送邮件 一、基本环境设置 以下笔者测试使用163邮箱给foxmail邮箱发邮件,所以需要手动对发送方邮箱配置SMTP协议,其余邮箱操作同理。 首先,登录到163邮箱,然后在...

SL_World的博客 7549

从零搭建高通8255车载开发环境:QNX SDP、SDK配置与镜像编译全流程

本文详细介绍了如何从零搭建高通SA8255P车载开发环境,涵盖QNX SDP部署、SDK工具链配置到多系统镜像编译的全流程。特别针对SAIL安全岛镜像构建、QNX系统优化及Android系统资源分配等关键技术点提供实战指导,帮助开发团队高效完成车载系统开发与调试。

weixin_33582311的博客 364

如何使用Python发送带(附件)的邮件

1、首先要理解一个常识(RFC) RFC(The Request for Comments)是一个关于Internet各种标准的文档,定义了很多的网络协议和数据格式,标准的Internet邮件遵从RFC2822(Internet Message Format)等几个文档,其中R

Yatere的天平秤 2308

【车载以太网】【架构】整体架构与协议标准

车载以太网架构图 应用层:DHCP /SOMEIP/DoIP/XCP/UDPNM 传输层:TCP/IP 网络层:IPv4/IPv6/ARP/ICMP 链路层:IEEE Ethernet MAC+VLAN 物理层:Ethernet PHY: 100BASE-T1/1000BASE-T1/100BASE-Tx

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 8356

复现论文《孤岛微电网环境下基于物理模型引导的深度强化学习VSG频率控制方法》

本文提出了一种结合物理模型与深度强化学习的孤岛微电网VSG频率控制方法。通过建立VSG小信号模型并设计可变系数控制器,将物理知识融入深度强化学习框架,解决了高维参数和机组耦合带来的控制难题。复现代码实现了三个核心组件:VSGSmallSignalModel建模VSG动态特性,VariableCoefficientController实现参数自适应调节,PhysicsGuidedDRL整合DQN算法与物理模型引导的奖励机制。该方法通过模型驱动与数据驱动的优势互补,提升了频率控制性能,其中物理模型既作为先验知识

huanghm88的专栏 127

python发送各类QQ邮件 —— smtplib与email模块

SMTP是发送邮件的协议,Python 2.3版本开始内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。本文以QQ邮件为例,用python发送各类邮件。 Python对SMTP支持主要使用smtplib和email两个模块,email模块负责构造邮件,smtplib模块负责发送邮件。 一、 传输简单邮件 smtplib模块 1. SMTP类定义 smtplib.SMTP([host[,port[,local_hostname[,timeout]]]]) 作为SMTP的构

Hehuyi_In的博客 1万+

【GameFramework框架内置模块】17、声音(Sound)

声音(Sound)模块是管理音频的模块,比如播放、停止、修改音量等,支持淡入淡出、AudioMixer等高级设置。声音(Sound)的配置面板如下所示:所有的声音统一按照组来分,可以根据需要添加或者溢出组,声音组可以配置Agent的数量和音量等。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1912

Python smtplib 模块:邮件发送的全方位指南

SMTP 是用于在网络上传输电子邮件的标准协议。它定义了邮件客户端与邮件服务器之间,以及邮件服务器与邮件服务器之间如何进行通信和传递邮件。客户端通过 SMTP 协议将邮件发送到发件人的邮件服务器,然后邮件服务器再将邮件转发到收件人的邮件服务器。smtplib模块实现了 SMTP 客户端协议,允许 Python 程序连接到 SMTP 服务器,并发送电子邮件。通过该模块,我们可以创建 SMTP 客户端对象,进行身份验证,构建邮件内容,最终将邮件发送出去。smtplib。

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 1669

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Python 第三方模块之 smtplib

一、python对SMTP的支持 SMTP(Simple Mail Transfer Protocol)是简单传输协议,它是一组用于用于由源地址到目的地址的邮件传输规则。 python中对SMTP进行了简单的封装,可以发送纯文本邮件、HTML邮件以及带附件的邮件。两个核心模块如下: email模块:负责构建邮件 smtplib模块:负责发送邮件 python创建SMTP对象语法如下: import smtplib smtpObj = smtplib.SMTP( [host [, port [,

fenglepeng的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: Firehol - linux下的防火墙
下一篇: python模块之poplib: 用pop3收取邮件
pythoner
博客等级 码龄18年 15粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值