麻辣家族討論版版's Archiver

小誌 發表於 2010-5-24 16:30

(實戰專題) 網路問卷 E-mai l版

利用E-mail的方式傳送相關網頁資料的確是非常具有互動性,因為管理者或是問卷調查主持人收到相關的問卷資料後可以馬上的作出回應與反省改善,甚至可以立即以E-mail回信給填寫問卷者,讓問卷填寫者了解我們是非常真誠而認真的看待他們所提出的寶貴意見!!

[color=DarkOrange][size=5][b]E-mail物件[/b][/size][/color]
要在ASP程式中自動傳送E-Mail有許多方法,小誌在此介紹的為最常見的一種方式:[color=Blue]CODNTS.NewMail[/color],CDONTS.NewMail物件是IIS中所提供的一種信件傳送物件,PWS並沒有提供這項物件,但您不用擔心!網路伺服主機大多以NT為平台,因此都會具有此項郵件傳送物件。

[color=Green][b][size=4] 建立CDONTS.NewMail物件[/size][/b][/color]

 要有E-Mail傳送的功能,我們必須先建立E-Mail物件,建立方式如下圖所示:

[attach]877[/attach]

 我們寄送信件時需要填寫的項目有哪些?一般信件寄送有收件人、寄件人、信件主旨與信件內容等四項,這四項同時也是我們信件自動傳送物件的四個主要屬性:

[attach]878[/attach]

[color=Red]注意:[/color]
CDONTS.NewMail物件的收件人(To)、寄件人(From)、信件主旨(Subject)與信件內容(Body)等四項屬性,其屬性值都是字串型式,必須使用雙引號刮起來!


[color=Green][size=4][b]送出郵件[/b][/size][/color]
 當我們設定好CDONTS.NewMail物件的收件人(To)、寄件人(From)、信件主旨(Subject)與信件內容(Body)內容後,此時只是完成信件的撰寫,郵件還沒有被傳送出去,要『傳送』郵件必須呼叫Sent方法:

[attach]879[/attach]


[color=Red]提示[/color]
CDONTS.NewMail物件是我們在安裝IIS時有勾選SMTP Service項目時才會被安裝進系統中,如果你使用IIS但是安裝當時並未勾選SMTP Service項目,則現在你可以透過IIS的新增/移除功能來新增SMTP Service。

小誌 發表於 2010-5-24 16:33

[color=DarkOrange][size=5][b]範例程式流程[/b][/size][/color]
本範例程式的流程很簡單,共分為三個部分,in.asp(問卷填寫)、sentmsg.asp(傳送問卷結果)、qustion.mdb(問卷題目資料庫),如下圖所示:

[attach]880[/attach]

[list]
[*]in.asp程式網頁

 當連結進入in.asp程式網頁後,網頁中將會顯示問卷的題目與意見選擇或意見填寫的欄位,如下圖所示:

[attach]881[/attach]

 除了列出問卷的題目與意見選擇或意見填寫的欄位,我們還增加了一個家長姓名欄位(這樣你才知道這份問卷是誰填寫的),還有一個填寫E-mail的欄位(這就是CDONTS.NewMail物件的寄件人(From)屬性值),而所列出的問卷題目及意見選項則是讀取自question.mdb資料庫中的question資料表。

[*]sentmsg.asp程式
 在in.asp程式網頁中按下『送出問卷』按鈕後,表單中的資料就會送交sentmsg.asp程式處理,sentmsg.asp程式將會把問卷填寫結果與填寫者的資料,以E-Mail自動傳送的方式寄送至管理者或是問卷調查主持人的手中。
[/list]

小誌 發表於 2010-5-24 16:39

[color=DarkOrange][size=5][b]問卷程式網頁[/b][/size][/color]
首先在問卷程式網頁中設定一個家長姓名的單行文字欄位,及一個填寫E-mail的單行文字欄位;家長姓名的單行文字欄位Name屬性就設定為Name,而填寫E-mail的單行文字欄位Name屬性則設定為email,見下圖。

[attach]882[/attach]

