知行编程网知行编程网  2022-12-01 02:00 知行编程网 隐藏边栏  30 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于如何使用python发邮件的相关知识,希望可以帮到处于编程学习途中的小伙伴

如何使用python发送邮件

简单邮件传输协议 (SMTP) 是一种用于在邮件服务器之间发送电子邮件和路由电子邮件的协议。

Python 提供了 smtplib 模块,它定义了一个 SMTP 客户端会话对象,该对象可用于使用 SMTP 或 ESMTP 侦听器守护程序将邮件发送到任何互联网机器。

下面是创建 SMTP 对象的简单语法,稍后将展示如何使用它发送电子邮件:

import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

这里是上面语法的参数细节:

host - 这是运行 SMTP 服务器的主机。你可以指定主机的 IP 地址或域名,如 yiibai.com。这是一个可选参数。

端口 - 如果提供了主机参数,则需要指定 SMTP 服务器侦听的端口。通常该端口的默认值为:25。

local_hostname - 如果 SMTP 服务器在本地计算机上运行,​​你只能指定 localhost 选项。

SMTP对象有一个sendmail实例方法,通常用来执行发送邮件的工作。它需要三个参数:

sender - 具有发件人地址的字符串。

receivers - 字符串列表,每个收件人一个。

message - 作为格式如在各种RFC中指定的字符串。

1. 使用Python发送纯文本电子邮件

示例

下面是使用 Python 脚本发送电子邮件的简单方法:

#!/usr/bin/python3import smtplib
sender = 'from@fromdomain.com'receivers = ['to@todomain.com']
message = """From: From Person <from@fromdomain.com>
To: To Person <to@todomain.com>
Subject: SMTP e-mail test
This is a test e-mail message.
"""try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"except SMTPException:   print "Error: unable to send email"

在这里,发送了一封基本的电子邮件,使用三重引号,注意正确格式化标题。电子邮件需要 From、To 和 Subject 标头,并用空行与电子邮件正文分开。

要发送邮件,请使用 smtpObj 连接到本地计算机上的 SMTP 服务器。然后使用带有消息、发件人地址和目标地址作为参数的 sendmail 方法(即使发件人和地址在电子邮件本身中,这些并不总是用于路由邮件)。

如果你的本地计算机上没有运行 SMTP 服务器,你可以使用 smtplib 客户端与远程 SMTP 服务器通信。除非你使用网络邮件服务,例如 gmail 或 Yahoo!邮件,如果可以,你的电子邮件提供商必须向你提供邮件服务器的详细信息。以腾讯QQ邮箱为例,具体如下:

mail = smtplib.SMTP('smtp.qq.com', 587) # 端口465或587

2. 使用Python发送HTML电子邮件

使用 Python 发送电子邮件时,所有内容都被视为纯文本。即使你在短信中包含 HTML 标签,它也将显示为简单文本,并且不会根据 HTML 语法对 HTML 标签进行格式化。但是,Python 提供了将 HTML 消息作为 HTML 消息发送的选项。

发送电子邮件时,你可以指定用于发送 HTML 电子邮件的 Mime 版本、内容类型和字符集。

以下是将HTML内容作为电子邮件发送的示例:

