如何用Python发送邮件?

745 阅读5分钟

如何用Python发送邮件?

一、前言

相信邮箱对许多人来说只是一个全是推销邮件的垃圾桶,或者接收验证码的一个工具。但是邮箱其实还有很多作用,其中最重要的作用就是消息交流。

现在我们传递消息的方式有很多种,像是比较流行QQ、微信,或者微博、知乎这种社交软件。甚至我们还可以剑走偏锋的方式,比如支付宝、淘宝这种软件进行交流。

但是这些软件通常都需要我们登录,而且要在相应的客户端才能进行操作。而邮件则不一样,很多语言都提供了邮件相关操作的API,我们只需要有一个邮箱,就可以很随意的发送邮件。而且邮件的监管相比其它软件要松地多。

那说了这么多,我们能用邮件做些什么呢?

在我的实际工作学习中,我喜欢把邮件当作一个提醒工具。有时候一些程序的执行需要很长时间,这个适合就可以在程序运行成功后给我们的手机发邮件。这样我们就能很及时的进行下一步的工作。

二、准备工作

在发送邮件之前,我们需要先获取一个邮箱的授权码。这个授权码相当于你的邮箱密码,通常可以在网页版邮箱的设置中获取。这里以163邮箱为例,首先登录邮箱:mail.163.com/。登录后可以看到如下页面:

在这里插入图片描述

我们点击设置,然后选择POP3/SMTP/IMAP选项,然后会看到如下页面:

在这里插入图片描述

点击开启,然后按照要求发送短信即可获取授权码。这个授权码只会显示一次,因此需要保存好。获取授权码后,我们就可以开始发送邮件了。

三、发送邮件

在python中自带了smtplib模块用于发送邮件,但是使用起来比较复杂。我们今天直接使用封装好的yagmail模块进行邮件的发送。我们先来安装yagmail:

pip install yagmail

接下来的使用就非常简单了,基本步骤大致如下:

  1. 准备用于发送邮件的邮箱
  2. 创建SMTP对象
  3. 准备要发送的内容
  4. 发送邮件
  5. 关闭连接

具体代码如下:

import yagmail
# 1、准备用于发送邮件的邮箱
username = "sockwz@163.com"
password = "你的授权码"
# 2、创建SMTP对象
yag = yagmail.SMTP(user=username, password=password, host="smtp.163.com")
# 3、准备要发送的内容
content = [
    "这是一封邮件"
]
# 4、发送邮件
yag.send(to="2930777518@qq.com", subject="测试邮件", contents=content)
# 5、关闭连接
yag.close()

这里又几点需要注意:

(1)STMP

其中SMTP其实是一种邮箱协议,我们使用yagmail.SMTP创建SMTP对象,它给我们封装了底层的细节。我们只需要把用于发送邮件的邮箱和授权码给它,已经邮箱服务器ip给它就好了。

这里又出现了一个邮箱服务器的概念,通常发送邮件的流程是:客户端A -> 邮箱服务器 -> 客户端B。

其中邮箱服务器充当了邮递员的身份,我们需要告诉程序要哪个邮递员发邮件。因为我们使用的是SMTP协议,而且是163的邮箱,因此我们需要填163邮箱服务器的ip。通常情况下邮箱服务器ip格式为:协议名.邮箱公司名.com。当然这个不是固定的,具体的可以在网页版的设置中查看,比如网易邮箱的ip如下:

在这里插入图片描述

(2)邮箱内容

邮箱内容需要是一个列表。

(3)发送邮件

我们发送邮件的代码如下:

yag.send(to="2930777518@qq.com", subject="测试邮件", contents=content)

这里我们使用了三个参数,其中to是接收方的邮箱。subject是邮件的主体,contents是邮箱内容。yag.send函数还有很多其它参数,这里就不再细说了。

四、发送附件

附件的发送非常简单,我们只需要在contents参数中写入附件的参数即可,比如下面这样:

import yagmail
username = "sockwz@163.com"
password = "你的授权码"
yag = yagmail.SMTP(user=username, password=password, host="smtp.163.com")
content = [
    # 附件的路径
    "xyql.jpg"
]
yag.send(to="2930777518@qq.com", subject="测试邮件", contents=content)
yag.close()

因为在我的程序下有一个叫xyql.jpg的图片,所以我直接写就好了。当然有时候我们还需要让图片直接显示在邮件中,这种情况我们只需要调用一下yagmail.inline函数即可,代码如下:

import yagmail
username = "sockwz@163.com"
password = "你的授权码"
yag = yagmail.SMTP(user=username, password=password, host="smtp.163.com")
content = [
    '娜娜酱',
    yagmail.inline("xyql.jpg")
]
yag.send(to="2930777518@qq.com", subject="测试邮件", contents=content)
yag.close()

这里需要注意一下,在测试过程种发现不能直接单独发内敛图片,而需要配一些文字发送,不然会被邮箱服务器退信。

下面我们分别看看附件和内敛图片的区别:

在这里插入图片描述

区别还是很明显的。

五、发送html邮件

yagmail本身就是将文字作为html发送的,因此只要我们发送html邮件不需要做什么改变。但是为了方便,我们还是把html写一个单独的文件,比如文件index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我是一个测试页面</title>
</head>
<body>
    <h1>这是一个测试标题</h1>
    <p style="color: red">这是一个测试内容</p>
</body>
</html>

显示效果如下:

在这里插入图片描述

效果很简单,然后我们把上面的代码搬过来,稍作修改:

username = "sockwz@163.com"
password = "你的授权码"
yag = yagmail.SMTP(user=username, password=password, host="smtp.163.com")
content = [
    # 直接从html文件中读取内容
    open('index.html', 'r', encoding='utf-8').read()
]
yag.send(to="2930777518@qq.com", subject="测试邮件", contents=content)
yag.close()

上面我们直接用open读取html的内容,然后发送。下面是接收到的效果图:

在这里插入图片描述

可以看到邮件正常接收。上面这些操作就可以满足我们工作的大多数需求了,大家可以自己定制一个提醒程序。

今天的内容就到这里了,感觉阅读。有兴趣的读者可以关注我的个人公众号“新建文件夹X”。