在問卷程式網頁中最麻煩的部分就是如何把我們資料庫中的題目給讀取並顯示出來,因為在我們問卷表單的設計上為了配合題型的不同而分為單行文字方塊(Text)與單選按鈕(Radio),如果問卷題型為選擇題的話,我們必須列出備選的答案,而問卷題型若是問答題的話則必須有文字欄位供問卷填寫者填寫意見:

[attach]883[/attach]

 因此,我們必須先判斷我們問卷題目的題型,如果是選擇題的話,則三個答案選項的Name屬性都必須相同,而選項的屬性值(Value)則必須隨備選答案的不同而變更;若是問答題就比較好處理只要設定文字欄位的Name屬性就可以了。

在各個題目答案項目的命名,我們都採用『No』加上『rs("題號")』來命名,例如:問卷第一題,雖然有三個備選答案選項,但是它們的Name屬性都是『No1』:

[attach]884[/attach]

 而備選答案選項的值則依我們資料庫中『選項』欄位的的值而變動!!

[attach]885[/attach]

所以當程式網頁執行後,我們檢視網頁的原始碼將如下圖所示:

[attach]886[/attach]

[color=Green][size=4][b] 題型不同產生不同的答題方式[/b][/size][/color]
 在本範例中設定了兩種題型:選擇題與問答題,因此我們必須根據資料錄的題型欄位來決定我們問題的顯示方式:

[attach]887[/attach]
[list=1]
[*]使用While - Wend 迴圈敘述配合改變作用中資料錄位置的MoveNext方法,將所有的問卷題目自資料庫資料表中讀取出來。
[*]利用IF判斷敘述來辨別資料錄『題型』欄位中所設定的問卷題目型式。
[*]如果『題型』是選擇題,則利用For迴圈敘述列出各備選答案,請注意,本範例的備選答案只有三個,所以For迴圈的起始值為1,而終值為3。
[*]列出備選答案的選擇鈕屬性值敘述是rs("選項" & I),但是,在網頁中列印出選項說明文字的敘述則為Server.HTMLcoder("選項" & I)。
[*]如果『題型』是問答題則直接設定單行文字輸入方塊即可。
[/list]

[color=Red]提示[/color]
Server.HTMLEncoder為HTML編碼敘述,如果在資料欄位中含有Html標籤敘述,則這個標籤敘述將不會被瀏覽器解譯出來,而當成是一般的文字顯示出來,這只是一個預防措施。


in.asp[code]<%
'建立資料庫連結物件
        Set conobject = Server.CreateObject("ADODB.Connection")
        DBPath = Server.MapPath("question.mdb")
'連結資料庫       
        conobject.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ="&DBPath
'建立資料庫存取物件       
        Set RS=Server.CreateObject("ADODB.Recordset")
'打開資料表       
        RS.Open "Select * From question Order By 題號",conobject,1,3
%>

<HTML>
<H2 align="center"><font size="2">
<img border="0" src="asktitle.gif"></font></h2>
<FORM Action=sentmsg.asp Method=post>
<font size="2">
家長姓名<INPUT Type=Text Name=Name>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E-Mail<INPUT Type=Text Name=email>
</font>
<HR size="1" color="#0000FF">
<font size="2">
<%
While Not rs.EOF
%>
  <B><%=rs("題號")%>. <%=Server.HTMLEncode(rs("題目"))%></B><BR>  
<%  
   If rs("題型") = "選擇" Then  
    For I = 1 To 3
%>     
<INPUT Type=Radio Name=No<%=rs("題號")%>
Value=<%= rs("選項" & I) %>><%=Server.HTMLEncode(rs("選項" & I))%><BR>     
<%   
    Next   
    Else   
%>        
   <INPUT Type=Text Name=No<%=rs("題號")%>><BR>   
<%     
    End If   
  rs.MoveNext   
Wend   
%>   
<INPUT Type=Submit Value="送出問卷">   
</font>   
</FORM>   
</HTML>[/code]

小誌 發表於 2010-5-24 16:43

