當前位置:首頁 » 編程語言 » pythonhtml郵件

pythonhtml郵件

發布時間: 2024-06-14 00:52:36

㈠ 在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
配置:
回想汪指一下前文中單元測試部分的案例,我們通過添加配置支持了一個這樣的功能:當應用的某個版本測試出錯時可以郵件通知我們。從這個例子就可以看出如何配置使用郵件支持。
再次提醒大家,我們需要設置兩個方面的內容:
郵件伺服器信息
用戶郵箱地址
如下正是前文中所用到的配置
# email server
MAIL_SERVER =
MAIL_PORT = 25
MAIL_USE_TLS = False
MAIL_USE_SSL = False
MAIL_USERNAME = you
MAIL_PASSWORD = your-password
# administrator list
ADMINS = [[email protected]]
其中並沒有設置切實可用的郵件伺服器和郵箱。現在我們通過一個例子來看如何使用gmail郵箱賬戶來發送郵件:
# email server
MAIL_SERVER =
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並執行如下的腳本
?
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 = bHTML/b body
mail.send(msg)
上面這段代碼會根據inconfig.py中配置的郵箱地址列表,以首個郵箱作為發件人給所有郵箱發送一封郵件。郵件內容會以文本和html兩種格式呈現,而你能看到哪種格式取決於你的郵件客戶端。
多麼簡單小巧!你完全可以現在就把它集成到你的應用中。
郵件框架
我們現在可以編寫一個幫助函數來發送郵件。困滑配這是以上測試中一個通用版的測試。我們把這個函數放進一個新的原文件中用作郵件支持(fileapp/emails.py):
?
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):
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):
?
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):
11
12
13
pDear {{user.nickname}},/p
pa href={{url_for(user, nickname = follower.nickname, _external = True)}}{{follower.nickname}}/a is now a follower./p
table
tr valign=top
tdimg src={{follower.avatar(50)}}/td
td
a href={{url_for(user, nickname = follower.nickname, _external = True)}}{{follower.nickname}}/abr /
{{follower.about_me}}
/td
/tr
/table
pRegards,/p
pThe codemicroblog/code admin/p
註解:模版中的url_for函數的 _external = True 參數的意義.默認情況下,url_for 函數生成url是相對我們的域名的。例如,url_for(index)函數返回值是/index, 但是,發郵件是我們想要
最後一步是處理「follow」過程,即觸發郵件提醒時的視圖函數,(fileapp/views.py):
?
7
8
9
from emails import follower_notification
@app.route(/follow/nickname)
@login_required
def follow(nickname):
user = User.query.filter_by(nickname = nickname).first()
# ...
follower_notification(user, g.user)
return redirect(url_for(user, nickname = nickname))
現在你可以創建兩個用戶(如果還沒有用戶的話)嘗試著用讓一個用戶follow另一個用戶,理解郵件提醒是怎樣工作的。
就是這樣嗎?我們做完了嗎?
我們可能心底里很興奮完成了這項工作並且把郵件提醒功能同未完成列表裡刪除。
但是,如果你現在測試下應用,你會發現當你單擊follow鏈接的時候,頁面會2到3秒才會響應,瀏覽器才會刷新,這在之前是沒有的。
發生了什麼?
問題是,Flask-Mail 使用同步模式發送電子郵件。 從電子郵件發送開始,直到電子郵件交付後,給瀏覽器發回其響應,在整個過程中,Web伺服器會一直阻塞。如果我們試圖發送電子郵件到一個伺服器是緩慢的,甚至更糟糕的,暫時處於離線狀態,你能想像會發生什麼嗎?很不好。
這是一個可怕的限制,發送電子郵件應該是後台任務且不會干擾Web伺服器,讓我們看看我們如何能夠解決這個問題。
Python中執行非同步調用
我們想send_email 函數發完郵件後立即返回,需要讓發郵件移動到後台進程來非同步執行。
事實上python已經對非同步任務提供了支持,但實際上,還可以用其他的方式,比如線程和多進程模塊也可以實現非同步任務。
每當我們需要發郵件的時候,啟動一個線程來處理,比啟動一個全新的進程節省資源。所以,讓我們將mail.send(msg)調用放到另一個線程中。(fileapp/emails.py):
11
from threading import Thread
def send_async_email(msg):
mail.send(msg)
def send_email(subject, sender, recipients, text_body, html_body):
msg = Message(subject, sender = sender, recipients = recipients)
msg.body = text_body
msg.html = html_body
thr = threading.Thread(target = send_async_email, args = [msg])
thr.start()
如果你測試『follow『函數,現在你會發現瀏覽器在發送郵件之前會刷新。
所以,我們已經實現了非同步發送,但是,如果未來在別的需要非同步功能的地方難道我們還需要在實現一遍嗎?
過程都是一樣的,這樣就會在每一種情況下都有重復代碼,這樣非常不好。
我們可以通過 decorator改進代碼。使用裝飾器的代碼是這樣的:
11
from decorators import async
@async
def send_async_email(msg):
mail.send(msg)
def send_email(subject, sender, recipients, text_body, html_body):
msg = Message(subject, sender = sender, recipients = recipients)
msg.body = text_body
msg.html = html_body
send_async_email(msg)
更好了,對不對?
實現這種方式的代碼實際上很簡單,創建一個新源文件(fileapp/decorators.py):
?
7
from threading import Thread
def async(f):
def wrapper(*args, **kwargs):
thr = Thread(target = f, args = args, kwargs = kwargs)
thr.start()
return wrapper
現在我們對非同步任務創建了個有用的框架(framework), 我們可以說已經完成了!
僅僅作為一個練習,讓我們思考一下為什麼這個方法會看上去使用了進程而不是線程。我們並不想每當我們需要發送一封郵件時就有一個進程被啟動,所以我們能夠使用thePoolclass而不用themultiprocessingmole。這個類會創建指定數量的進程(這些都是主進程的子進程),並且這些子進程會通過theapply_asyncmethod送到進程池,等待接受任務去工作。這可能對於一個繁忙的網站會是一個有趣的途徑,但是我們目前仍將維持現在線程的方式。

