这是我的第一篇技术博客,写的不好,大家多包涵,写这篇博客的主要就是总结下python的轻框架flask下的flask-mail的配置问题:
一、常见的邮箱的配置(包括QQ邮箱,126邮箱)
1、 根据
《Flask Web开发》
这本书中第6章关于flask-mail的配置,以下步骤(QQ邮箱配置为例,以下终端的演示均为在mac上进行,linux和win会略有所不同):
- 安装flask-mail
(venv) $ pip install flask-mail
- hello.py中的配置(以qq邮箱为例):
import os
# ...
app.config['MAIL_SERVER'] = 'smtp.qq.com'
app.config['MAIL_PORT'] = 25
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')
app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]'
app.config['FLASKY_MAIL_SENDER'] = 'Flasky Admin <1906242834@qq.com>'
app.config['FLASKY_ADMIN'] = os.environ.get('FLASKY_ADMIN')
其中用户的邮箱名、密码、以及管理员的邮箱是通过环境变量导入的,以下为终端中的操作:
(venv) $ export MAIL_PASSWORD='xxxxx' #自己的邮箱客户端登录密码(不同于电脑登录的密码)
(venv) $ echo $MAIL_PASSWORD # 打印密码确定导入的密码是否正确
xxxxx
(venv) $ export MAIL_USERNAME='2450385291@qq.com' # 自己的邮箱地址
(venv) $ echo $MAIL_USERNAME # 打印自己的邮箱地址确认是否正确
2450385291@qq.com
(venv) $ export FLASKY_ADMIN='2450385291@qq.com' #导入管理员的邮箱地址
(venv) $ echo $FLASKY_ADMIN # 打印管理员的邮箱地址
1906242834@qq.com
下面简单说下,怎么开启QQ邮箱的SMTP服务(允许在第三方的客户端登录),
-
登录自己的QQ邮箱 ,在首页点击设置,进入设置选项:
-
设置页面
-
根据提示打开SMTP服务(POP3和IMAP两个都打开)生成授权码,这个授权码就是我们在使用flask-mail时候的用户密码,也是我们在手机客户端登录邮箱时的密码。
-
下面让我们在终端进行一次测试
(venv) $ python hello1.py shell
>>> from flask.ext.mail import Message
>>> from hello1 import mail
>>> msg = Message('test subject', sender='2450385291@qq.com',
... recipients=['2450385291@qq.com'])
>>> msg.body = 'text body'
>>> msg.html = '<b>HTML</b>'
>>> with app.app_context():
... mail.send(msg)
...
>>>
-
看一下测试结果,成功啦,:)。
注意:测试发邮件的终端窗口必须是在刚才导入环境变量的终端窗口,并且如果关闭此终端的话,那么,环境变量的导入就会失效(必须重新导入)
- 在最后集成的大规模应用中的config.py下的配置:
import os
# ...
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
MAIL_SERVER = 'smtp.qq.com'
MAIL_PORT = 25
MAIL_USE_TLS = True
MAIL_DEBUG = True
MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
FLASKY_MAIL_SUBJECT_PREFIX = '[FLASKY]'
FLASKY_MAIL_SENDER = 'Flasky Admin <xxxxxxx@qq.com>'
FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
其中
TLS
是指的是传输层安全协议,在此处应打开,确保安全传输;DEBUG调试打开是方便我们接受到任何关于flask-mail的错误信息;其他的导入方法和上面的QQ邮箱在终端中的导入方法类似。
2、126邮箱的配置:
- 在hello1.py中的配置:
import os
# ...
app.config['MAIL_SERVER'] = 'smtp.126.com'
app.config['MAIL_PORT'] = 25
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME']=os.environ.get('MAIL_USERNAME')
app.config['MAIL_PASSWORD']=os.environ.get('MAIL_PASSWORD')
app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]'
app.config['FLASKY_MAIL_SENDER'] = 'Flasky Admin <xxxxxxx@126.com>'
app.config['FLASKY_ADMIN']=os.environ.get('FLASKY_ADMIN')
- 在终端下的导入环境变量:
(venv) $ export MAIL_USERNAME='xxxxxxxxx@126.com'
(venv) $ export MAIL_PASSWORD='xxxxxxxx'
(venv) $ echo $MAIL_USERNAME
xxxxxxxxx@126.com
(venv) $ echo $MAIL_PASSWORD
xxxxxxxx
(venv) $ python hello1.py shell
>>> from flask.ext.mail import Message
>>> from hello1 import mail
>>> msg = Message('test subject', sender='xxxxxxxxx@126.com',
... recipients=['xxxxxxxxx@126.com'])
>>> msg.body = 'text body'
>>> msg.html = '<b>HTML</b>'
>>> with app.app_context():
... mail.send(msg) # 此处没有报错的话,说明就发送成功了
... # 注意:测试发邮件的终端必须是刚刚导入环境变量的终端
-
在邮箱中查看一下 :
说明发送成功了,:)。 - 在大型的项目目录中的config.py中的配置,我就不一一赘述了,跟上面QQ邮箱的类似,大家照此写就可以了。
二、对于flask-mail环境变量导入的优化以及常见问题的分析:
1、flask-mail环境变量的导入的优化方法:
使用环境变量导入邮箱的用户名和密码,显然从理论上讲是非常安全的,但是在我们的编码过程中,每次测试都要重复导入,因为终端一旦关闭,那么导入的环境变量就会失效,对于我们来说是十分不方便的,所以小编根据自己的经验,给大家提供一种较为方便的方法。
- 在hello1.py的同级目录下,新建一个py文件,命名为info.py:
- 在info.py中写入自己的邮箱用户名和密码:
USERNAME = 'xxxxxxxx@qq.com'
PASSWORD = 'yyyyyy'
在hello1.py中的代码如何:
import os
# ...
from info import USERNAME, PASSWORD #从info.py中导入邮箱账户和密码
app.config['MAIL_SERVER'] = 'smtp.qq.com'
app.config['MAIL_PORT'] = 25
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = USERNAME #将邮箱账户赋值
app.config['MAIL_PASSWORD'] = PASSWORD #将邮箱密码进行赋值
app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]'
app.config['FLASKY_MAIL_SENDER'] = 'Flasky Admin <xxxxxxx@qq.com>'
app.config['FLASKY_ADMIN'] = USERNAME
由此就不用每次在终端里进行环境变量的导入了,但是很多朋友可能会想,我的代码是推送到线上的,那我push的时候不就直接推送到github上了,别人不就可以看见我的邮箱和密码了吗(确实有这个问题,小编的邮箱原来就差点泄露过),对于使用github的小伙伴来说,可以设置,对 git的隐藏文件 .gitignore进行编辑:
(venv) $ vim .gitignore
进入.gitignore文件:
88 # Rope project settings
89 .ropeproject
90 Status API Training Shop Blog About
91
92 secret.py # 将你不想git追踪的文件添加到里面
93 info.py
有关详细的git忽略特殊文件的做法,请移步
廖雪峰的git教程(忽略特殊文件)
,关于有朋友使用pycharm集成IDE的,自己查阅相关文档进行设置,在这里不一一赘述了。
2、flask-mail测试发邮件过程中的常见问题:
①连接问题:
常见错误代码:Error 553,Error 550,此类错误代码一般提示连接被拒绝,原因可能是:1、邮箱的客户端密码不对,此为第一个要排除的问题,实在不行建议重新生成一个;2、邮箱的端口不对,我在这里设置的端口25,经过测试是可以正常运行的;3、关于邮箱的TLS没有打开,安全协议没有打开;4、在按照书上进行环境变量导入不正确,如果采用换将变量导入的话,建议一定要在终端进行打印,看显示的时候正确。
②编码问题:
有时候,你在win下进行编码,然后发现文件需要copy到虚拟机的ubuntu下,但是却发现文件显示乱码,那么很可能是编码问题,大家可以参考 AderStep紫夜阑珊-青伶巷草的博客
Python程序在Windows终端乱码解决方法
@
http://blog.csdn.net/gatieme
来参考解决。
以上就是我对flask-mail配置问题的时候的一些总结,大家可以作为参考,有什么问题,请在下面评论区评论,谢谢大家,:)。