在学习Flask,看的书籍是《Flask Web开发实战 入门、进阶与原理解析》。在学习发送电子邮件这一章节时,遇到一些问题,便写下这一篇文章,记录一下,也希望遇到同样问题的人能够花较少时间在解决问题上。

本文包括Flask_Mail发送电子邮件和SendGrid发送电子邮件两部分。

Gmail、Outlook、QQ邮箱等这类服务被称为EPA (Email Service Provider),只适用于个人业务使用,不适合用来发送事务邮件。对于需要发送大量邮件的事务性邮件任务,更好的选择则是使用自己配置的STMP服务器或是使用类似Sendgrid、Mailgun的事务邮件提供商。

本文只介绍QQ邮箱和SendGrid的使用。

一、用Flask_Mail发送电子邮件

要使用QQ邮箱、163邮箱等邮箱服务,你需要访问对应的网站注册一个账号。开启邮箱的SMTP服务和获得授权码等。这里一QQ邮箱为例。登陆你的QQ邮箱,点击设置下的账户,开启SMTP服务,生成授权码并保存。授权码用来授权第三方客户端登陆邮箱。


用Flail_Mail发送邮件,首先安装flask_mail

pip install flask_mail

具体代码如下:

from flask import Flask
from flask_mail import Mail, Messageapp = Flask(__name__)
app.config['MAIL_SERVER'] = 'smtp.qq.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = 'xxxxxx@qq.com'   #发信账号
app.config['MAIL_PASSWORD'] = 'xxxxxx'  #授权码mail = Mail(app)
#-----------------------发信账号--------------------接收账号-------
msg = Message('标题', sender='xxxxxx@qq.com', recipients=['xxxxxx@qq.com'])
msg.body = '内容'
with app.app_context():mail.send(msg)if __name__ == '__main__':app.run()

二、使用事务邮件服务SendGrid

Mailgun、SendGrid这两个邮件服务对免费账号分别提供每月1万封和3000封的免费额度,但因Mailgun在注册免费账号时需要填写信用卡,而SendGrid没有这一限制。所以我只介绍使用Sendgrid来发送电子邮件。

我们首先需要登陆SendGrid的网站注册一个免费账号,访问https://app.sendgrid.com/signup,填写必要的信息并验证电子邮箱即可完成注册。注册完成后,我们需要为当前的项目创建一个API密钥,用于程序中发送邮件时进行认证。登陆控制台页面,通过单击左侧的Settings —> API Keys,然后单击右上角的“Create API Key”,创建API。填写API的名称(比如你的项目名称),选择权限(默认即可),然后单击“Create & View”按钮,如下图所示:

创建成功后会在页面看到密钥值(记得复制下来保存,被创建后仅显示一次,一单关闭界面,将无法再次查看),如下图所示

创建好API密钥后,因为我再练习的时候Sendgrid Web API 出了错误,所以我讲讲这个错误。

首先安装这个接口库

pip install sendgrid

根据书上的教学,使用辅助类构建邮件数据的字典

import sendgrid
import os
from sendgrid.helpers.mail import *apikey = 'xxxxxx'  #API密钥
# apikey=os.getenv('SENDGRID_API_KEY')   #从环境变量获取API密钥
sg = sendgrid.SendGridAPIClient(apikey)
from_email = Email("bot@example.com")
to_email = Email("xxxxx@qq.com")
subject = 'hello'   #标题
content = Content('text/plain',"life is short, I use python") #内容
mail = Mail(from_email,subject,to_email,content)  #辅助类
response = sg.client.mail.send.post(request_body=mail.get())
print(response.status_code)
print(response.body)
print(response.headers)

结果出现错误:TypeError: Object of type Email is not JSON serializable

仔细看的话会发现这个辅助类生成的不是json类型的数据,和书上的有所区别。折腾挺久之后我还是没能弄成像书上的一样,于是只能手动创建这个邮件数据的字典。

SendGrid官网上的邮件数据字典如下:

{"personalizations": [{"to": [{"email": "john@example.com"}],"subject": "Hello, World!"}],"from": {"email": "from_address@example.com"},"content": [{"type": "text/plain","value": "Hello, World!"}]
}

稍加修改之后,手动构建这个表示邮件数据的字典及完整代码如下。

import sendgrid
import osapikey = 'xxxxxxxxxxxxxxxx'   #API密钥
# apikey=os.getenv('SENDGRID_API_KEY')     #从环境变量获取密钥
sg = sendgrid.SendGridAPIClient(apikey)
from_email = "bot@example.com"
to_email = "xxxxx@qq.com"
subject = 'hello'
content = "I love Python"
data = {"personalizations": [{"to": [{"email": to_email}],"subject": subject}],"from": {"email": from_email},"content": [{"type": "text/plain","value": content}]
}
response = sg.client.mail.send.post(request_body=data)
print(response.status_code)
print(response.body)
print(response.headers)

