下一篇:ASP開發WAP簡易郵件系統執行個體(續)
隨著手機使用者的不斷增加,WAP網站如雨後春筍迅速的滋長開來,手機郵箱也不斷的出現在人的眼前,筆者也曾經開發了一套手機郵箱的系統,但由於時間倉促再加上後來一直忙於工作事情,系統功能也就再未加強,今日有幸藉助於IT168原創網公開出來,與大家共同分享,希望大家可以借題發揮,加強系統功能,能夠更好的應用於實際。
測試軟體:Opera M3gate
測試機型:Eg730+ Nokia 6681 Moto V3i
郵件組件:W3 Jmail 4.4
一、WML結構介紹
首先我們先對WML的結構作個簡單的介紹,以便於大家更好的瀏覽源碼。
〈?xml version="1.0"?〉
〈!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1xml"〉
〈wml〉
〈head〉
〈access/〉
〈meta..../〉
〈/head〉
〈card〉
Some contents...
〈/card〉
〈wml〉
我們根據以上結構舉個最簡單的例子:
〈% @LANGUAGE="VBSCRIPT" CODEPAGE="65001" %〉
〈%Response.ContentType = "text/vnd.wap.wml; charset=UTF-8"%〉
〈?xml version="1.0"?〉
〈!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1xml"〉
〈wml〉
〈card title="郵件系統"〉
〈p〉
WML開發郵件系統
〈/p〉
〈/card〉
〈/wml〉
將以上代碼存為example.asp,直接通過M3gate查看,具體效如圖一。
圖一
“郵件系統”這一段文字為UTF-8碼,為了更好的適用於手機瀏覽,建議編碼格式採用UTF-8,大家可以下載WAP編碼轉換器對中文進行轉換。
由於我們系統採用ASP語言開發,因此在以上程式碼片段前面還需加上以下兩段代碼:
〈% @LANGUAGE="VBSCRIPT" CODEPAGE="65001" %〉
指定IIS以UTF-8的編碼格式讀取傳遞過來的串串(表單提交,地址欄傳遞等),如果需要以GB2312的格式讀取,可以將65001換成936。
〈%Response.ContentType = "text/vnd.wap.wml; charset=UTF-8"%〉
指定頁面輸出格式為WML,並且編碼為UTF-8
二、JMail組件功能介紹
W3 Jmail是一個smtp組件,利用它可以發送郵件,支援html格式郵件。你可以訪問首頁:http://tech.dimac.net 下載這個組件。w3 Jmail 發送郵件速度快,功能豐富,並且是免費的。
以下是本系統所要用到的相關函數及屬性,如需更詳細的資料可以查閱JMail的官方說明。
1、JMAIL.POP3
建立POP3對象
Set pop3 = Server.CreateObject( "JMail.POP3" )
Connect(Username, Password, Server, Port) :
開啟並串連POP3伺服器,
Username:信箱使用者名
Password:郵箱密碼
Server:POP3伺服器
Port:伺服器連接埠號碼,可選項,預設為110
樣本:mailbox.Connect "john", "qwerty", "mail.myDomain.com"
Disconnect() :
關閉連結
樣本:mailbox.Disconnect
DeleteSingleMessage(MessageID) :
從郵件伺服器上刪除由MessageID指定的郵件。
Mailbox.DeleteSingleMessage 1
Messages() : Pointer
返回Message的集合
set messages = mailbox.Messages
2、JMAIL.MESSAGE
建立Message對象:
set Message=server.CreateObject("Jmail.message")
Silent() : Boolean
如果設定為true,JMail不會拋出例外錯誤. JMail.execute() 會根據操作結果返回true或false
樣本:Message.silent = true
Charset() : String
字元集,預設為"US-ASCII"
樣本:Message.Charset = "US-ASCII"
From() : String
寄件者
樣本:Message.From=”sn1985boy@sohu.com”
Subject() : String
發送主題
樣本:Message.Subject=”測試”
Body() : String
郵件主體部分
樣本:Message.Body=“恭喜發送成功!”
MailServerUserName() : String
使用者名稱
樣本:Message.MailServerUserName=“*****”
MailServerPassWord() : String
密碼
樣本:Message.MailServerPassWord=”********”
MailDomain() : String
郵件伺服器的網域名稱
樣本:Message.MailDomain=”www.sohu.com”
Priority() : Byte
緊急程度,預設為3,1為最快,5為最慢
樣本:Message.Priority=2
Send(mailServer, enque) : Boolean
發送郵件。郵件伺服器是一個描述郵件伺服器名稱或地址的字串,使用者名稱和密碼是可選項。當要發送認證郵件時使用格式為:使用者名稱:密碼@郵件伺服器
樣本:
Message.Send("myMailServer"), Message.Send("myUserName:mypassword@mymailserver.mydomain.com")
Count() : Integer
返回郵件數
樣本:i = mailbox.Count
Item(Index) : Pointer
返回一個Message對象
樣本:set msg = Messages.Item(0)
Recipients() : Pointer
返回收件者集合。
樣本:Set Recipients = msg.Recipients
Attachments() : Pointer
返回郵件的附件集合。
樣本:Set Attachments = msg.Attachments
3、JMail.Recipients
Count() : Integer
返回集合中收件者的總數。
樣本:i = Recipients.Count
Item(Index) : Pointer
返回集合中的一個指定的收件者。
樣本:set re = Recipients.Item(0)
4、JMail.Attachments
Count():Integer
返回集合中附件的總數。
樣本:i = Attachments.Count
三、郵件系統介紹
本郵件系統共包括登陸郵件、發送郵件、內送郵件、刪除郵件、回複郵件五個功能,以下我們就對每個功能進行單獨介紹,並附出源碼,本教程所有圖片為M3gate測試中的截圖。
1) 登陸郵件
圖二
從圖二中我們可以看出,登陸頁麵包括一個表單,表單中含有兩個文字框與一個發送按鈕,那麼在WML語言中是如何提交表單的呢?首先我們先看看wml語言中一些表單元素:1、input元素
〈input name="user" title="label" type="type" value="value" default="default" format="specifier" emptyok="false|true" size="n" maxlength="n" tabindex="n"/〉,用來輸入文本,除了name屬性是必要的,其他可選。
*name屬性:指定了用來儲存該輸入文本的變數名字。
*title屬性:該輸入框的名字,同樣可被用來作為概要CARD頁中的選項名。
*type屬性:預設值為text,如選擇password,則輸入的資料顯示為*。
*value屬性:在文法和行為上等同於下面的default屬性,
*default屬性:指定輸入框的預設值,即name屬性指定變數的預設值,當使用者輸入新值時,該值無效,如果該值不符合以下format屬性的規定,則手機也忽略該預設值。
*format 屬性:用來格式化輸入的資料,可用的標記如下,使用時可用“一位元字標記”和“*標記”的形式,前者代表N個標記型字元,如3X, 後者代表任意個(小於maxlength屬性的值)標記型字元。
標記 描述
A 任何符號或者大寫字母(不包括數字)
a 任何符號或者小寫字母(不包括數字)
N 任何數字(不包括符號或者字母)
X 任何符號、數字或者大寫字母(不可改變為小寫字母)
x 任何符號、數字或者小寫字母(不可改變為大寫字母)
M 任何符號、數字或者大寫字母(可改變為小寫字母)或者多個字元,預設為首字大寫
m 任何符號、數字或者小寫字母(可改變為大寫字母)或者多個字元,預設為首字小寫
*maxlength屬性:指定了使用者可輸入的最大字元長度,最大限制為256個字元。
*emptyok屬性:表示使用者可否不填輸入框,預設為false,即要填。
*size屬性:輸入框顯示長度,目前未被支援。
*tabindex屬性:類似於在HTML表單中按TAB鍵後,焦點落在哪個選項上,該值決定了這個選擇順序,數字大的排在後面。目前未被支援。
樣本:
〈input type="text" title="使用者名稱" name="user" maxlength="50"/〉
2、do元素
Do是WML語言中最有有價值的元素之一,它給使用者提供一種在當前Card上進行"動作"的通用方法。
屬性列表:
*type屬性:告訴瀏覽器動作的意圖。
WML總共聲明了9個類型的動作,最常用的動作類型是"accept"和"option"。
1、accept,接受、確認
2、prev,返回上一個曆史堆棧中的URL
3、help,請求協助
4、reset,清除或者重設狀態
5、options,根據當前頁面的功能設定選項。
6、delete,刪除選擇條目
7、unknow,相當於空白字串
8、vnd.*。vnd.*及其它不同大小寫組合[Vv][Nn][Dd].*。這種類型定義的都是vnd.cotype,用於啟用供應商或使用者瀏覽器自訂的某個特定功能,其中co為公司(company)名的縮寫。
9、X-*與X-*。擴充類型,目前WML中還沒有使用。
*label屬性:設定按鈕標題,顯示在瀏覽器定義好的螢幕位置,不同瀏覽器地顯示位置不同。如果不設定標題,按鈕會按照瀏覽器的預設格式顯示,不同瀏覽器的預設格式不同。
* name屬性:按鈕名稱,可以用Card級的動作覆蓋template上的同名動作,重新賦予那些動作新的任務。
*optional屬性:來定義一個按鈕是否顯示,設定為True時會被瀏覽器忽略
樣本:
〈do type="accept" label="發送" optional="false"〉
{Content}
〈/do〉
3、go元素
用來指示瀏覽器顯示指定的URL,包括DECK的第一個CARD或者指定的CARD。文法如下:
〈go href="url" sendreferer="false|true" method="get|post" accept-charset="charset"〉
〈postfield name="name" value="value"/〉
〈setvar name="name" value="value"/〉
〈/go〉
其中href屬性為必選,其他為可選。
*sendreferer屬性:是否傳遞當前頁的URL,預設值為false。
*method屬性:和HTML中的表單FORM的method屬性一樣,指定表單是以get的方式還是post的方式遞交,預設的值為get,但如果未指定method但〈go〉〈/go〉間存在〈postfield〉,手機自動以post方式傳遞。
*accept-charset 屬性:可覆蓋在HTTP頭裡指定的字元集,可以寫多個字元集,如accept-charset="UTF-8,US-ASCII, ISO-8859-1"。
〈postfield name="name" value="value"/〉可以看作是HTML表單FORM中的〈INPUT TYPE="HIDDEN" NAME="變數名" VALUE="值"〉,通過它可以向指定的URL傳遞以“變數名/值”形式的資料。name和value屬性都是必選的。注意只有這裡的變數是用來遞交給CGI程式的。
除了〈postfield〉,還可以在〈go〉和〈/go〉間加入一句或者多句〈setvar name="name" value="value"/〉,該語句的意思是,當觸發某一事件時,給變數賦值。
樣本:
〈go href="main.asp" method="post" accept-charset="utf-8"〉
〈postfield name="user" value="$(user)"/〉
〈postfield name="pwd" value="$(pwd)"/〉〈/go〉
〈/do〉
郵件登陸介面源碼: Index.asp
〈% @LANGUAGE="VBSCRIPT" CODEPAGE="65001" %〉
〈%Response.ContentType = "text/vnd.wap.wml; charset=UTF-8"%〉
〈?xml version="1.0" encoding="utf-8"?〉
〈!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"〉
〈wml〉
〈card title="郵箱登陸"〉
〈p align="center"〉
Welcome To Sohu-WAP-Mail〈/p〉
〈p〉
使用者名稱:
〈input type="text" title="使用者名稱" name="user" maxlength="30"/〉
〈br/〉密 碼:
〈input type="password" title="密碼" name="pwd" maxlength="30"/〉〈br/〉
〈do type="accept" label="發送" optional="false"〉
〈go href="main.asp" method="post" accept-charset="utf-8"〉
〈postfield name="user" value="$(user)"/〉
〈postfield name="pwd" value="$(pwd)"/〉〈/go〉
〈/do〉
〈/p〉
〈/card〉
〈/wml〉
2) 郵件首頁面
郵件首頁面主要功能為驗證登陸頁面傳過來的使用者名稱與密碼是否正確,如果正確則顯示相關的郵件操作鏈結接(如圖四),反之則提示密碼錯誤要求重新輸入(如圖三)。由於某些行動裝置不支援跳轉,程式盡量避免使用跳躍陳述式。
圖三 (登陸失敗) 圖四(登陸成功)
郵件首頁面原始碼: main.asp
〈% @LANGUAGE="VBSCRIPT" CODEPAGE="65001" %〉
〈%Response.ContentType = "text/vnd.wap.wml; charset=UTF-8"%〉
〈?xml version="1.0" encoding="utf-8"?〉
〈!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"〉
〈wml〉
〈card id="main" title="Sohu-PALM-MAIL平台"〉
〈p〉
〈%
on error resume next
user=request("user")
pwd=request("pwd")
Set pop3 = Server.CreateObject( "JMail.POP3" )
pop3.connect user,pwd,"http://pop3.sohu.com"
pop3.Disconnect
if err.number〈〉0 then
response.write("登陸錯誤,請檢查使用者名稱密碼是否正確!〈br/〉")
response.write("〈a href='index.asp'〉重新登陸〈/a〉〈/p〉〈/card〉〈/wml〉")
response.End()
end if
response.write("歡迎你"&user&"@sohu.com〈br/〉")
%〉
〈a href="email_title.asp?user=〈%=user%〉&pwd=〈%=pwd%〉"〉收件匣〈/a〉〈br/〉
〈a href="send.asp?user=〈%=user%〉&pwd=〈%=pwd%〉"〉寄件匣〈/a〉〈br/〉
〈a href="index.asp"〉重新登陸〈/a〉〈br/〉
〈/p〉
〈/card〉
〈/wml〉
註:
〈a href="email_title.asp?user=〈%=user%〉&pwd=〈%=pwd%〉"〉收件匣〈/a〉
由於某些行動裝置並不支援session,為了更好的應用,故採用url參數傳遞,遺憾的是這樣做安全性不高,為了提高安全性,建議對參數進行明文加密後再進行傳遞,在接收頁面在做相對應的解密處理,當然如果你有什麼更好的辦法,還請發郵件指出,謝謝。