python利用flask_mail、sendgrid发送邮件[通俗易懂]

python利用flask_mail、sendgrid发送邮件[通俗易懂]在学习Flask,看的书籍是《FlaskWeb开发实战入门、进阶与原理解析》。在学习发送电子邮件这一章节时,遇到一些问题,便写下这一篇文章,记录一下,也希望遇到同样问题的人能够花较少时间在解决问题上。本文包括Flask_Mail发送电子邮件和SendGrid发送电子邮件两部分。Gmail、Outlook、QQ邮箱等这类服务被称为EPA(EmailServiceProvider),只适…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

在学习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

Jetbrains全家桶1年46,售后保障稳定

具体代码如下:

from flask import Flask
from flask_mail import Mail, Message
 
app = 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 os

apikey = '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等发送到你的邮箱时,如果在收件箱找不到,那么再去垃圾箱看看,因为该邮件可能会被当做垃圾邮件而被拉进垃圾箱。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219076.html原文链接:https://javaforall.net

(0)
上一篇 2025年7月10日 下午1:01
下一篇 2025年7月10日 下午1:43


相关推荐

  • lzma算法

    lzma算法lzma 算法分析这几天在公司主要在做压缩相关 记录一下所得 目前业界主流的压缩算法感觉并不多 好用的就 Huffman lz 系列 其他的像差分编码 vlq 编码 感觉只能做个数据预处理 或者一种小范围的压缩 lz 系列有很多 主要有 lz77lz78lzma 基本思想是一样的 都是一种字典编码 如 我有一段文本 里面有 abcdefabcde 那么后面的 abcde 并没有必要 可以用前面的替代 所以 其实可存储为 abcd65 6 代表 offset 5 代表 length 既用距离当前位置 6 字节 长度为 5 的字

    2026年3月19日
    3
  • iphone4s必装AppSync补丁教程使iOS5完全越狱[通俗易懂]

    iphone4s必装AppSync补丁教程使iOS5完全越狱[通俗易懂]iphone4s必装AppSync补丁教程使iOS5完全越狱2012-06-1719:44来源:未知一念之间我要评论大中小iPhone4等设备完美越狱终于发布,不过完美越狱完成后如果给iPhone上安装从iPhone中文网或者其他网站上下载ipa后缀格式的软件和游戏,还有一项重要的工作就是在CYIDIA上安装ipa补丁AppSync5.0+,下面就教大家怎样安装…

    2022年6月13日
    36
  • 【Java基础】Java7新特性—Files类,Path类,Paths类的用法

    【Java基础】Java7新特性—Files类,Path类,Paths类的用法文章目录 Java7 新增文件 IO 类一 Paths1 创建 Paths 二 Path1 创建 Path1 1 创建 Path 的三种方式 2 Path 常用方法三 Files1 判断方法 2 删除方法 3 复制方法 4 移动和重命名方法 5 创建文件和文件夹方法 6 文件属性方法 7 读取 编辑文件内容方法 8 遍历文件列表方法四 Path 和 Files 使用五 FileTime 对象 Java7 新增文件 IO 类 Java7 中文件 IO

    2026年3月18日
    2
  • 概率和数学期望小结

    概率和数学期望小结概率 1 一件事情发生的理论可能性 2 pi 1 数学期望 1 一件事情 随机变量 的取值结果和概率乘积的总和 2 E x pi xi 期望定义 3 E ax by aE x bE y 期望的线性性质 4 E x y E x E y x y 独立时一定成立 例题 1 绿豆蛙的归宿 Description 给出一个有向无环图 起点为 1

    2026年3月19日
    3
  • 【100个 Unity踩坑小知识点】| Unity 使用Quaternion.AngleAxis随机一个方向

    【100个 Unity踩坑小知识点】| Unity 使用Quaternion.AngleAxis随机一个方向Unity 小科普老规矩 先介绍一下 Unity 的科普小知识 Unity 是实时 3D 互动内容创作和运营平台 包括游戏开发 美术 建筑 汽车设计 影视在内的所有创作者 借助 Unity 将创意变成现实 Unity 平台提供一整套完善的软件解决方案 可用于创作 运营和变现任何实时互动的 2D 和 3D 内容 支持平台包括手机 平板电脑 PC 游戏主机 增强现实和虚拟现实设备 也可以简单把 Unity 理解为一个游戏引擎 可以用来专业制作游戏 Unity 踩坑小知识点学习 Unity 使用 Q

    2026年3月18日
    2
  • pythoncharm安装matplotlib_Python安装 matplotlib,pycharm 导入matplotlib

    pythoncharm安装matplotlib_Python安装 matplotlib,pycharm 导入matplotlib一 在 python 的相关软件安装中 1 和 java 的 IDEA 一样 pycharm 是集成开发环境 visualstudio 也是一种开发环境安装 pycharm https blog csdn net Feng article details 和 java 的 JDK 一样 进行环境配置安装 Python3 7 是对环境进行配置 3 这是一些功能库 pycharm 可以调用 vi

    2026年3月27日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号