Flask-email 发送邮件的配置,发送附件的方法,以及os.environ.get('MAIL_USERNAME')为None的解决办法
一、发送邮件的配置
在学习flask-mail来发送电子邮件的时候遇到了一些问题,其实都是些小问题,现在记录下来以便于以后查看。
1、首先flask-mail的安装
pip install flask-mail
2、flask-mail,载入和初始化
from flask.ext.mail import Mail
mail = Mail(app)
3、flask-mail SMTP邮箱服务器配置

配置hotmail邮箱服务器:
MAIL_SERVER = 'smtp.live.com',
MAIL_PROT = 25,
MAIL_USE_TLS = True,
MAIL_USE_SSL = False,
MAIL_USERNAME = "",
MAIL_PASSWORD = "",
MAIL_DEBUG = True
配置qq邮箱服务器:
MAIL_SERVER = 'smtp.qq.com',
MAIL_PROT = 25,
MAIL_USE_TLS = True,
MAIL_USE_SSL = False,
MAIL_USERNAME = "",
MAIL_PASSWORD = "",
MAIL_DEBUG = True
配置126邮箱服务器:
MAIL_SERVER = 'smtp.126.com',
MAIL_PROT = 25,
MAIL_USE_TLS = True,
MAIL_USE_SSL = False,
MAIL_USERNAME = "",
MAIL_PASSWORD = "",
MAIL_DEBUG = True
配置163邮箱服务器:
import os
# ...
app.config['MAIL_SERVER'] = 'smtp.163.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USE_SSL'] = True
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')
注意,这里的端口改为了465,是网易邮箱的配置,在邮箱帮助中可以搜索到

同时设置MAIL_USE_SSL为True,无需设置MAIL_USE_TSL,默认为False
其实服务器的配置都是挺简单的,各个不同邮箱服务器的SMTP配置的不同点就是MAIL_SERVER那里,再就是不同的协议用端口不同,根据自己的配置来设置,如果明明配置正确了都还不可以成功发送邮件,那就得检查一下自己的邮箱账户里边儿有没有把SMTP服务给打开,具体的打开方式就自己百度了哈,都挺简单的事情。
二、发送附件的方法
from flask import Flask
from flask.ext.mail import Mail, Message
import os app = Flask(__name__)
app.config.update(
DEBUG = True,
MAIL_SERVER='smtp.live.com',
MAIL_PROT=25,
MAIL_USE_TLS = True,
MAIL_USE_SSL = False,
MAIL_USERNAME = 'example@hotmail.com',
MAIL_PASSWORD = '**********',
MAIL_DEBUG = True
) mail = Mail(app) @app.route('/')
def index():
# sender 发送方哈,recipients 邮件接收方列表
msg = Message("Hi!This is a test ",sender='example@example.com', recipients=['example@example.com'])
# msg.body 邮件正文
msg.body = "This is a first email"
# msg.attach 邮件附件添加
# msg.attach("文件名", "类型", 读取文件)
with app.open_resource("F:\2281393651481.jpg") as fp:
msg.attach("image.jpg", "image/jpg", fp.read()) mail.send(msg)
print "Mail sent"
return "Sent" if __name__ == "__main__":
app.run()
三、配置时遇到的问题,以及os.environ.get('MAIL_USERNAME')为None的解决办法
我们先来看文章主要内容:
这里讲一下SMTP和POP还有IMAP功能
这个主要达到的功能就是:可以通过非官方的客户端,来访问邮箱收发邮件
比如:我用邮箱大师这个软件,可以绑定某个126邮箱,来进行收发邮件
而POP和IMAP的区别在于,POP的操作,不会同步到服务器上,也就是不会影响到服务器
而IMAP是和服务器同步的
然后126设置相关的页面如下:
特别要注意我附加在页面上的文字,网易会在开通这些功能的时候让你另外设置一个授权码!!这个授权码是当你在使用非网易客户端时,启用pop/smtp/imap几个功能时候的密码!!
也就是说,你用其他软件收发邮件的时候,密码不是你原来那个,而是你的授权码!!!
也可以在邮箱中把客户端授权密码关闭,直接使用密码发送即可

