1. 使用SMTP發送郵件
SMTP (Simple Mail Transfer Protocol)即簡單郵件傳輸協定,通過該協定可以用簡短的代碼完成郵件的接收和發送。Python提供了smtplib庫來進行SMTP操作,下面就是一個SMTP發送郵件的例子。
我們首先要準備好一些郵件必要的資訊,如接收方的位址。另外由于郵件發送本身還是由郵件伺服器完成的,是以需要郵件伺服器的位址和賬号、密碼。
這裡采用Gmail郵箱來發送郵件,使用者名為[email protected],密碼是123456。Gmail的SMTP伺服器位址為smtp.gmail.com,端口号為587,使用TLS安全協定(其他常用的郵箱可以在運作商網站上查詢,使用不同的安全協定,端口号可能有所不同)。
而郵件的内容則由純文字構成,包含标題、正文、收發件人的位址等。
發送郵件的基本流程為:連接配接SMTP伺服器 -> 開啟安全協定并登入 -> 發送郵件 -> 結束。
import smtplib
#設定收件人、發件人
smtpDstAddr = "[email protected]"
smtpSrcAddr = "[email protected]"
#設定SMTP伺服器資訊
smtpServer = "smtp.gmail.com"
smtpPwd = "123456"
smtpPort = 587
#建構郵件内容
mailSubject = "Raspberry Pi SMTP"
mailText = "This is a test mail from a RABBIT!"
mailMsg = "To: " + smtpDstAddr + "\n" + \
"From: " + smtpSrcAddr + "\n" + \
"Subject: " + mailSubject + "\n" + \
"\n" + mailText + "\n"
#啟動郵件發送流程,詳見上文
print "Connecting to SMTP server %s (port: %d)..." %(smtpServer, smtpPort)
mySMTP = smtplib.SMTP(smtpServer, smtpPort)
print "Starting transport layer security..."
mySMTP.starttls() # Transport layer security
print "Processing login..."
mySMTP.login(smtpSrcAddr, smtpPwd)
print "Sending the mail..."
mySMTP.sendmail(smtpSrcAddr, smtpDstAddr, mailMsg)
print "Closing STMP..."
mySMTP.close
print "All done!"
軟體運作效果:
樹莓派發送郵件
接收到的郵件
2. Web Server程式設計
Web Server是基于HTTP協定的網頁伺服器,它接收使用者的HTTP請求并傳回使用者需要的資料。通過建立Web伺服器可以豐富樹莓派的操作接口,在任何地點、任何裝置上通路并操作樹莓派。
雖然網絡上有各種功能強大的開源Web伺服器,但是我們有時候希望能夠把HTTP服務加入到自己的程式裡來,并通過CGI實作更靈活的互動。
2.1 建立一個簡單的Web Server
Python自帶了CGI HTTP Server指令,可以通過一條指令快速啟動HTTP伺服器。
$ python -m CGIHTTPServer 8000
其中8000為伺服器的端口号,當伺服器運作後,可以在樹莓派上通過https://127.0.0.1:8000
位址通路伺服器,或者在别的裝置上輸入樹莓派的IP位址和端口号。
但是這時我們還不能通路網站,因為網站缺少一個首頁。預設的首頁檔案為index.htm或者.html。建立index.htm檔案并輸入如下内容:
Simple Test Page
這就是一個由HTML語言寫成的簡單首頁,
…部分的文字會顯示在浏覽器标題欄,… 部分則顯示了網頁的頁面内容。
在index.htm檔案所在目錄下運作啟動server的指令,即可通過浏覽器通路網站了。Web伺服器實際是根據使用者的請求,将HTML檔案中的内容以純文字的形式(人家叫超文本_)傳送給浏覽器,浏覽器再把這段文本解析成網頁展現給使用者。
通過Python啟動CGI HTTP Server
通路樹莓派Web Server
另外,除了使用CGIHTTPServer指令,我們還可以通過Python代碼來建立伺服器,下面的代碼實作了相同的功能。
#!/usr/bin/env python
import BaseHTTPServer
import CGIHTTPServer
server = BaseHTTPServer.HTTPServer
handler = CGIHTTPServer.CGIHTTPRequestHandler
server_address = ("", 8000)
handler.cgi_directories = [""]
httpd = server(server_address, handler)
httpd.serve_forever()
2.2 通過CGI遠端執行代碼
在index.htm檔案的相同目錄下建立一個cgi-bin目錄。上一節代碼中的handler.cgi_directories就指定了CGI目錄,如果不進行指定,預設執行目錄就是cgi-bin。
同時,在cgi-bin目錄下建立一個名為led_ctrl.py的Python檔案,其代碼如下:
#!/usr/bin/env python
import sys
import os
import wiringpi
os.system("gpio export 11 out")
io = wiringpi.GPIO(wiringpi.GPIO.WPI_MODE_SYS)
io.pinMode(11,io.OUTPUT)
Command = int(sys.argv[1])
if Command == 1:
Result = "LED is ON!"
io.digitalWrite(11,io.LOW)
else:
Result = "LED is OFF!"
io.digitalWrite(11,io.HIGH)
print"Content-Type: text/html"
print"""
LED Control
"""%Result
沒錯,這就是一個簡單的LED控制程式。與其他使用wiringPi的Python程式一樣,因為使用了WPI_MODE_SYS模式初始化,是以需要對GPIO進行export操作。os.system("gpio export 11 out")相當于在Linux Shell裡敲了gpio export 11 out這麼一行指令。sys.argv[1]參數代表執行程式時後面跟的第一個參數(sys.argv[0]表示執行程式的指令本身),參數控制了LED的亮滅。不同的是,程式的最後會使用print将LED的狀态轉換成一個簡單的網頁顯示出來。
修改Python檔案的可執行屬性,然後在index.htm所在目錄運作指令啟動伺服器。
$ chmod 755 ./cgi-bin/led_ctrl.py
$ python -m CGIHTTPServer 8000
在浏覽器中輸入led_ctrl程式的位置和參數,即可實作對LED的遠端控制。
https://192.168.0.28:8000/cgi-bin/led_ctrl.py?1
遠端調用Python程式
2.3 網頁控制GPIO
實作了Web伺服器和遠端調用Python程式後,我們就可以把二者結合起來,通過網頁上的按鈕控制GPIO。
修改index.htm檔案,向其中添加如下内容:
function LED_On()
{
webpage = "./cgi-bin/led_ctrl.py?1"
window.open(webpage, "Window1","height=40,width=250,top=120,left=100");
}
function LED_Off()
{
webpage = "./cgi-bin/led_ctrl.py?0"
window.open(webpage,"Window1","height=40,width=250,top=120,left=100");
}
LED Test Page
Press button to control the LEDs!
頁面中添加了兩個按鈕ON和OFF,并通過JavaScript定義了按鈕按下時執行的操作——以新網頁視窗的形式打開“./cgi-bin/led_ctrl.py”檔案,并賦予不同的參數。
編輯完成後,儲存并運作Server。通過按下ON/OFF按鈕,就可以實作LED的狀态控制了。其效果如圖所示:
網頁控制LED