天天看點

python搭建郵件伺服器位址_【玩樹莓】程式設計篇(三)Python 實作SMTP發送郵件、Web伺服器...

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!"

軟體運作效果:

python搭建郵件伺服器位址_【玩樹莓】程式設計篇(三)Python 實作SMTP發送郵件、Web伺服器...

樹莓派發送郵件

python搭建郵件伺服器位址_【玩樹莓】程式設計篇(三)Python 實作SMTP發送郵件、Web伺服器...

接收到的郵件

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搭建郵件伺服器位址_【玩樹莓】程式設計篇(三)Python 實作SMTP發送郵件、Web伺服器...

通過Python啟動CGI HTTP Server

python搭建郵件伺服器位址_【玩樹莓】程式設計篇(三)Python 實作SMTP發送郵件、Web伺服器...

通路樹莓派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搭建郵件伺服器位址_【玩樹莓】程式設計篇(三)Python 實作SMTP發送郵件、Web伺服器...

遠端調用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的狀态控制了。其效果如圖所示:

python搭建郵件伺服器位址_【玩樹莓】程式設計篇(三)Python 實作SMTP發送郵件、Web伺服器...

網頁控制LED