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


相关推荐

  • 怎么使用virsh命令_isql命令

    怎么使用virsh命令_isql命令virsh.c中main->vshParseArgv->vshCommandArgvParse->vshCommandParse->vshCmddefSearchintmain(intargc,char**argv){if(!vshParseArgv(ctl,argc,argv)){vshDeinit(ctl);exit(EXIT_FAILURE);}staticboolvshParseA…

    2022年8月11日
    6
  • Java文件操作(超详细+代码示例)「建议收藏」

    Java文件操作(超详细+代码示例)「建议收藏」Java文件操作一、Java.io包1.1File类1.2Stream流1.2.1使用FileInputStream类1.2.2使用FileOutputStream类二、序列化我们日常使用电脑的时候,基本都会和文件打交道,比如我们做ppt,或者写论文的时候,我们打开的word,ppt等等都是一个文件,这些文件不一样的主要是因为后缀名不一样,所以计算机才可以分辨出来这些文件的区别。文件一…

    2022年7月26日
    13
  • mysql5.7 修改用户初始密码

    mysql5.7 修改用户初始密码当用户首次安装mysql数据库时,总是想修改root的初始化密码,我也是,每次都百度一下,下面主要给出一些操作数据库的常用SQL和一些基本概念性的东西。修改用户的初始化密码:SETPASSWORD=PASSWORD(‘yournewpassword’);ALTERUSER‘root’@‘localhost’PASSWORDEXPIRENEVER;flushprivilege

    2022年6月21日
    39
  • 神经网络的优化算法_梯度下降优化算法

    神经网络的优化算法_梯度下降优化算法最近回顾神经网络的知识,简单做一些整理,归档一下神经网络优化算法的知识。关于神经网络的优化,吴恩达的深度学习课程讲解得非常通俗易懂,有需要的可以去学习一下,本人只是对课程知识点做一个总结。吴恩达的深度

    2022年8月1日
    6
  • ffmpeg添加视频封面_ffmpeg提取波形文件

    ffmpeg添加视频封面_ffmpeg提取波形文件ffmpeg-ia.mp4-y-fimage2-frames1a.jpgffmpeg-i11.mp4-vframes1xx.jpgffmpeg-ia.mp4-r0.1frames_%04.pngconvert-backgroundwhite-flatten***.pdf***.png

    2025年6月14日
    1
  • realsense深度图像保存方法

    realsense深度图像保存方法一般使用realsense时会保存视频序列,当保存深度图像时,需要注意保存的图像矩阵的格式,不然可能造成深度值的丢失。在众多图像库中,一般会使用opencv中的imwrite()函数进行深度图像的保存。一般深度图像中深度值的单位是mm,因此一般使用np.uint16作为最终数据格式保存。例子:importnumpyasnpimportcv2deffun1(…

    2022年4月25日
    31

发表回复

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

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