运行成功。

需要注意的是,使用sendgrid有xxxx@example.com等发送到你的邮箱时,如果在收件箱找不到,那么再去垃圾箱看看,因为该邮件可能会被当做垃圾邮件而被拉进垃圾箱。

python利用flask_mail、sendgrid发送邮件相关推荐

  1. 利用Python调用outlook自动发送邮件

    ↓↓↓欢迎关注我的公众号,在这里有数据相关技术经验的优质原创文章↓↓↓ 使用Python发送邮件有两种方式,一种是使用smtp调用邮箱的smtp服务器,另一种是直接调用程序直接发送邮件.而在outlo ...

  2. 基于python SMTP实现自动发送邮件教程解析

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接: 高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.sfkyty.com ...

  3. 内网邮件JAVA535报错_利用网易邮箱发送邮件535报错处理

    相信看到535报错的同学代码编写方面都没有问题,只是不明白为什么填写了帐号密码后还是报535错误,使用网易的126或者163邮箱都会有如此问题. Python报错如下: Traceback (most ...

  4. Python:向IRIS发送邮件申请事件或者连续数据

    Python:向IRIS发送邮件申请事件或者连续数据 此脚本可以自动向IRIS发送邮件申请事件或者连续数据(本人暂时只是测试了126邮箱,且脚本只在ubuntu环境下测试过).运行脚本前需要开起邮箱的 ...

  5. python 利用jieba读取txt文本进行分词后存入新txt

    python 利用jieba读取txt文本进行分词后存入新txt import jieba txt = open("news.txt",encoding='UTF-8').read ...

  6. python 利用多进程实现文件的拷贝

    python 利用多进程实现文件的拷贝 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37338590/article/details/784 ...

  7. python利用什么写模板_Python利用逻辑回归分类实现模板

    Logistic Regression Classifier逻辑回归主要思想就是用最大似然概率方法构建出方程,为最大化方程,利用牛顿梯度上升求解方程参数. 优点:计算代价不高,易于理解和实现. 缺点: ...

  8. python利用决策树进行特征选择

    python利用决策树进行特征选择(注释部分为绘图功能),最后输出特征排序: import numpy as np import tflearn from tflearn.layers.core im ...

  9. python代码示例百度云-python利用百度云接口实现车牌识别的示例

    一个小需求---实现车牌识别. 目前有两个想法 1. 调云在线的接口或者使用SDK做开发(配置环境和编译第三方库很麻烦,当然使用python可以避免这些问题) 2. 自己实现车牌识别算法(复杂) 一开 ...

最新文章

  1. 五分钟学会HTML5!(二)
  2. Docker学习总结(6)——通过 Docker 化一个博客网站来开启我们的 Docker 之旅
  3. 成功解决PackagesNotFoundError: The following packages are not available from current channels: tensorflo
  4. 网络工程师成长日记417-西安如家酒店无线覆盖技术支持
  5. 输入序列连续的序列检测
  6. Cent OS 7配置Dnsmasq
  7. Android Content Provider基础
  8. Java LP1_Java Performance 总结(1. Class Loader)
  9. Linux 脚本获取当前路径父路径及常用命令
  10. 无比强悍的CRM营销模块,SuiteCRM功能介绍
  11. 如何用C语言实现批量修改文件类型
  12. 数据仓库之内容建设(架构、分层、主数据、指标体系、词根、血缘)
  13. 六度分离(Six Degrees of Separation)理论
  14. 普通话测试app怎么样可以不交钱_如何说普通话才算标准?
  15. 曾国藩:成大事者不纠结
  16. EXCEL转换成十六进制加0x补零
  17. 【转自虎嗅】段永平在斯坦福与华人学生交流分享
  18. javaee入门笔记2
  19. joycon手柄拆解_爱活电刑室 | 撬开海拉尔的大门! 任天堂Switch全拆解
  20. 企业级智能RPA平台功能

热门文章

  1. python 自动化测试(2):针对密码输入框为密码控件时的解决方案
  2. 致远互联:以数智化指引破局之道
  3. Error Some file crunching failed, see logs for details 解决方案
  4. mysql connect reset_困扰我多年的Connection reset问题
  5. 铁路基因的传承与创新
  6. 递归-PTA循环日程表
  7. Consumer消息拉取和消费流程分析
  8. 使用离线语音夜灯联动控制家里其他灯具和电器
  9. PS超简单的扣人像方法
  10. 《机器学习的数学》出版了,彻底解决程序员学机器学习的数学问题