萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> 在Python的Flask框架下收發電子郵件的教程

在Python的Flask框架下收發電子郵件的教程

   這篇文章主要介紹了在Python的Flask框架下收發電子郵件的教程,主要用到了Flask中的Flask-mail工具,需要的朋友可以參考下

  簡述

  在大多數此類教程中都會不遺余力的介紹如何使用數據庫。今天我們對數據庫暫且不表,而是來關注另一個在web應用中很重要的特性:如何推送郵件給用戶。

  在某個輕量級應用中我們可能會添加一個如下的郵件服務功能:當用戶有了新的粉絲後,我們發送一封郵件通知用戶。有很多方法可以實現這個特性,而我們希望提供出一種可復用的通用框架來處理。

  Flask-Mail介紹

  對於我們來說是幸運的,現在已經有很多外部插件來處理郵件,雖說不能百分百按照我們的想法去處理,但已經相當接近了。

  在虛擬環境中安裝 Flask-Mail是相當簡單的。Windows以外的用戶可以利用以下命令來安裝:

  ?

1 flask/bin/pip install flask-mail

  Windows用戶的安裝稍有不同,因為Flask-Mail所使用的一些模塊不能再Windows系統上運行,你可以使用以下命令:

  ?

1 flaskScriptspip install --no-deps lamson chardet flask-mail

  配置:

  回想一下前文中單元測試部分的案例,我們通過添加配置支持了一個這樣的功能:當應用的某個版本測試出錯時可以郵件通知我們。從這個例子就可以看出如何配置使用郵件支持。

  再次提醒大家,我們需要設置兩個方面的內容:

  郵件服務器信息

  用戶郵箱地址

  如下正是前文中所用到的配置

  ?

1 2 3 4 5 6 7 8 9 10 # email server MAIL_SERVER = 'your.mailserver.com' MAIL_PORT = 25 MAIL_USE_TLS = False MAIL_USE_SSL = False MAIL_USERNAME = 'you' MAIL_PASSWORD = 'your-password'   # administrator list ADMINS = ['[email protected]']

  其中並沒有設置切實可用的郵件服務器和郵箱。現在我們通過一個例子來看如何使用gmail郵箱賬戶來發送郵件:

  ?

1 2 3 4 5 6 7 8 9 10 # email server MAIL_SERVER = 'smtp.googlemail.com' MAIL_PORT = 465 MAIL_USE_TLS = False MAIL_USE_SSL = True MAIL_USERNAME = 'your-gmail-username' MAIL_PASSWORD = 'your-gmail-password'   # administrator list ADMINS = ['[email protected]']

  另外我們也可以初始化一個Mail對象來連接SMTP郵件服務器,發送郵件:

  ?

1 2 from flask.ext.mail import Mail mail = Mail(app)

  發個郵件試試!

  為了了解flask-mail如何工作的,我們可以從命令行發一封郵件看看。進入python shell並執行如下的腳本:

  ?

1 2 3 4 5 6 7 >>> from flask.ext.mail import Message >>> from app import mail >>> from config import ADMINS >>> msg = Message('test subject', sender = ADMINS[0], recipients = ADMINS) >>> msg.body = 'text body' >>> msg.html = '<b>HTML</b> body' >>> mail.send(msg)

  上面這段代碼會根據inconfig.py中配置的郵箱地址列表,以首個郵箱作為發件人給所有郵箱發送一封郵件。郵件內容會以文本和html兩種格式呈現,而你能看到哪種格式取決於你的郵件客戶端。

  多麼簡單小巧!你完全可以現在就把它集成到你的應用中。

  郵件框架

  我們現在可以編寫一個幫助函數來發送郵件。這是以上測試中一個通用版的測試。我們把這個函數放進一個新的原文件中用作郵件支持(fileapp/emails.py):

  ?

1 2 3 4 5 6 7 8 from flask.ext.mail import Message from app import mail   def send_email(subject, sender, recipients, text_body, html_body): msg = Message(subject, sender, recipients) msg.body = text_body msg.html = html_body mail.send(msg)

  Flask-Mail的郵件支持超出了我們目前的使用范圍,像密件抄送和附件的功能並不會在此應用中得以使用。

  Follower 提醒

  現在,我們已經有了發郵件的基本框架,我們可以寫發送follower提醒的函數了 (fileapp/emails.py):

  ?

1 2 3 4 5 6 7 8 9 10 11 from flask import render_template from config import ADMINS   def follower_notification(followed, follower): send_email("[microblog] %s is now following you!" % follower.nickname, ADMINS[0], [followed.email], render_template("follower_email.txt", user = followed, follower = follower), render_template("follower_email.html", user = followed, follower = follower))

  你在這裡找到任何驚喜了嗎?我們的老朋友render_template函數有一次出現了。

  如果你還記得,我們使用這個函數在views渲染模版. 就像在views裡寫html不好一樣,使用郵件模版是理想的選擇。我們要可能的將邏輯和表現分開,所以email模版也會和其它試圖模版一起放到在模版文件夾裡.

  所以,我們需要為follower提醒郵件寫純文本和網頁版的郵件模版,下面這個是純文本的版本 (fileapp/templates/follower_email.txt):

  ?

1 2 3 4 5 6 7 8 9 Dear {{user.nickname}},   {{follower.nickname}} is now a follower. Click on the following link to visit {{follower.nickname}}'s profile page:   {{url_for("user", nickname = follower.nickname, _external = True)}}   Regards,   The microblog admin

  下面這個是網頁版的郵件,效果會更好(fileapp/templates/follower_email.html):

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 <p>Dear {{user.nickname}},</p> <p><a href="{{url_for("user", nickname = follower.nickname, _external = True)}}">{{follower.nickname}}</a> is now a follower.</p> <table> <tr valign="top&quo
copyright © 萬盛學電腦網 all rights reserved