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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MediaCodec基本原理及使用「建议收藏」

    MediaCodec基本原理及使用「建议收藏」MediaCodec类Android提供的用于访问低层多媒体编/解码器接口,它是Android低层多媒体架构的一部分,通常与MediaExtractor、MediaMuxer、AudioTrack结合使用,能够编解码诸如H.264、H.265、AAC、3gp等常见的音视频格式。广义而言,MediaCodec的工作原理就是处理输入数据以产生输出数据。具体来说,MediaCodec在编解码的过程中使用了一组输入/输出缓存区来同步或异步处理数据:首先,客户端向获取到的编解码器输入缓存区写入要编解码的数据并将其提交

    2022年4月19日
    151
  • RPM 包默认安装路径

    RPM 包默认安装路径/etc/配置文件安装目录/usr/bin/可执行的命令安装目录/usr/lib/程序所使用的函数库保存位置/usr/share/doc/基本的软件使用手册保存位置/usr/share/man/帮助文件保存位置…

    2022年5月13日
    160
  • CentOS 中用 Yum 安装、卸载软件

    CentOS 中用 Yum 安装、卸载软件一:Yum简介Yum(全称为YellowdogUpdater,Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。二:常用的Yum命令1、显示已经安装的软件包yumlist…

    2022年6月11日
    33
  • ikbc 104键win键失效

    ikbc 104键win键失效fn+del键(或者fn+r)长按五秒,看到3个指示灯闪烁,说明键盘恢复出厂设置了,也解决了当前问题。

    2022年6月4日
    187
  • linux convert 添加文字,Linux convert命令有什么用

    linux convert 添加文字,Linux convert命令有什么用Linuxconvert命令有什么用?Linux强大的图片处理功能强大的convert命令—介绍他的主要原因也是应为编程语言在linux下都可以调用使用convent命令可以对图片进行各种处理-trim:裁剪图像四周空白区域;-transparentcolor:去除图像中指定的颜色;-densitygeometry:设定图像的DPI值,若不明DPI值的概念,可参考《有关pt,p…

    2022年7月16日
    13
  • js addEventListener事件捕获与冒泡,第三个参数详解,阻止事件传播

    js addEventListener事件捕获与冒泡,第三个参数详解,阻止事件传播结论element.addEventListener(event,function[,useCapture])event:事件名称,如clickfunction:指定要事件触发时执行的函数,可以传入事件参数useCapture:可选。布尔值,指定事件是否在捕获或冒泡阶段执行。默认false:在冒泡阶段执行指定事件true:在捕获阶段执行事件event.stopPropagat…

    2025年6月9日
    3

发表回复

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

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