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#

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM