python smtplib模块_Python smtplib模块详解:发送邮件

使用 Python 的 smtplib 模块来发送邮件非常简单,大部分底层的处理都由 smtplib 进行了封装,开发者只需要按照如下 3 步来发送邮件即可:

连接 SMTP 服务器,并使用用户名、密码登录服务器。

创建 EmailMessage 对象,该对象代表邮件本身。

调用代表与 SMTP 服务器连接的对象的 sendmail() 方法发送邮件。

下面程序按照上面步骤示范了如何发送邮件:

import smtplib from email.message import EmailMessage # 定义SMTP服务器地址: smtp_server = 'smtp.qq.com' # 定义发件人地址 from_addr = 'kongyeeku@qq.com' # 定义登录邮箱的密码 password = '123456' # 定义收件人地址: to_addr = 'kongyeeku@163.com' # 创建SMTP连接 #conn = smtplib.SMTP(smtp_server, 25) conn = smtplib.SMTP_SSL(smtp_server,465) conn.set_debuglevel(1) conn.login(from_addr, password) #① # 创建邮件对象 msg = EmailMessage() # 设置邮件内容 msg.set_content('您好,这是一封来自Python的邮件', 'plain', 'utf-8') # 发送邮件 conn.sendmail(from_addr, [to_addr], msg.as_string()) # 退出连接 conn.quit()

上面程序中,第 15 行、19 行和 23 行代码基本代表了使用 Python 的 smtp 模块发送邮件的 3 大核心步骤,其中 ① 号代码使用了发件人的地址和密码来登录邮箱。

关于该程序有以下几点需要说明:

程序中提供的邮箱密码是错误的,不用尝试。读者必须改为使用自己的邮箱地址和密码。

早期SMTP 服务器都采用普通的网络连接,因此默认端口是 25。但现在绝大部分 SMTP 都是基于 SSL(Secure Socket Layer)的,这样保证网络上传输的信息都是加密过的,从而使得信息更加安全。这种基于 SSL 的 SMTP 服务器的默认端口是 465。上面程序中连接的是 QQ 邮箱的基于 SSL 的 SMTP 服务器,QQ 邮箱服务器不支持普通的 SMTP。

国内有些公司的免费邮箱(比如 QQ 邮箱)默认是关闭了 SMTP 的,因此需要读者登录邮箱进行设置。

由于该程序发送的邮件太简单,邮件没有主题,而且程序在测试过程中可能会发送很多邮件,因此有些邮箱服务商会将该程序发送的邮件当成垃圾邮件。

早期 Python 2.x 提供了 email.mime、email.header、email.charset、email.encoders、email.iterators 等库来处理邮件,这些库设计得过于烦琐,用起来极为不便,因此读者应该尽快改为使用最新的 Python 库。本教程不会介绍这些过时的库。具体可参考 https://docs.python.org/3/library/email.html 页面的说明。

由于程序打开了 smtplib 调试模式(将 debuglevel 设置为 1),因此在运行该程序时,可以看到 SMTP 发送邮件的详细过程。当程序运行结束后,将可以在收件人邮箱中看到一封新邮件(可能在垃圾邮件内),如图 1 所示。

图 1 在收件人邮箱内收到了 smtplib 模块发送的邮件

上面这封邮件是最简单的,没有为该邮件设置主题、发件人名字和收件人名字,邮件内容也只是简单的文本。如果要为邮件设置主题、发件人名字和收件人名字,那么只需设置 EmailMessage 对象的相应属性即可。如果程序要将邮件内容改为 HTML 内容,那么只需将调用 EmailMessage的set_content() 方法的第二个参数设置为 html 即可。

例如,如下程序只是对 EmailMessage 进行了修改:

import smtplib from email.message import EmailMessage # 定义SMTP服务器地址: smtp_server = 'smtp.qq.com' # 定义发件人地址 from_addr = 'kongyeeku@qq.com' # 定义登录邮箱的密码 password = '123456' # 定义收件人地址: to_addr = 'kongyeeku@163.com' # 创建SMTP连接 #conn = smtplib.SMTP(smtp_server, 25) conn = smtplib.SMTP_SSL(smtp_server,465) conn.set_debuglevel(1) conn.login(from_addr, password) #① # 创建邮件对象 msg = EmailMessage() # 设置邮件内容,指定邮件内容为HTML msg.set_content('

邮件内容

' + '

您好,这是一封来自Python的邮件

' + '来自C语言中文网', 'html', 'utf-8') msg['subject'] = '一封HTML邮件' msg['from'] = '李刚 ' % from_addr msg['to'] = '新用户 ' % to_addr # 发送邮件 conn.sendmail(from_addr, [to_addr], msg.as_string()) # 退出连接 conn.quit()

该程序与上一个程序基本相似,只是在调用 set_content() 方法时将第二个参数改为了“html”。

此外,程序增加了上面 3 行代码(第 24~26 行),分别用于设置邮件主题、发件人名字和收件人名字。运行上面程序,在目标邮箱内可以看到如图 2 所示的邮件。

图 2 设置了邮件主题、发件人名字和收件人名字的 HTML 邮件

