Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 612|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-7-18 17:19:48 | 显示全部楼层 |阅读模式

    一、发送邮件的配置

    在学习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#

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 10:51 , Processed in 0.062906 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表