#!/usr/bin/python3import smtplib
message = """From: From Person <from@fromdomain.com>
To: To Person <to@todomain.com>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test
This is an e-mail message to be sent in HTML format
<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"except SMTPException:   
   print "Error: unable to send email"

3. 发送附件作为电子邮件

要发送包含混合内容的电子邮件,需要将 Content-type 标头设置为 multipart/mixed。然后,可以在边界内指定文本和附件部分。

以两个连字符开头后跟唯一编号的边界不能出现在电子邮件的消息部分中。表示电子邮件最后部分的最后一个边界也必须以两个连字符结尾。

附件应使用 pack("m") 功能进行编码,以便在传输前具有 base 64 编码。

4. 发送示例

首先我们要知道使用python代理登录qq邮箱发送邮件需要更改我们qq邮箱的设置。这里需要做两件事:打开邮箱的SMTP功能,获取授权码。那我们就来看看如何改模板代码,使用Python登录QQ邮箱,发送QQ邮件。

注意:也可以使用其他服务商的 SMTP 访问(QQ、网易、Gmail等)。

使用QQ邮件发送邮件之前如何设置授权码,参考:

http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256

4.1 发送一纯文本邮件到指定邮件

#! /usr/bin/env python
#coding=utf-8
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
#qq邮箱smtp服务器
host_server = 'smtp.qq.com'
#sender_qq为发件人的qq号码
sender_qq = '7697****@qq.com'
#pwd为qq邮箱的授权码
pwd = '****kenbb***' 
## xh**********bdc
#发件人的邮箱
sender_qq_mail = '7697****@qq.com'
#收件人邮箱
receiver = 'yiibai.com@gmail.com'
#邮件的正文内容
mail_content = '你好,这是使用python登录qq邮箱发邮件的测试'
#邮件标题
mail_title = 'Maxsu的邮件'
#ssl登录smtp = SMTP_SSL(host_server)
#set_debuglevel()是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式
smtp.set_debuglevel(1)
smtp.ehlo(host_server)
smtp.login(sender_qq, pwd)
msg = MIMEText(mail_content, "plain", 'utf-8')
msg["Subject"] = Header(mail_title, 'utf-8')
msg["From"] = sender_qq_mail
msg["To"] = receiver
smtp.sendmail(sender_qq_mail, receiver, msg.as_string())
smtp.quit()

执行以上代码后,登录邮箱接收邮件。这里接收邮件的账号是:yiibai.com@gmail.com,登录http://gmail.com应该可以看到收到的邮件。

注意:有时可能会被认为是垃圾邮件,如果你找不到,可以从“垃圾邮件”中查看。

4.2 给多个人发送邮件

#! /usr/bin/env python
#coding=utf-8
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
#qq邮箱smtp服务器
host_server = 'smtp.qq.com'
#sender_qq为发件人的qq号码
sender_qq = '7697****@qq.com'
#pwd为qq邮箱的授权码
pwd = 'h**********bdc' 
## h**********bdc
#发件人的邮箱
sender_qq_mail = '7697****@qq.com'
#收件人邮箱
receivers = ['yiibai.com@gmail.com','****su@gmail.com']
#邮件的正文内容
mail_content = '你好,这是使用python登录qq邮箱发邮件的测试'
#邮件标题
mail_title = 'Maxsu的邮件'
#ssl登录
smtp = SMTP_SSL(host_server)
#set_debuglevel()是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式
smtp.set_debuglevel(1)
smtp.ehlo(host_server)
smtp.login(sender_qq, pwd)
msg = MIMEText(mail_content, "plain", 'utf-8')
msg["Subject"] = Header(mail_title, 'utf-8')
msg["From"] = sender_qq_mail
msg["To"] = Header("接收者测试", 'utf-8') 
## 接收者的别名
smtp.sendmail(sender_qq_mail, receivers, msg.as_string())
smtp.quit()

执行以上代码后,登录邮箱接收邮件。这里接收邮件的账号是:yiibai.com@gmail.com,登录http://gmail.com应该可以看到收到的邮件。

4.3 使用Python发送HTML格式的邮件

Python 发送 HTML 格式的邮件与发送纯文本消息的区别在于 MIMEText 中的 _subtype 设置为 html。代码如下:

#! /usr/bin/env python
#coding=utf-8
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
#qq邮箱smtp服务器
host_server = 'smtp.qq.com'
#sender_qq为发件人的qq号码
sender_qq = '7697****@qq.com'
#pwd为qq邮箱的授权码
pwd = '***bmke********' 
#发件人的邮箱
sender_qq_mail = '7697****@qq.com'
#收件人邮箱
receiver = 'yiibai.com@gmail.com'
#邮件的正文内容
mail_content = "你好,
<p>
这是使用python登录qq邮箱发送HTML格式邮件的测试:
</p>
<p>
<a href='http://www.yiibai.com'>易百教程</a>
</p>"
#邮件标题
mail_title = 'Maxsu的邮件'
#ssl登录
smtp = SMTP_SSL(host_server)
#set_debuglevel()是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式
smtp.set_debuglevel(1)
smtp.ehlo(host_server)
smtp.login(sender_qq, pwd)
msg = MIMEText(mail_content, "html", 'utf-8')
msg["Subject"] = Header(mail_title, 'utf-8')
msg["From"] = sender_qq_mail
msg["To"] = Header("接收者测试", 'utf-8') 
## 接收者的别名
smtp.sendmail(sender_qq_mail, receiver, msg.as_string())
smtp.quit()

执行以上代码后,登录邮箱接收邮件。这里接收邮件的账号是:yiibai.com@gmail.com,登录http://gmail.com应该可以看到收到的邮件。

4.4 Python发送带附件的邮件

发送带附件的邮件,首先创建一个MIMEMultipart()实例,然后构造附件,如果有多个附件依次构造,最后使用smtplib.smtp发送。

实现代码如下所示:

#! /usr/bin/env python
#coding=utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
#qq邮箱smtp服务器
host_server = 'smtp.qq.com'
#sender_qq为发件人的qq号码
sender_qq = '7697****@qq.com'
#pwd为qq邮箱的授权码
pwd = '*****mkenb****' 
#发件人的邮箱
sender_qq_mail = '7697****@qq.com'
#收件人邮箱
receiver = 'yiibai.com@gmail.com'
#邮件的正文内容
mail_content = "你好,
<p>
这是使用python登录qq邮箱发送HTML格式邮件的测试:
</p>
<p>
<a href='http://www.yiibai.com'>易百教程</a></p>"
#邮件标题
mail_title = 'Maxsu的邮件'
#邮件正文内容
msg = MIMEMultipart()
msg = MIMEText(mail_content, "plain", 'utf-8')
msg["Subject"] = Header(mail_title, 'utf-8')
msg["From"] = sender_qq_mail
msg["To"] = Header("接收者测试", 'utf-8') 
## 接收者的别名
#邮件正文内容
msg.attach(MIMEText(mail_content, 'html', 'utf-8')) 
# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open('attach.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="attach.txt"'msg.attach(att1) 
# 构造附件2,传送当前目录下的 runoob.txt 文件
att2 = MIMEText(open('yiibai.txt', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="yiibai.txt"'msg.attach(att2)
#ssl登录
smtp = SMTP_SSL(host_server)
#set_debuglevel()是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式
smtp.set_debuglevel(1)
smtp.ehlo(host_server)
smtp.login(sender_qq, pwd)
smtp.sendmail(sender_qq_mail, receiver, msg.as_string())
smtp.quit()

执行以上代码后,登录邮箱接收邮件。这里接收邮件的账号是:yiibai.com@gmail.com,登录http://gmail.com应该可以看到收到的邮件。

4.5.在 HTML 文本中添加图片

在邮件的HTML文本中,一般的邮件服务商添加外部链接是无效的,所以要发送带图片的邮件内容,可以参考下面的示例代码实现:

#! /usr/bin/env python
#coding=utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
#qq邮箱smtp服务器
host_server = 'smtp.qq.com'
#sender_qq为发件人的qq号码
sender_qq = '7697****3@qq.com'
#pwd为qq邮箱的授权码
pwd = 'h******mk*****' 
##发件人的邮箱sender_qq_mail = '7697****3@qq.com'
#收件人邮箱receiver = ['yiibai.com@gmail.com','h****u@qq.com']
#邮件的正文内容mail_content = ""
#邮件标题mail_title = 'Maxsu的邮件'
#邮件正文内容#
msg = MIMEMultipart()msg = MIMEMultipart('related')
msg["Subject"] = Header(mail_title, 'utf-8')
msg["From"] = sender_qq_mail
msg["To"] = Header("接收者测试", 'utf-8') ## 接收者的别名
msgAlternative = MIMEMultipart('alternative')
msg.attach(msgAlternative)#邮件正文内容mail_body = """
 <p>你好,Python 邮件发送测试...</p>
 <p>这是使用python登录qq邮箱发送HTML格式和图片的测试邮件:</p>
 <p><a href='http://www.yiibai.com'>易百教程</a></p>
 <p>图片演示:</p>
 <p>![](cid:send_image)</p>
"""#msg.attach(MIMEText(mail_body, 'html', 'utf-8'))
msgText = (MIMEText(mail_body, 'html', 'utf-8'))
msgAlternative.attach(msgText) 
# 指定图片为当前目录fp = open('my.png', 'rb')
msgImage = MIMEImage(fp.read())
fp.close() 
# 定义图片 ID,在 HTML 文本中引用msgImage.add_header('Content-ID', '<send_image>')
msg.attach(msgImage)
#ssl登录
smtp = SMTP_SSL(host_server)
#set_debuglevel()是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式
smtp.set_debuglevel(1)
smtp.ehlo(host_server)
smtp.login(sender_qq, pwd)
smtp.sendmail(sender_qq_mail, receiver, msg.as_string())
smtp.quit()

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享