在开发过程中,如果连接到外部SMTP 服务器,则可能更方便。举个例子,示例6-1 展示
了如何配置程序,以便使用Google Gmail 账户发送电子邮件。
示例6-1 hello.py:配置Flask-Mail 使用Gmail
import os
# ...
app.config['MAIL_SERVER'] = 'smtp.126.com' #这里是设置每个邮箱不同的smtp服务器,由于GMAIL在国内被墙了,所以我这里使用126
app.config['MAIL_PORT'] = 25 #自己百度一下,每个邮箱对应的smtp端口号
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME') #这里提示,不要将账户和密码写入代码里面,而是设置在环境变量里面读取
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')
前方大坑.....注意避让
保存电子邮件服务器用户名和密码的两个环境变量要在环境中定义。如果你在Linux 或
Mac OS X 中使用bash,那么可以按照下面的方式设定这两个变量:
(venv) $ export MAIL_USERNAME=<Gmail username>
(venv) $ export MAIL_PASSWORD=<Gmail password>
微软Windows 用户可按照下面的方式设定环境变量:
(venv) $ set MAIL_USERNAME=<Gmail username>
(venv) $ set MAIL_PASSWORD=<Gmail password>
我是windows用户,所以选取第二个选项
这里的1号大坑:设置的时候,要把<>去掉,并且!!你的邮箱名和密码,都要用引号括起来,也就是字符串!!!
后续更新!!!重要更新!!!
在cmd下面,设置环境变量的时候,不需要引号,在powershell下面设置的时候,需要引号!!!
这里的2号大坑:set这个设置环境变量的方法,是在cmd里面的!!我用的是powershell!!他的语句应该是
$env:MAIL_USERNAME='xxxxx@126.com'
$env:MAIL_PASSWORD='这里输密码'
补一下基础知识!
因为在cmd里面,查看所有环境变量的命令是set
而在powershell里面,查看环境变量的命令是ls env: 而设置的方法是 $env: name='variable' 这里的name是添加的变量名字,后面的variable则是变量内容
这里转载一篇其他前辈的博客,予以参考!! http://blog.sina.com.cn/s/blog_bfc35a260102vv88.html
如果你按照cmd里面的设置环境变量的方法set,那么,你就会碰到授权错误553或者550的信息,如下
发送邮件的代码如下:
(venv) $ python hello.py shell
>>> from flask.ext.mail import Message
>>> from hello import mail
>>> msg = Message('test subject', sender='you@example.com',
... recipients=['you@example.com'])
>>> msg.body = 'text body'
>>> msg.html = '<b>HTML</b> body'
>>> with app.app_context():
... mail.send(msg)
... #进行到这里没有报错的话,那就是ok了!!
我们来看一下测试结果
然后我们最后补一下关于cmd下还有powershell下面的环境变量区别
在powershell下面,你需要用ls env:的命令,才能显示参数
而设置方法,则是$env :
总结
在windows下,在PyCharm的Terminal中设置环境变量,不行!!后来,在cmd命令下设置,关闭当前窗口后,就会失效,最关键的问题是在pycharm中无法获取,所以解决方法有两种
第一种:在我的电脑-右键-属性-高级系统设置-环境变量,将MAIL_USERNAME等设置
第二种:直接在pycharm中设置,设置后重启pycharm



