些项目可能需要我们通过代码的方式来发送邮件,比如在后台给客户批量发送邮件,或者,我们也可以通过代码给自己发送提醒邮件,比如触发了某些事件需要我们亲自去操作的时候,就可以使用代码直接给自己发送一封预警邮件等等。
那么,如何使用 Python 来发送邮件呢?
在此之前,我们先来简单的了解一下:
我们知道在互联网中常用的协议是 HTTP,这样我们的浏览器才能获取到服务器的网页内容,同样的 SMTP 也是一种常见的互联网应用层传输协议,不同的是,这种类型是专门用来处理邮件的。
一般情况下,你在发送邮件的时候,并不是直接就把你写的内容发送到对方的收件箱中,它会先发送给 smtp 服务器进行处理,然后发送到对应的服务器中,比如 Gmail,然后 Gmail 就会下载邮件,把它放到收件人的邮箱里面去。
在 Python 中有一个 smtpd 模块,我们可以使用它在本地开启一个 SMTP 服务,像这样:
python -m smtpd -c DebuggingServer -n localhost:1088
这样我们就可以在本地测试邮件的发送了。
当然,我们并不需要自己创建 SMTP 服务,不同的邮件厂商都有提供它们的 STMP 服务地址,比如 Gmail 的就是 smtp.gmail.com:
知道了什么是 smtp 之后,我们就可以使用 Python 来发送邮件了。
在 Python 中有一个内置的 smtplib 库,你可以使用它来连接 smtp 服务器,像刚刚小帅b给你看到的本地测试,发送信息给 stmp 服务就是这样操作的:
smtpObj=smtplib.SMTP(host='localhost',port=1088
smtpObj.sendmail(sender_mail,receivers_mail, message)
我们在发送邮件的时候,是有一定的标准的,它怎么去区分要发的内容是纯文本,还是含有 HTML,或者是附件呢,所以有一个 MIME 的标准,通过这个标准我们可以指定发送不同的邮件类型。
在 Python 里面有一个 email 库,我们可以使用它来构造 MIME massgae,然后通过 smtplib 来发送。
from email.mime.multipart
import MIMEMultipart
from email.mime.text import MIMEText
接下来,我们来使用 Python 在 Gmail 给别人发送一个「帅b老仙来啦」的纯文本邮件试试吧。
因为我们要使用的是 Gmail ,所以有两个点需要先注意一下,第一个你懂的,需要做一下代理,你可以先安装一波 PySocks,然后这样来让 smtp 使用 socks 代理:
import socks
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', 1080)
socks.wrapmodule(smtplib)
第二个是 Google 为了你的安全,不会轻易让你在别的地方登陆你的 Gmail 账号,所以你需要在设置那里,把低安全性应用访问权限打开。
好了,导入相关的库并开启代理:
定义好你的收发邮件地址,以及你要发的内容:
构造 MIME:
连接 Gamil 的 smtp 服务,开启 tls 加密,登陆然后发送一波:
运行一波,没什么问题的话对方就会收到你发的邮件啦:
刚刚,我们这里 「MIMEText(content, 'plain', 'utf-8')」中指定的是 plain,说明邮件是纯文本,那么如果我们要发送的邮件内容是 HTML 呢?
我们只需要定义 HTML 语言,然后在 MIMEText 传入 html 就可以了,像这样:
这样收到的邮件就是 HTML 的内容了:
如果你和我一样用的是 Gmail,那我还要告诉你一个不错的东西,有一个第三方库封装好了的 Python 邮件发送,你甚至可以一行代码实现邮件的发送。
安装:
pip install yagmail
发送:
yagmail.SMTP(me,password).send(to, '帅b来啦!!', '来了来了')
结果:
你还可以使用它快速实现批量发送,像这样:
ok,以上就是小帅b今天给你带来的分享,希望对你有帮助,那么我们下回见,peace
我以前在通过Python实现自动化邮件功能的时候是这样的:
import smtplib from email.mime.text import MIMEText from email.header import Header # 发送邮箱服务器 smtpserver='smtp.sina.com' # 发送邮箱用户/密码 user='username@sina.com' password='123456' # 发送邮箱 sender='username@sina.com' # 接收邮箱 receiver='receive@126.com' # 发送邮件主题 subject='Python email test' # 编写HTML类型的邮件正文 msg=MIMEText('<html><h1>你好!</h1></html>','html','utf-8') msg['Subject']=Header(subject, 'utf-8') # 连接发送邮件 smtp=smtplib.SMTP() smtp.connect(smtpserver) smtp.login(user, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit()
其实,这段代码也并不复杂,只要你理解使用过邮箱发送邮件,那么以下问题是你必须要考虑的:
github项目地址: https://github.com/kootenpv/yagmail
pip install yagmail
import yagmail #链接邮箱服务器 yag=yagmail.SMTP( user="user@126.com", password="1234", host='smtp.126.com') # 邮箱正文 contents=['This is the body, and here is just text http://somedomain/image.png', 'You can find an audio file attached.', '/local/path/song.mp3'] # 发送邮件 yag.send('taaa@126.com', 'subject', contents)
总共四行代码搞定,是不是比上面的例子简单太多了。
yag.send(['aa@126.com','bb@qq.com','cc@gmail.com'], 'subject', contents)
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
作者:星安果
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
http://t.cn/A6Zvjdun
邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到
我们都知道 Python内置了对 SMTP 的支持,可以发送纯文本、富文本、HTML 等格式的邮件
本文将聊聊利用 Python 发送邮件的 3 种方式
以 126 邮箱为例,在编码之前,我们需要开启 SMTP 服务
然后,手动新增一个授权码
其中,账号、授权码和服务器地址用于连接登录邮箱服务器
smtplib是 Python 自带的依赖库,可以直接导入使用首先,通过邮箱账号、授权码、邮箱服务器地址初始化一个 SMTP 实例,然后进行连接
def __init__(self):
# 初始化
self.smtp=smtplib.SMTP()
# 连接邮箱服务器地址
self.smtp.connect('smtp.126.com')
# 加入主题和附件,邮件体
self.email_body=MIMEMultipart('mixed')
# 发件人地址及授权码
self.email_from_username='**@126.com'
self.email_from_password='授权码'
# 登录
self.smtp.login(self.email_from_username, self.email_from_password)
然后,将收件人列表、邮件标题、邮件正文内容、附件路径及附件文件名加入到上面定义的邮件体中
def generate_email_body(self, email_to_list, email_title, email_content, attchment_path, files):
"""
组成邮件体
:param email_to_list:收件人列表
:param email_title:邮件标题
:param email_content:邮件正文内容
:param attchment_path:附件的路径
:param files:附件文件名列表
:return:
"""
self.email_body['Subject']=email_title
self.email_body['From']=self.email_from_username
self.email_body['To']=",".join(email_to_list)
for file in files:
file_path=attchment_path + '/' + file
if os.path.isfile(file_path):
# 构建一个附件对象
att=MIMEText(open(file_path, 'rb').read(), 'base64', 'utf-8')
att["Content-Type"]='application/octet-stream'
att.add_header("Content-Disposition", "attachment", filename=("gbk", "", file))
self.email_body.attach(att)
text_plain=MIMEText(email_content, 'plain', 'utf-8')
self.email_body.attach(text_plain)
接着,就可以使用 SMTP 实例对象,将邮件发送出去
# 收件人列表
email_to_list=['收件人1地址','收件人2地址']
# 发送邮件
# 注意:此处必须同时指定发件人与收件人,否则会当作垃圾邮件处理掉
self.smtp.sendmail(self.email_from_username, email_to_list, self.email_body.as_string())
邮件发送完毕之后,退出服务即可
def exit(self):
"""
退出服务
:return:
"""
self.smtp.quit()
Zmail 项目创建目的是,使邮件处理变得更简单
使用 Zmail 发送接收邮件方便快捷,不需要手动添加服务器地址、端口以及适合的协议,可以轻松创建 MIME 对象和头文件
注意:Zmail 仅支持 Python3,不支持 Python2
首先,安装依赖库
# 安装依赖库
pip3 install zmail
然后,使用邮箱账号、授权码创建一个邮箱服务对象
class ZMailObject(object):
def __init__(self):
# 邮箱账号
self.username='**@126.com'
# 邮箱授权码
self.authorization_code='授权码'
# 构建一个邮箱服务对象
self.server=zmail.server(self.username, self.authorization_code)
接着,将邮件主题、邮件内容、包含的附件路径加入到一个字典中,组成邮件主体
# 邮件主体
mail_body={
'subject': '测试报告',
'content_text': '这是一个测试报告', # 纯文本或者HTML内容
'attachments': ['./attachments/report.png'],
}
最后,将调用send_mail()函数,将邮件发送出去即可
# 收件人
# 可以指定一个人,字符串;也可以是多个人,列表
mail_to="收件人1"
# 发送邮件
self.server.send_mail(mail_to, mail_body)
yagmail 只需要几行代码,就能实现发送邮件的功能
相比 zmail,yagmail 实现发送邮件的方式更加简洁优雅
首先,安装依赖库
# 安装依赖库
pip3 install yagmail
然后,通过账号、授权码和服务器地址连接邮箱服务器,返回一个服务对象
import yagmail
# 连接服务器
# 用户名、授权码、服务器地址
yag_server=yagmail.SMTP(user='**@126.com', password='授权码', host='smtp.126.com')
接着,通过 send() 函数,将邮件发送出去
# 发送对象列表
email_to=['**@qq.com', ]
email_title='测试报告'
email_content="这是测试报告的具体内容"
# 附件列表
email_attachments=['./attachments/report.png', ]
# 发送邮件
邮件发送完毕之后,关闭连接即可
# 关闭连接
yag_server.close()
email_by_zmail.py
import zmail
class ZMailObject(object):
def __init__(self):
# 邮箱账号
self.username='**@126.com'
# 邮箱授权码
self.authorization_code='授权码'
# 构建一个邮箱服务对象
self.server=zmail.server(self.username, self.authorization_code)
def send_email(self, mail_to, mail_body):
"""
发送邮件
:param mail_to 发送对象
:param mail: 发送主题、内容及附件
:return:
"""
if self.__check_pop_enable() and self.__check_smtp_enable():
self.server.send_mail(mail_to, mail_body)
else:
pass
def receive_email(self):
"""
接受邮件
:return:
"""
try:
# 接受邮件
last_mail=self.server.get_latest()
# last_mail=self.server.get_mail(2)
# zmail.show(last_mail)
for k, v in last_mail.items():
print(k, v)
except Exception as e:
# 收件箱为空,则会报错
print('接受异常异常')
def __check_smtp_enable(self):
"""
检查smtp是否正常
:return:
"""
return self.server.smtp_able()
def __check_pop_enable(self):
"""
检查pop功能是否正常
:return:
"""
return self.server.pop_able()
if __name__=='__main__':
zmail_obj=ZMailObject()
# 发送内容及附件
mail_to='**@qq.com'
# 邮件主体
mail_body={
'subject': '测试报告',
'content_text': '这是一个测试报告', # 纯文本或者HTML内容
'attachments': ['./attachments/report.png'],
}
# 发送邮件
zmail_obj.send_email(mail_to, mail_body)
# 接受邮件
# zmail_obj.receive_email()
email_by_yagmail.py
import yagmail
# 连接服务器
# 用户名、授权码、服务器地址
yag_server=yagmail.SMTP(user='**@126.com', password='授权码', host='smtp.126.com')
# 发送邮件
# 发送对象列表
email_to=['**@qq.com', ]
email_title='测试报告'
email_content="这是测试报告的具体内容"
# 附件列表
email_attachments=['./attachments/report.png', ]
yag_server.send(email_to, email_title, email_content, email_attachments)
# 关闭连接
yag_server.close()
email_by_smtplib.py
*请认真填写需求信息,我们会在24小时内与您取得联系。