㈡ Python發送郵件,body是html(純文本)的,收到後怎麼變成了源碼格式了

fromemail.mime.textimportMIMEText
...
body=MIMEText(content,_subtype='html',_charset='utf8')
...
send_mail(mail,subject,body.as_string())

㈢ 在python中怎麼生成html格式的郵件並發送

請將代碼中的email和密碼替換成您的email和密碼。
# -*- coding: cp936 -*-
import smtplib
msg = """From: From xxx
To: To UESEO <xxx>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test
This is an e-mail message to be sent in HTML format
<b>This is HTML message.</b>
<h1>This is headline.</h1>
<h2>sdfsdfdsf</h2>
"""
server = smtplib.SMTP('xxx',587) #port 465 or 587
server.ehlo()
server.starttls()
server.ehlo()
server.login('xxx','XXXXXX')#請替換成您的email和密碼
server.sendmail('xxx','xxxg',msg)
server.close()

㈣ python發送html格式郵件與發送text格式郵件的不同

HTML格式請用壓縮包方式打包發送,否測有些網站會認為你在發送特殊代碼,要麼出錯,要麼直接定義你為不友善行為,拒絕發送或接受。TEXT格式就沒有這個問題。

㈤ python怎麼安裝sendmail

Python已經被移植在許多平台上(經過改動使它能夠工作在不同平台上)。

您需要下載適用於您使用平台的二進制代碼,然後安裝Python。

如果您平台的二進制代碼是不可用的,你需要使用C編譯器手動編譯源代碼。

編譯的源代碼,功能上有更多的選擇性, 為python安裝提供了更多的靈活性。。。

㈥ Python 發送多圖郵件為什麼只顯示第一張

  1. 首先你在編輯你的網頁郵件模板的時候需要(代碼自己優化,可以根據圖片數量進行判斷拼湊,看到你的問題馬上想到的簡單處理方案)

    msgText=MIMEText('<b>Some<i>HTML</i>text</b>andanimage.<br>'
    '<imgsrc="cid:image1">'
    '<imgsrc="cid:image2">'
    '<imgsrc="cid:image3">'
    '<br>good!','html','utf-8')
    msgRoot.attach(msgText)
  2. 然後後面附件要用(我這里比如3個圖片,代碼可以自己調整)
    foriinrange(1,4,1):
    fp=open('d:\python_jpg\%i.jpg'%i,'rb')
    msgImage=MIMEImage(fp.read())
    fp.close()
    msgImage.add_header('Content-ID','<image%i>'%i)
    msgRoot.attach(msgImage)
  3. 完整測試代碼如下:
    #!/usr/bin/python
    #-*-coding:utf-8-*-
    __author__='cyc'
    __data__='2015/10/20'
    #!/usr/bin/envpython3
    #coding:utf-8
    importsmtplib
    fromemail.mime.multipartimportMIMEMultipart
    fromemail.mime.textimportMIMEText
    fromemail.mime.imageimportMIMEImage
    sender='*@163.com'
    receiver='*@163.com'
    subject='pythonemailtest'
    smtpserver='smtp.163.com'
    username='*'
    password='*'
    msgRoot=MIMEMultipart('related')
    msgRoot['Subject']='這里是測試圖片的發送'
    msgText=MIMEText('<b>Some<i>HTML</i>text</b>andanimage.<br>'
    '<imgsrc="cid:image1">'
    '<imgsrc="cid:image2">'
    '<imgsrc="cid:image3">'
    '<br>good!','html','utf-8')
    msgRoot.attach(msgText)
    foriinrange(1,4,1):
    fp=open('d:\python_jpg\%i.jpg'%i,'rb')
    msgImage=MIMEImage(fp.read())
    fp.close()
    msgImage.add_header('Content-ID','<image%i>'%i)
    msgRoot.attach(msgImage)

    smtp=smtplib.SMTP()
    smtp.connect('smtp.163.com')
    smtp.login(username,password)
    smtp.sendmail(sender,receiver,msgRoot.as_string())
    smtp.quit()
  4. 參考資料
    http://www.jb51.net/article/34498.htm
    http://www.jb51.net/article/49216.htm