参考
https://blog.csdn.net/u013753393/article/details/53401717
https://blog.csdn.net/werewolf_st/article/details/46805429
https://www.oschina.net/translate/the-flask-mega-tutorial-part-xi-email-support?lang=chs&page=1#
Flask-email 发送邮件的配置,发送附件的方法,以及os.environ.get('MAIL_USERNAME')为None的解决办法的更多相关文章
- ci框架(codeigniter)Email发送邮件、收件人、附件、Email调试工具
ci框架(codeigniter)Email发送邮件.收件人.附件.Email调试工具 Email 类 CodeIgniter 拥有强大的 Email 类来提供如下的功能: 多 ...
- Java使用javax.mail.jar发送邮件并同意发送附件
因为Java在开发网页上占有绝大优势.所以作为web端的领军人物,譬如发送短信和发送邮件这些就成了必定,网络安全一再安全我们须要把账号的安全级别提到更高.因此这些对于开发者也就成了必须掌握的技能!我一 ...
- WordPress ”无法发送电子邮件,可能原因:您的主机禁用了mail()函数“的解决办法
WordPress网站中出现 "无法发送电子邮件,可能原因:您的主机禁用了mail()函数"的情况一般都是因为所在主机环境不支持在线邮件收发功能导致,如果不支持的话,那么像类似 N ...
- 关于win10系统1709版本安装JDK出现变量配置正确但仍有“java不是内部或外部命令”的解决办法
背景:联想拯救者R720笔记本,系统一键还原了,需要重新安装一部分软件,最基本的就是JDK,但今天在安装时遇到了问题,之前安装的1.8版本,没有仔细配置环境变量,这一次安装的是1.7版本的,仔仔细细配 ...
- 配置php时。提示的错误session_start(): Failed to initialize storage module解决办法
当浏览器输入访问地址后 报这样的错时----session_start(): Failed to initialize storage module 进入到此目录vi /usr/local/php/e ...
- CAFFE(FAQ.1):Ubuntu 配置caffe 框架之数据库读取错误:ImportError: No module named lmdb解决办法
Z: 在安装了caffe框架后需要读取大量的数据进行学习训练.比如在MNIST识别训练中,一般直接读图片会比较耗时,我们一般将图片转存为数据库中.目前主流的数据库有以下两种选择: LevelDB Lm ...
- Eclipse 配置spring boot pom.xml第1行报错的两种解决办法
现象 通过spring boot项目导入eclipse后,pom.xml文件的第一行总是报错.这里使用的spring版本是2.1.5,2.1.4以前的版本等其他版本的spring没有这个问题. 解决办 ...
- Visual studio2019配置OPENCV 时属性管理器中没有Microsoft.Cpp.x64.user的解决办法
方法一:重新下载Visual studio2017,再次打开2019就会出现Microsoft.Cpp.x64.user,感觉有些麻烦,也占电脑空间,推荐方法二. 方法二:与方法一原理相同,下载201 ...
- Flask Web 发送邮件单文件
import os from flask import Flask, render_template, session, redirect, url_for from flask_script imp ...
随机推荐
- Android的ToggleButton和Switch以及AnalogColok和DigitalColok的用法-android学习之旅(二十)
ToggleButton 和Switch简介 ToggleButton 和Switch都是继承了Button,所以他们的属性设置和Button差不多. 分别支持的属性 ToggleButton 的属性 ...
- Hibernate之多对多表,操作实例
多表操作之多对多关系简介 思路就是: 在数据库底层通过添加中间表来指定关联关系. 在双方的实体中添加一个保存对方的集合 在双方的配置文件中使用set标签和many-to-many标签来进行关联关系的配 ...
- boost::coroutine 无法显示调用栈
boost::coroutine 无法显示调用栈(金庆的专栏)一例因 boost::format() 格式化参数个数错误造成的 coredump,因为使用了 boost::coroutine, 无法显 ...
- 手把手教你轻松实现listview下拉刷新
很多人觉得自定义一个listview下拉刷新上拉加载更多是一件很牛x的事情,不是大神写不出来,我想大多数童鞋都是做项目用到时就百度,什么pulltorefresh,xlistview...也不看原理, ...
- Android学习之AppWidget高级效果
接着AppWidget基础学习,今天是一个"进阶版"的小例子,用来检验一下自己的学习效果.于是就做了一个掷骰子的Widget. 方便大家观看,先截图如下: 需要注意的是在drawa ...
- android开发技巧——仿新版QQ锁屏下弹窗
新版的qq,可以在锁屏下弹窗显示qq消息,正好目前在做的项目也需要这一功能.经过各种试验和资料查找,终于实现,过程不难,但是却有一些地方需要注意. 下面是实现过程. 1.使用Activity,而不是V ...
- 打包自己的aar库
在比较大的 Android 项目的开发中,我们经常会遇到工程.jar 包等等之间相互引用的方式.一般我们通过在 gradle 文件中配置依赖来解决,但是如果通过include的方式来引入第三方库的时候 ...
- C++ Primer 有感(异常处理)(二)
异常就是运行时出现的不正常,例如运行时耗尽了内存或遇到意外的非法输入.异常存在于程序的正常功能之外,并要求程序立即处理.不能不处理异常,异常是足够重要的,使程序不能继续正常执行的事件.如果找不到匹配的 ...
- (NO.00003)iOS游戏简单的机器人投射游戏成形记(八)
回到Xcode,新建ArmStatic类,继承于CCSprite.同样在初始化方法中打开用户交互. 下面添加触摸回调方法,touchBegan以及touchMoved方法和Arm基本相同,主要不同处在 ...
- chrome "Provisional headers are shown"
我的问题的,每次打开浏览器,点开有视频的页面(云平台的存储),然后当视频还没有加载完,就马上关闭,连续操作很多次(测试的暴力测试把),F12查看就有很多很多在加载中的连接,因为连续点击太多次了,第一个 ...