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


相关推荐

  • 零散学习笔记(一)—-单相逆变电路设计

    零散学习笔记(一)—-单相逆变电路设计这几天帮别人设计然后画一个电路图,只设计电路图,没有具体实现功能。这题是一道电赛题,大家都知道设计一个电路简单,但是要具体实现功能可不是那么简单的。而本文章是最简单的一部分—电路部分,不涉及程序部分和调试。AC-DC电路设计电源输入电压为220V交流电压,在一般设计中只要是输入为220V交流电肯定需要将交流电转换成直流电压。一般有两个方法:模电方法:使用转换电路——整流(几个二极管组合起来把正负电压变成单向)–滤波(使波形平滑)–稳压(固定输出)–直流电压数电方法:使用DC-AC芯片进行转换(博

    2022年6月9日
    38
  • Java 技术是什么?

    Java 技术是什么?Java技术既是一种高级的面向对象的编程语言,也是一个平台。Java技术基于Java虚拟机(Javavirtualmachine,JVM)的概念——这是语言与底层软件和硬件之间的一种转换器。Java语言的所有实现都必须实现JVM,从而使Java程序可以在有JVM的任何系统上运行。Java编程语言(Javaprogramminglanguage)与众不同之

    2022年7月8日
    19
  • SpringMVC 上下文webApplicationContext

    SpringMVC 上下文webApplicationContext

    2022年1月1日
    71
  • Navicat for oracle创建数据库

    Navicat for oracle创建数据库前言其实在Oracle中的概念并不是创建数据库,而是创建一个表空间,然后再创建一个用户,设置该用户的默认表空间为我们新创建的表空间,这些操作之后,便和你之前用过的mysql数据库创建完数据库一模一样了(如果你用过mysql的话,当然如果Oracle是你用的第一个数据库系统,那上面这段话其实看不看并不重要)。但是,鉴于很多用过mysql的用户,在刚开始使用Oracle的时候都会不知道如何创建数据…

    2022年7月13日
    15
  • php提取字符串中的数字

    php提取字符串中的数字

    2021年10月30日
    57
  • Jdbc executeUpdate 返回值

    Jdbc executeUpdate 返回值原文地址:http://nkadun.iteye.com/blog/1435333javaapi里是这样说的executeUpdateintexecuteUpdate()throwsSQLExceptionExecutestheSQLstatementinthisPreparedStatementobject,whichmustbeanSQL

    2022年10月20日
    0

发表回复

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

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