㈦ Python澶х炴暀浣300琛屼唬鐮佹悶瀹欻TML妯℃澘娓叉煋銆岄檮婧愮爜銆

妯℃澘璇璦鐢盚TML浠g爜鍜岄昏緫鎺у埗浠g爜緇勬垚錛屾ゅ @PHP 銆傞氳繃妯℃澘璇璦鍙浠ュ揩閫熺殑鐢熸垚棰勬兂鐨凥TML欏甸潰銆傚簲璇ョ畻鏄鍚庣娓叉煋涓嶅彲緙哄皯鐨勭粍鎴愰儴鍒嗐

閫氳繃浣跨敤瀛︿範 tornado bottle 鐨勬ā鏉胯璦錛屾垜涔熸晥浠跨潃瀹炵幇鍙浠ョ嫭絝嬩嬌鐢ㄧ殑妯℃澘娓叉煋鐨勪唬鐮佹ā鍧楋紝妯℃澘璇娉曟潵鑷 tornado bottle 鐨勮娉曘傚彲浠ョ敤鏉ュ仛涓浜涚畝鍗曠殑浜嬫儏 緗戦〉娓叉煋 閭浠跺唴瀹圭敓鎴 絳塇TML鏄劇ず鏂歸潰銆備互涓嬪氨鏄綆鍗曠殑璇娉曚嬌鐢ㄤ粙緇嶃

1. 鍙橀噺銆備嬌鐢 {{ }} 鍖呰9璧鋒潵錛岄噷闈㈢殑鍙橀噺涓篜ython浼犲叆銆傛ā鏉挎覆鏌撴椂浼氬皢浼犲叆鐨勫彉閲忚漿鎹㈡垚瀛楃︿覆騫跺~鍏ュ瑰簲浣嶇疆銆

2. 杞涔夈傞粯璁や紶鍏ョ殑鏁版嵁閮戒細榪涜孒TML杞涔夛紝鍙浠ヤ嬌鐢 {% raw value %} 鏉ュ皢value鐨勫唴瀹規寜鍘熷嬪瓧絎︿覆杈撳嚭銆

3. 鏉′歡鎺у埗銆傛敮鎸丳ython鐨 if錛宔lif錛宔lse 銆傛潯浠朵唬鐮侀渶瑕佹斁鍦 {% %} 鍐呴儴錛屽苟涓斿湪鏉′歡緇撴潫鍚庨渶瑕侀濆栧炲姞 {% end %} 錛岀敤浜庢爣璇嗘潯浠舵帶鍒惰鍙ュ潡鑼冨洿銆

4. 寰鐜鎺у埗銆傛敮鎸丳ython鐨 for while 銆備笌鏉′歡鎺у埗涓鏍蜂篃闇瑕佹斁鍦 {% %} 鍐呴儴錛屽苟涓旂粨鏉熷勯渶瑕侀濆栧炲姞 {% end %} 錛岀敤浜庢爣璇嗗驚鐜鎺у埗璇鍙ュ潡鐨勮寖鍥淬

榪欎釜妯℃澘璇璦妯″潡鏄鍦 Python2.7 涓婇潰寮鍙戜嬌鐢ㄧ殑錛屽傛灉瑕佸湪 Python3+ 涓婁嬌鐢ㄩ渶瑕佸 str bytes 榪涜屼竴浜涘勭悊鍗沖彲錛岀敱浜庢病鏈夊紩鐢ㄤ換浣曞叾浠栨ā鍧楋紝鍙浠ュ緢濂藉湴鐙絝嬩嬌鐢ㄣ

鍘熸枃閾炬帴錛
http://www.cnblogs.com/jeffxun/p/15585073.html

㈧ python發html郵件的時候如何在body中引用變數

#字元串格式化方法一
template1='name=%s,value=%f'
data1=('name',123)
printtemplate1%(data1)
#字元串格式化方法二
template2='name=%(name)s,value=%(value)f'
data2={'name':'panda','value':123}
printtemplate2%data2

熱點內容
華為手機方舟編譯器emui91 發布:2024-11-27 00:10:46 瀏覽:948
高考時老媽解壓 發布:2024-11-27 00:09:34 瀏覽:358
全振動演算法 發布:2024-11-27 00:00:24 瀏覽:843
編譯程序用銳龍好還是酷睿好 發布:2024-11-26 23:47:09 瀏覽:897
蘋果緩存清理後會加速嗎 發布:2024-11-26 23:28:11 瀏覽:139
我的世界伺服器修改開放埠 發布:2024-11-26 23:22:51 瀏覽:52
qt5編譯器 發布:2024-11-26 23:22:04 瀏覽:517
白糖期貨存儲多長時間 發布:2024-11-26 23:15:53 瀏覽:806
phpgettext 發布:2024-11-26 23:13:19 瀏覽:645
安卓微信的卡包在哪裡 發布:2024-11-26 23:13:18 瀏覽:204