整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

用 Python 发一波邮件,效果杠杠滴

用 Python 发一波邮件,效果杠杠滴

些项目可能需要我们通过代码的方式来发送邮件,比如在后台给客户批量发送邮件,或者,我们也可以通过代码给自己发送提醒邮件,比如触发了某些事件需要我们亲自去操作的时候,就可以使用代码直接给自己发送一封预警邮件等等。

那么,如何使用 Python 来发送邮件呢?

在此之前,我们先来简单的了解一下:

什么是 SMTP?

我们知道在互联网中常用的协议是 HTTP,这样我们的浏览器才能获取到服务器的网页内容,同样的 SMTP 也是一种常见的互联网应用层传输协议,不同的是,这种类型是专门用来处理邮件的。

一般情况下,你在发送邮件的时候,并不是直接就把你写的内容发送到对方的收件箱中,它会先发送给 smtp 服务器进行处理,然后发送到对应的服务器中,比如 Gmail,然后 Gmail 就会下载邮件,把它放到收件人的邮箱里面去。

在 Python 中有一个 smtpd 模块,我们可以使用它在本地开启一个 SMTP 服务,像这样:

python -m smtpd -c DebuggingServer -n localhost:1088

这样我们就可以在本地测试邮件的发送了。

当然,我们并不需要自己创建 SMTP 服务,不同的邮件厂商都有提供它们的 STMP 服务地址,比如 Gmail 的就是 smtp.gmail.com:

Python 发送邮件

知道了什么是 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 账号,所以你需要在设置那里,把低安全性应用访问权限打开。

Python 发送纯文本邮件内容

好了,导入相关的库并开启代理:

定义好你的收发邮件地址,以及你要发的内容:

构造 MIME:

连接 Gamil 的 smtp 服务,开启 tls 加密,登陆然后发送一波:

运行一波,没什么问题的话对方就会收到你发的邮件啦:

Python 发送 HTML 邮件内容

刚刚,我们这里 「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()

其实,这段代码也并不复杂,只要你理解使用过邮箱发送邮件,那么以下问题是你必须要考虑的:

  • 你登录的邮箱帐号/密码
  • 对方的邮箱帐号
  • 邮件内容(标题,正文,附件)
  • 邮箱服务器(SMTP.xxx.com/pop3.xxx.com)

yagmail 实现发邮件

  • yagmail 可以更简单的来实现自动发邮件功能。
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)

总共四行代码搞定,是不是比上面的例子简单太多了。

  • 给多个用户发送邮件,只需要将接收邮箱 变成一个list即可。
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

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 项目创建目的是,使邮件处理变得更简单

使用 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

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