[color=DarkOrange][size=5][b] 自動送信程式[/b][/size][/color]
當問卷填寫者在in.asp程式網頁中按下『送出問卷』按鈕後,表單中的資料就會送交自動送信程式sentmsg.asp處理,sentmsg.asp程式將會把問卷填寫結果與填寫者的資料以E-Mail自動傳送的方式寄送至管理者或是問卷調查主持人的手中。

 在信件傳送之前,我們必須先設定CDONTS.NewMail物件的收件人(To)、寄件人(From)、信件主旨(Subject)與信件內容(Body)等四項屬性,信件主旨我們可以自行設定為固定文字,收件者則為管理者或是問卷調查主持人的E-Mail帳號(這也是固定的),信件傳送的寄件者與信件內容(問卷結果)則是隨著問卷填寫者所填寫的內容而變動。

[attach]888[/attach]

 請觀察上圖這段程式敘述,你可以清楚的看到我們From(寄件者郵件信箱)屬性值是設定為:問卷填寫者在in.asp程式網頁中Email欄位中所填寫的郵件信箱,這麼做最主要的目的是為了讓管理者或是問卷調查主持人能夠即時的以E-Mail方式回應問卷填寫者所提出的意見。

[color=Red]注意[/color]
本範例中From(寄件者郵件信箱)與To(收件者郵件信箱)屬性值設定是相同的,也就是自己寄信給自己,在實際應用時請自行更改To(收件者郵件信箱)屬性值設定。
在信件內容的部分,除了要有問卷填寫者所選擇的答案與意見外,本範例中還加上相對應的問卷題目本文,如果不加上原始題目的內容,我們怎能知道答案的意義?

[attach]889[/attach]
[list=1]
[*]使用While - Wend 迴圈敘述配合改變作用中資料錄位置的MoveNext方法,將所有的問卷題目自資料庫資料表中讀取出來。
[*]利用Request方法敘述取得來自問卷程式網頁中相對於題目的答案欄位屬性值(Value)。
[*]呼叫Sent方法將信件寄出。
[/list]

      [color=Red]注意[/color]
上圖程式碼中的vbCrLf為一換行符號,其作用就是將我們的信件內容分段顯示!若未加上此換行符號,則我們的信件內容將會全部串接成一個段落。

sentmsg.asp[code]<%
'建立資料庫連結物件
        Set conobject = Server.CreateObject("ADODB.Connection")
        DBPath = Server.MapPath("question.mdb")
'連結資料庫       
        conobject.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ="&DBPath
'建立資料庫存取物件       
        Set RS=Server.CreateObject("ADODB.Recordset")
'打開資料表       
        RS.Open "Select * From question Order By 題號",conobject,1,3
       
  '建立郵件寄送物件       
set mail=server.createobject("CDONTS.NewMail")
        '以問卷程式網頁中所填寫的E-mail為寄件者
    mail.From= Request("email")
    '收件者為管理員或問卷調查主持人的E-Mail
    mail.To= Request("email")
    '信件主題,通常為問卷的主題
    mail.subject="家長問卷調查"
    '信件內容
    body = "家長" & Request("name") & "問卷意見:" & vbCrLf
'列出問卷題目及問卷填寫者的答案
    While Not rs.EOF
     ans= Request("No" & rs("題號"))
     
     body = body & rs("題目") & vbCrLf
     body = body & ans & vbCrLf
     rs.MoveNext
     Wend
    mail.body = body

    ' 寄出信件
    mail.send
%>  [/code]

小誌 發表於 2010-5-24 16:47

[color=DarkOrange][size=5][b]資料庫結構與程式利用[/b][/size][/color]
本範例中的資料庫檔案question.mdb中只有一個資料表question,用來存放我們的問卷題目及被選答案(題型為選擇題才用的到),其欄位結構如下圖:

[attach]891[/attach]

[color=Green][size=4][b] 程式使用說明[/b][/size][/color]
[list=1]
[*]本範例程式可使用之問卷題目類型只有選擇題與問答題兩種,利用時請直接於資料庫『題型』欄位中指定即可。

[attach]892[/attach]

