专栏首页PythonFlask-email 发送邮件的配置,发送附件的方法,以及os.environ.get('MAIL_USERNAME')为None的解决办法

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#

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 守护线程与守护进程

    一 守护进程 主进程创建守护进程   其一:守护进程会在主进程代码执行结束后就终止   其二:守护进程内无法再开启子进程,否则抛出异常:AssertionErr...

    用户1214487
  • python3安装mysqlclient,解决django使用pymysql报错的问题

    在django中为了使用MySQL,一般是在项目目录下的__init__.py中添加

    用户1214487
  • Python Redis pipeline操作和Redis乐观锁保持数据一致性

    Redis是建立在TCP协议基础上的CS架构,客户端client对redis server采取请求响应的方式交互。

    用户1214487
  • docker-compose部署pinpoint开启email报警功能

    三杯水Plus
  • Dubbo使用jsr303框架hibernate-validator遇到 ConstraintDescriptorImpl could not be instantiated

    Dubbo可以集成jsr303标准规范的验证框架,作为验证框架不二人选的hibernate-validator是大家都会经常在项目中使用的,但是在Dubbo使用...

    王念博客
  • Struts 拦截器

    需要继承该抽象类,并实现其方法 即 com.opensymphony.xwork2.interceptor.AbstractInterceptor 抽象类

    mySoul
  • Netty4.x整合SpringBoot2.x使用Protobuf3详解

    本篇文章主要介绍的是SpringBoot整合Netty以及使用Protobuf进行数据传输的相关内容。Protobuf会介绍下用法,至于Netty在netty ...

    sanshengshui
  • 中国科学家研制出世界首台液态金属机器“终结者”

    中国科学家造出了世界首台液态金属机器,这一成就被外媒形容为制造出“终结者”。 据中科院理化所网站,3月3日,由刘静研究员带领的中国科学院理化技术研究所、清华大...

    机器人网
  • 增强式学习核心算法:基于策略的梯度下降法

    我们要打造一个Agent,也就是智能机器人,它运作在一个给定环境中。它每次与环境互动时都有给定种选择,同时它可以获得当前环境的状态,Agent如果在有限种选择...

    望月从良
  • 使用Golang免杀Tips

    在此文章中,将详细介绍一个很酷的小技巧,它涉及如何绕过大多数防病毒产品以在目标主机上获得Metepreter反向shell.

    黑白天安全

扫码关注云+社区

领取腾讯云代金券