打开该邮件,将可以看到如图 3 所示的邮件内容。

图 3 HTML 邮件内容

如果希望实现图文并茂的邮件,也就是在邮件中插入图片,则首先要给邮件添加附件(不要直接在邮件中嵌入外链的图片,很多邮箱出于安全考虑,都会禁用邮件中外链的资源)。因此,如果直接在 HTML 右键中外链其他图片,那么该图片很有可能显示不出来。

为了给邮件添加附件,只需调用 EmailMessage的add_attachment() 方法即可。该方法支持很多参数,最常见的参数如下:

maintype:指定附件的主类型。比如指定 image 代表附件是图片。

subtype:指定附件的子类型。比如指定为 png,代表附件是 PNG 图片。一般来说,子类型受主类型的限制。

filename:指定附件的文件名。

cid=img:指定附件的资源 ID,邮件正文可通过资源 ID 来引用该资源。

例如,如下程序为邮件添加了 3 个附件:

import smtplib, email.utils from email.message import EmailMessage # 定义SMTP服务器地址: smtp_server = 'smtp.qq.com' # 定义发件人地址 from_addr = 'kongyeeku@qq.com' # 定义登录邮箱的密码 password = '123456' # 定义收件人地址: to_addr = 'kongyeeku@163.com' # 创建SMTP连接 #conn = smtplib.SMTP(smtp_server, 25) conn = smtplib.SMTP_SSL(smtp_server,465) conn.set_debuglevel(1) conn.login(from_addr, password) #① # 创建邮件对象 msg = EmailMessage() # 随机生成两个图片id first_id, second_id = email.utils.make_msgid(), email.utils.make_msgid() # 设置邮件内容,指定邮件内容为HTML msg.set_content('

邮件内容

' + '

您好,这是一封来自Python的邮件' + '

' + '来自C语言中文网') msg['subject'] = '一封HTML邮件' msg['from'] = '李刚 ' % from_addr msg['to'] = '新用户 ' % to_addr with open('E:/logo.jpg', 'rb') as f: # 添加第一个附件 msg.add_attachment(f.read(), maintype='image', subtype='jpeg', filename='test.png', cid=first_id) with open('E:/fklogo.gif', 'rb') as f: # 添加第二个附件 msg.add_attachment(f.read(), maintype='image', subtype='gif', filename='test.gif', cid=second_id) with open('E:/fkit.pdf', 'rb') as f: # 添加第三个附件,邮件正文不需引用该附件,因此不指定cid msg.add_attachment(f.read(), maintype='application', subtype='pdf', filename='test.pdf',) # 发送邮件 conn.sendmail(from_addr, [to_addr], msg.as_string()) # 退出连接 conn.quit()

该程序与上一个程序的最大区别在于增加了一段代码(31 行代码起),它们为邮件添加了三个附件。

由于邮件正文不需要引用第三个附件,因此程序添加第三个附件时没有指定 cid 属性。

在添加附件时指定 cid 属性之后,程序就可以在邮件正文中通过该 cid 来引用附件,如上面程序中邮件正文代码所示。运行上面程序,可以在目标邮箱内看到一封新邮件。打开该邮件,可看到邮件内容。

通过上面三个示例,可以发现使用 smtplib 模块发送邮件很简单,基本只需要连接服务器、创建邮件和发送邮件三个步骤。如果要构建复杂的邮件内容,则主要通过 EmailMessage 对象来进行设置。EmailMessage 也是 Python 3.x 对邮件处理的巨大简化,它把对邮件内容的各种处理都封装在 EmailMessage 类中,因此使得编程变得轻松、简单。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当您使用Pythonsmtplib模块发送邮件时,可能会遇到以下错误之一: - smtplib.SMTPAuthenticationError: (535, '5.7.8 Username and Password not accepted. Learn more at\n5.7.8 https://support.google.com/mail/?p=BadCredentials ') - smtplib.SMTPServerDisconnected: Connection unexpectedly closed - smtplib.SMTPSenderRefused: (501, b'5.5.4 Invalid Address ') - smtplib.SMTPRecipientsRefused: {'recipient@example.com': (550, '5.1.1 The email account that you tried to reach does not exist. Please try\n5.1.1 double-checking the recipient\'s email address for typos or\n5.1.1 unnecessary spaces. Learn more at\n5.1.1 https://support.google.com/mail/?p=NoSuchUser ') 这些错误通常表示您的SMTP服务器拒绝了您的请求。这可能是由于以下原因之一: 1. 您提供的用户名和密码不正确:请确保您的用户名和密码正确,并且您已经启用了SMTP服务。如果您使用的是Google Mail,您需要在Google账户的安全选项中允许低安全性应用程序访问您的帐户。 2. 您的IP地址被SMTP服务器阻止:如果您在短时间内多次尝试发送电子邮件,SMTP服务器可能会阻止您的IP地址。请等待一段时间后再尝试发送电子邮件。 3. 您提供的发送者或收件人地址无效:请确保您提供的发送者和收件人地址是有效的,并且符合SMTP服务器的要求。 如果您仍然无法解决此问题,请尝试使用其他SMTP服务器或与您的SMTP服务器管理员联系以获取更多帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值