[*]問卷題目可無限增加,若你要增加問卷的題目,直接於資料庫資料表中新增資料即可。
[*]選項欄位也就是選擇題的備選答案,預設為三個被選項目,若欲增減項目請記得同時更改問卷程式網頁in.asp與自動送信程式sentmsg.asp中For迴圈敘述的終止值。
[*]請務必更改自動送信程式sentmsg.asp中CDONTS.NewMail物件的收件人(To)屬性值,將其屬性值修改為正確的收件者電子郵件帳號。
[/list]

[size=4][b][color=RoyalBlue](實戰專題) 網路問卷 E-mai l版完整範例壓縮檔:[/color][/b][/size][attach]890[/attach]

PD961A 發表於 2010-5-24 20:02

[i=s] 本帖最後由 PD961A 於 2010-5-24 20:18 編輯 [/i]

[quote]利用E-mail的方式傳送相關網頁資料的確是非常具有互動性,因為管理者或是問卷調查主持人收到相關的問卷資料 ...
[size=2][color=#999999]小誌 發表於 2010-5-24 16:30[/color] [url=http://forum.twbts.com/redirect.php?goto=findpost&pid=1203&ptid=391][img]http://forum.twbts.com/images/common/back.gif[/img][/url][/size][/quote]


小誌版主

您的提示
CONDTS.NewMail物件是我們在安裝IIS時有勾選SMTP Service項目時才會被安裝進系統中,
如果你使用IIS但是安裝當時並未勾選SMTP Service項目,
則現在你可以透過[color=darkorchid]IIS的新增/移除功能來新增SMTP Service[/color]。
以目前的XP系統(SP3)可以如此設定是沒有問題.
記得WIN2000系統沒有此項功能.

另外想請問您
一台mail server 已設定此功能,可再設定另一台 mail server 嗎?
(理論上cdonts應該是不能同時設相同的SMTP...)
謝謝您!!

小誌 發表於 2010-5-25 02:29

[b]回復 [url=http://forum.twbts.com/redirect.php?goto=findpost&pid=1210&ptid=391]6#[/url] [i]PD961A[/i] [/b]


1.win2000 pro(以上)就有smtp服務

2.[color=Magenta]一台mail server 已設定此功能,可再設定另一台 mail server 嗎?[/color]
理論我不瞭解,但在實務上我是做過兩台同網域的SERVER各自同時擁有SMTP且可正常發信
重點是當時實驗環境是兩台SERVER各有兩張網卡,一張對內區域IP(intranet),一張對外廣域IP(internet)
也就是說兩台對外發信時,使用的是兩組不同對外的IP

若只有一個對外IP時,怎辦? 那就一台設定SMTP並擁有對外IP<---這台寄信一定沒問題
那另一台怎辦? 用CDO.Message寄就好囉? 怎麼寄?

假定狀況
A機:兩張網卡一張對外,一張對內<--設有SMTP且使用CDONTS寄信
B機:只有一張網卡,並利用此卡與A機構成區網<--想利用A機的SMTP並使用CDO.Message寄信
換你發表一下囉 {:2_27:}
只要說明B機部份即可
題外話,以現在的中華電信來說,即使已有SMTP,但SERVER對外的IP必須為固定IP才能發信喔

PD961A 發表於 2010-5-25 21:12

[i=s] 本帖最後由 PD961A 於 2010-5-25 21:19 編輯 [/i]

[b]回復 [url=http://forum.twbts.com/redirect.php?goto=findpost&pid=1219&ptid=391]7#[/url] [i]小誌[/i] [/b]

回覆小誌版主:     
如何使用 CDO 物件來寄 E-Mail
網站PO文的VB套入CDO ( Collaboration Data Objects ) 物件 , 對應檔案 CDOSYS.dll , 可供E-Mail 寄送使用

    Dim objCDO As Object
    Dim strCfg As String
    Set objCDO = CreateObject("CDO.Message")
    strCfg = "http://schemas.microsoft.com/cdo/configuration/"
    With objCDO
       .Sender = "T1@OhMyGod.com"
        .From = "誰是寄件者@NoOneKnows.com"
        .To = "要寄給誰@whois.com.tw"
        .Fields("urn:schemas:mailheader:X-Priority") = 1 ' Priority = PriorityUrgent 高優先順序
        .Fields("urn:schemas:mailheader:return-receipt-to") = "誰是寄件者@NoOneKnows.com" ' 要求讀取回條
         ' .Fields("urn:schemas:httpmail:importance") = 2 ' Importance = High
       ' .Fields("urn:schemas:httpmail:priority") = 1 ' Priority = PriorityUrgent
        .Fields.Update ' 更新欄位
        .Subject = "沒有主旨(需放主題)"
        .TextBody = "TEXT" ' Text 文字格式信件內容
        ' 或 HTML 網頁格式信件內容
        .HTMLBody = "<HTML>" & _
                                "<BODY>" & _
                                "<table border=""1"" width=""100%"">" & _
                                "<tr><td>I</td><td>am</td><td>Hammer</td><td>!</td></tr>" & _
                                "<tr><td>Who</td><td>r</td><td>u</td><td>?</td></tr>" & _
                                "</table>" & _
                                "</BODY>" & _
                                "</HTML>"
                  

        .AddAttachment "C:\AttFile.zip" ' 附加檔案
            .CC = "Xman@yahoo.com.tw"   ' 副本
        .BCC = "SpiderMan@hotmail.com.tw" ' 密件副本
              .Configuration(strCfg & "sendusing") = 2 ' Sendusing = SendUsingPort
        .Configuration(strCfg & "smtpserver") = "msa.hinet.net" ' SMTP Server
       ' .Configuration(strCfg & "smtpserverport") = 25 ' SMTP Server Port ( 預設即為 25 )
        ' SMTP Server 如需登錄 , 則需設定 UserName / Password
        ' .Configuration(strCfg & "sendusername") = "UserName" ' Send User Name
        ' .Configuration(strCfg & "sendpassword") = "Password" ' Send Password
              .Configuration.Fields.Update ' 更新 (欄位) 組態
              ' .DSNOptions = 4 ' 回傳信件傳送狀態
       '  cdoDSNDefault = 0 , DSN commands are issued.
       '  cdoDSNDelay = 8 , Return a DSN if delivery is delayed.
       '  cdoDSNFailure = 2 , Return a DSN if delivery fails.
       '  cdoDSNNever = 1 , No DSNs are issued.
       '  cdoDSNSuccess = 4 , Return a DSN if delivery succeeds.
       '  cdoDSNSuccessFailOrDelay = 14 ,Return a DSN if delivery succeeds, fails, or is delayed.
        .Send ' 傳送
         End With
    Set objCDO = Nothing

但是如您所言以現在的中華電信來說,SERVER對外的IP都是以單一固定IP發信.
即使是2張網卡同IP位址亦無法同時對外發信因為必須使用兩組不同對外的IP

所以麻煩您解惑了...
感謝您!!

PS:不過它(MAILSEVER)可以寫專案的喔!
[attach]918[/attach]

小誌 發表於 2010-5-25 22:51

[quote]回復  小誌

但是如您所言以現在的中華電信來說,SERVER對外的IP都是以單一固定IP發信.
即使是2張網卡同IP位址亦無法同時對外發信因為必須使用兩組不同對外的IP
[img]http://forum.twbts.com/images/common/back.gif[/img][/quote]

答案你已經寫出來了阿[code] .Configuration(strCfg & "smtpserver") = "msa.hinet.net" ' SMTP Server[/code]B機使用CDO寄信時,將SMTP Server指定為A機就好了

[color=Red]請注意 [/color]如果外送訊息是從同一部機器送到 SMTP 伺服器,那麼只要採用「轉接」許可權的預設設定就可以了。不過,如果訊息是從另一部電腦傳送的話,您就得在許可權清單當中,加上那一部電腦的 IP 位址或網域名稱,才能執行「轉接」功能。


[color=RoyalBlue]關於SMTP與CDO請參考[/color]
[url]http://forum.twbts.com/viewthread.php?tid=402&extra=page%3D2[/url]

頁: [1]

麻辣家族討論版版為 麻辣學園 網站成員  由 昱得資訊工作室 © Since 1993 所提供