Python flask-mail的安装及使用

首先Python的标准库中是提供了发送email这样的接口的,但是是比较偏底层的。需要我们自己控制的参数比较多,使用起来不是很方便。Flask提供给我们发送电子邮件的插件

1、安装flask-mail插件

pip install flask-mail

2、在app中注册插件

导入mail

Python flask-mail的安装及使用

实例化mail

Python flask-mail的安装及使用

把app传入进来,注册这个插件

Python flask-mail的安装及使用

3、使用

Python flask-mail的安装及使用

使用.send()方法就可以发送email了。可以看到是需要提供一个Message对象的。这个对象也是我们flask-mail插件来提供的。所以我们要导入Message

Python flask-mail的安装及使用

Python flask-mail的安装及使用

注意MAIL_PASSWORD并不是QQ号的密码,需要在QQ邮箱中设置一下,

Python flask-mail的安装及使用

Python flask-mail的安装及使用

然后就会拿到腾讯的一个授权码,把它复制下来,然后写到MAIL_PASSWORD配置项中。

Python flask-mail的安装及使用

第一个参数指明了发送邮件的标题,sender就是username,body是我们发送的这封电子邮件正文的内容,recipients是代表我们向哪些用户发送我们这封电子邮件,

4、项目使用

Python flask-mail的安装及使用

Python flask-mail的安装及使用

Python flask-mail的安装及使用

Python flask-mail的安装及使用

5、异步发送电子邮件

因为邮件服务器不是我们自己能决定速度的,而是通过第三方邮件服务器来实现的,但是当我们调用别人的接口的时候是同步的,会导致代码卡住等着发送成功再走下面的代码。因为发送邮件不需要这么高的实时性,所以我们可以把它放到另一个线程中,异步的来执行。下面我们通过异步的方式来解决。

Python flask-mail的安装及使用

上面代码会报一个找不到上下文的错误,之前我们说过这个问题,详情请看 flask之current_app的使用及详解 这篇文章

出现这个问题的原因就是我们开启了一个新的线程,所以完善后的代码如下图所示。

Python flask-mail的安装及使用

原因就在于代理对象和Flask核心对象的区别,代理对象去查找Flask核心对象的时候是通过线程的id号去查找的,由于我们改变了线程的id号,那么current_app在另一个线程中就找不到Flask真实的这个核心对象了。


下面我们换个思路,直接把Flask真实对象传入进去,而不是传入代理对象了。

因为真实的Flask对象在任何一个线程中都是存在的,他不同于我们的代理对象,再次强调代理对象是受到线程id影响的,因为他本身就是在做线程的隔离。我们可以通过下图所示的方法来获取到Flask的真实的核心对象。

Python flask-mail的安装及使用

完整代码:

Python flask-mail的安装及使用

Python flask-mail的安装及使用