只用一條網址直接發送電子郵件!超級實用!


      前些天在gae上部署了一個定時往手機發送天氣預報的小python程序,原理很簡單,就是抓取天氣網站,然后解析頁面得到天氣信息,再利用gae的郵件功能往自己的139郵箱發送電子郵件,手機就能免費接收天氣預報了。

      后來發現gae上有郵件發送次數限制,一個月只能發送100封電子郵件,假如給我爸,媽和我一天發一封的話,一個月就90多條了,我測試已經費了幾條了,如果還想給其他親朋好友發送天氣預報,或者自己接收一些其他電子郵件信息的話,怎么夠用?問題就這樣來了。。。

      本來想在gae上直接調用python的smtplib 模塊發送郵件,發現不能用。囧rz....

      於是乎,苦尋各種解決方案-_-

方案1:直接解析郵箱登錄頁面,登錄並發送郵件---->太麻煩,依賴於服務網站

方案2:利用”消息速遞“往手機上推送---->只能在智能手機上用,不能推廣

方案3:尋求免登錄直接發送郵件的網站,類似於十分鍾郵箱的東西,但是這種郵箱一般只能接收郵件,不能發送郵件,即使能發送的話也容易被識別為垃圾郵件,不靠譜。

方案4:利用飛信發送發送---->飛信協議變化很快,現在網上流行的飛信模塊一般都需要輸入驗證碼,不知道哪位大仙能把驗證碼直接識別出來?(wap飛信主頁

方案5: 利用gmail,163,QQ等提供的郵件列表群發---->群發可以,但如果給每個人發的郵件內容不同的話就不行了

方案6:絞盡腦汁,繼續想~~~~

      糾結了好一陣后,一個神奇的想法誕生了:為何不在自己的服務器上搭建一個發送郵件的環境呢?我需要的僅僅是發送郵件的功能,要讓外部最方便地使用這個發送郵件的功能,怎樣算是最簡單呢?直接在瀏覽器地址欄上輸入一個網址就執行發送郵件命令是不是很簡單?我設計了一下,當然網址里面要有必要的信息,如收件人,郵件主題,內容等。像這樣的網址”http://XXX.com/mailto/aaaa@163.com/bbbb/cccc“,翻譯過來就是給aaaa@163.com發送一封主題為bbbb,正文為cccc的郵件,是不是很簡單?到時候只要讓gae上的程序去訪問這個網址,就實現發郵件的功能啦!或許你會說,這樣直接GET網址太不安全了,里面的信息都明文顯示出來了。嘿嘿,無所謂啦,反正我不用這個發送私密信息,像天氣預報這樣的信息黑客想截就截吧。如果您有興趣改成post也行哈!

      想法有了,接下來就是去實現這個想法啦!我選擇了python里面最簡單的web模塊:web.py來接收外部請求,然后對請求進行解析,得到郵箱,主題和正文,然后調用發送郵件的函數去發送郵件,汗~這么簡單,看看代碼吧

# !/usr/bin/env python
#
coding=utf-8
import web
import urllib
import logging
from sendmail  import send_mail
urls = (
     #     '/(.*)','hello',
     ' /mailto/(.*) ', ' webmail '
)

app = web.application(urls,globals())

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler( ' webmail.log ')
fh.setLevel(logging.DEBUG)
formatter = logging.Formatter( ' %(asctime)s - %(message)s ')  
fh.setFormatter(formatter)
logger.addHandler(fh)

class webmail:
     __doc__ = '''
    Send Mail to Anyone!
    usage:
    http://xxx.com/mailto/{mail_address}/{subject}/{body}
    example:
    http://xxx.com/mailto/aaaa@qq.com/subject/body/   
    multi-address:
    http://xxx.com/mailto/aaaa@qq.com/bbbb@163.com/subject/body/
    
'''
     def GET(self,name):
        logger.info(name)
        info = urllib.unquote(name).split( ' / ')
        info = [i  for i  in info  if i !=  '']
         if len(info) < 3:
             return webmail. __doc__
         try:
            send_mail(info[:-2],info[-2],info[-1])
         except:
             return  ' Failed Send Mail '
         print info
        render = web.template.render( ' ./ ')
         return render.pages(info[:-2],info[-2],info[-1])

if  __name__== ' __main__ ':
    app.run()

application = app.wsgifunc() 

       web.py就是簡單,小巧。代碼中,用get來接收外部請求,得到的請求在name中,然后轉換編碼,再按’/‘來對網址進行划分,這樣得到的info列表里面就有我們需要的信息啦,為了放止info列表中存在空的元素,用一個列表的內建循環來刪除空元素,很酷吧!哈哈!接下來判斷信息是否完整,如果小於3,肯定不全啊,看看說明吧,把”__doc__“返回。信息正確的話,那就發唄,為了方便進行群發,我又對信息進行了簡單定義,定義最后一個信息就是正文,倒數第二個信息就是主題,倒數第二個往前的都是收件人地址!哈哈,怎么樣,很簡單吧?然后就調用發送郵件函數進行發送唄,為了方便使用,我對sendmail函數進行了簡單封裝:

# coding=utf-8
def send_mail(to_list,sub,content):
     import smtplib
     from email.mime.text  import MIMEText
    mail_host= " smtp.163.com "   # 設置服務器
    mail_user= ""     # 用戶名
    mail_pass= ""    # 口令
    mail_postfix= " 163.com "   # 發件箱的后綴
    
    me= " groupmail "+ " < "+mail_user+ " @ "+mail_postfix+ " > "
    msg = MIMEText(content,_subtype= ' plain ',_charset= ' gb2312 ')
    msg[ ' Subject '] = sub
    msg[ ' From '] = me
    msg[ ' To '] =  " ; ".join(to_list)
     try:
        server = smtplib.SMTP()
        server.connect(mail_host)
        server.login(mail_user,mail_pass)
        server.sendmail(me, to_list, msg.as_string())
        server.close()
         return True
     except Exception, e:
         raise str(e) 

      如果你也想做這么個小東西的話,可能需要在sendmail模塊里面填上自己郵箱的用戶名和密碼。

      接下來要判斷是否發送成功,失敗的話給個錯誤信息就是了,成功的話也返回個信息,我想了想,直接把用戶提交的發送郵件請求輸出來吧,這樣方便用戶核對是否發送正確,於是,web.py里面的小巧又強大的模板引擎就派上用場了:

$def with(to,sub,body)
< META  charset ='utf-8' >
< p >Send Success! </ p >
< p >to: 
$for c in to:
    $c,
</ p >

< p >subject:$sub </ p >

<p>body:$body</p> 

      信息無須太多,界面不用太炫,簡簡單單,把該顯示的顯示就是了。web.py模板里面可以寫入類似python的語句,例如上面的for循環,就是把列表里面的每個郵件地址輸出來,這樣實現起來很酷!感覺貌似比django的模板引擎好用呢!

      這樣就算基本實現功能了,接下來,還有一個重頭戲,嘿嘿,部署!網上搜了一下,web.py可以和apache或者nginx部署在一塊,然后找教程,然后比着做,弄了半天,愣是沒部署上!悲劇!也不知道是神馬原因。反正我記得部署很麻煩。寫這個程序還不如部署的時間長呢!這怎么行?!我喜歡python的簡單,我希望部署python程序也是簡單的,再去找,果然找到了一種方法,很簡單,和大家共享一下。我是用uwsgi進行部署,這個程序可以這樣安裝:sudo easy_install uwsgi,安裝過程如果提示缺少python.h,則需要安裝python-dev,直接apt-get安裝就可以。安裝完后,就可以執行了,用這個命令:uwsgi --http :8080 -w test -p 4 --enable-threads ,這個命令的意思是把test這個python程序部署到本地的8080端口上,並發四個線程和一個主控進程,支持python線程調試,大體就這個意思,想具體了解的可以參考網上資料。上面的命令這么長,不太容易記,寫到start.sh腳本里面吧!

      后來想想,再增加一個記錄日志的功能吧,把所有的請求都用logging模塊保存起來,畢竟這個郵箱是公開的,萬一有什么異常的話可以去查看日志。 

      這個任務就算基本完成啦,用強大的markdown寫個說明放到github上共享一下!https://github.com/ma6174/webmail,想下載安裝的友友可以去看看。

      然后再寫個博客推廣一下http://www.cnblogs.com/ma6174/archive/2012/08/06/2625477.html
      最后再寫個總結吧: 上面的小程序僅僅實現了一個小工能,或許大家可以對這個程序進行拓廣,比如增加簡單的認證,不然的話任何人只要知道網址就能發送,這樣的話垃圾郵件又滿天飛啦!哈哈,這不是我們希望的。再有的話,可以實現一些其他功能,比如遠程遙控?只要讓服務器解析出你的命令然后去執行就可以啦!或者說,某天你想給好友發電子郵件,又懶得登郵箱,直接在瀏覽器地址欄里面輸入就行啦,一敲回車,立即發送!更多精彩,由你創造!

      下面是一些參考資料,在網上找的,保存到我的麥庫記事了,有興趣的朋友可以去深入研究一下。(順便說一下,麥庫記事是個好東西!)

web.py模板系統:https://note.sdo.com/u/ma6174/n/M5cEN~k1Z0PVnM1XI001CA
python的logging模塊:https://note.sdo.com/u/ma6174/n/M5cEN~k1ZT4FnM1XI001-K

用uwsgi快速部署web.py應用:http://note.sdo.com/u/ma6174/n/M5cEN~k1ZBgpnM1XI001TH

web.py新手指南:http://note.sdo.com/u/ma6174/n/M5cEN~k14rcMLX0TQ000za 

(如果感覺麥庫還不錯的話可以去注冊一個奧,我有邀請碼634687868481358385


免責聲明!

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



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