昨天的製作sending auto email 時出現問題,最終以 outlook application 解決了。
具體所遇問題如下:
1.一開始時運用CDO對象進行發送郵件,代碼如下:
Dim objmail As New CDO.Message Set objmail = CreateObject("CDO.Message")
objmail.From =Fromuser objmail.To = Touser objmail.Cc = Ccuser objmail.subject = subject If sub_chk = "" Then objmail.HTMLBody = mailbody End if
objmail.AddAttachment (sFilename) objmail.Send Set objmail = Nothing |
結果運行之,出現只能發送至網域內郵件,而網域外郵件未能發送成功之情況。
2.改用遠程服務器發送,代碼如下:
Dim objmail As New CDO.Message Set objmail = CreateObject("CDO.Message")
objmail.From = fromuser objmail.To = Touser objmail.Cc = Ccuser objmail.subject = subject If sub_chk = "" Then objmail.HTMLBody = mailbody
objmail.AddAttachment (sFilename)
End If '使用外部郵件服務器發送郵件 objmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 objmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "10.7.4.3" objmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 objmail.Configuration.Fields.Update objmail.Send Set objmail = Nothing |
出現遠程服務器未能relay之問題。
3.最後改用outlook.application 發送郵件,測試OK,代碼如下:
Dim oOutlook As New Outlook.Application Dim oMsg As Outlook.MailItem
mailbody = "Dear all," & vbCrLf mailbody = mailbody & " the attachment is the non-reply PO list on " & Format(Now, "mm/dd/yyyy") & ",please check!thank you!" & vbCrLf & vbCrLf mailbody = mailbody & "Best Regards," & vbCrLf mailbody = mailbody & "MIS"
Set oMsg = oOutlook.CreateItem(olMailItem) With oMsg .To = Touser .Cc = Ccuser .BCC = outBCC .subject = subject .Body = mailbody .Attachments.Add sFilename .Send End With Set oOutlook = Nothing Set oMsg = Nothing |
有關用OLE自動化Outlook,資料如下:
ole automation能夠讓你輕鬆的在你的應用程序中引入像word,excel等大型應用軟件的功能。通過這些程序暴露在外部的編程接口(包括函數和方法等),你可以很容易的得到那些大型軟件的強的功能,大大的擴展你的程序的實用性。
當然,我不會在這兒教你如何去編寫一個病毒程序,但是我會告訴你,如何利用ole的強大功能來實現對outlook的自動化操作,比如自動的發郵件,讀取新聞組等等。如果你確實對病毒更感興趣,寫好了也不要把它發佈出來,否則對大家都沒有什麼好處。
什麼是ole automation?
這兒可以給出一個ole automation的一個很簡單的例子:可以操作支持ole特性的應用程序暴露在外部的可編程對象的能力。大部分的這些可編程對象都被內嵌在某種宏語言 中,比如vba,它就是一種使用在microsoft office應用程序中的宏語言。
vba(visual basic for application)是vb的一個子集,所有的office的最近的幾個版本都使用了ole automation,所以你可以用vba來操作幾乎每個office應用程序的每個部分。
下面的這個visual basic 函數可以用來在outlook中新建一封郵件,要想使這個例子能夠正常的工作,你的電腦上必須安裝有outlook 97或更高版的outlook。
public function createmessage()
註釋:建立對outlook中對象的引用
dim objoutlook as new outlook.application
dim objoutlookmsg as outlook.mailitem
註釋:建立新郵件
set objoutlookmsg = objoutlook.createitem(olmailitem)
objoutlookmsg.display
set objoutlook = nothing
end function
首先,你必須告訴visual basic什麼是“outlook.application”對象。所以你必須爲你的應用程序建立一個對outlook對象庫的引用。你可以通過點擊 visual basic的“工程”菜單中的“引用”菜單項,然後選者microsoft outlook對象庫來實現這一點。這樣就告訴了visual basic在哪兒能夠找到ole服務器。在這個例子中,ole服務器就是outlook,而客戶端就是你的vb應用程序。
上面的例子用到了一個稱爲早期綁定(early-binding)的技巧來設置對對象的引用。與之相對的還有晚期綁定(late-binding),它設置對象引用的代碼如下所敘:
public function createmessage()
dim objoutlook as object
dim objoutlookmsg as object
set objoutlook = createobject("outlook.application")
基於以下的幾個原因,早期綁定在一般來說要筆晚期綁定要好一些:
* 早期綁定能夠讓你是用到vb的intellisense特性,它可以自動的爲你做對象的一般拼寫檢查,自動列出相關對象的屬性和方法,以及諸方法的參數。這爲你的編碼過程提供了很大的方便。
* 早期綁定運行的速度要必晚期綁定快一些,因爲,具體的內存非配動作是要到運行時才動態的分配。而且,當把對象申明爲一個object的類型時,vb並不能夠確定具體的對象類型,這樣,如果在其中引用了非法的屬性和方法,vb也不能夠報錯,造成運行時錯誤。
雖然晚期綁定比早期綁定要慢而且不是很安全,但有時它又是必須的。在某些情況下,非要等到運行時才能夠確定對象的類型,這兒後就非得使用晚期綁定不可了。但總的來說,能夠使用早期綁定的話就應該儘量的使用。
郵件列表
在vb中有專門爲郵件處理而編寫的控件,但我們在這兒要拋棄他們。我們談論的是ole。有了上面的那個例子作爲引導,用vb和outlook來編制郵件列表的程序應該是很簡單的了。
通過一個數據庫的協助,你可以很容易利用ole實現一個郵件列表。vb支持大部分主流的數據庫格式,這兒你不妨就用access吧,在vb中可以用dao 來對數據庫進行操作。dao爲你提供了一個比較友好的數據庫編程對象模型,可以用較少的代碼實現你想要的大部分功能。雖然它有一些侷限性,但對於這樣的小 應用已是綽綽有餘的了。因爲它也是以對象庫的形式被vb所引用的,所以在使用它之前也必須在工程加上對其的引用。 在開始之前,我們需要一個access數據庫,其中包含了郵件列表的客戶信息。數據庫的文件名爲contacts.mdb,內有一個contacts表。 包含了關於客戶的姓名,電子郵件地址,城市等等信息,由於結構比較簡單,這兒就不列出了。
新建一個visual basic標準exe工程,然後爲工程添加microsoft outlook和microsoft dao這兩個對象庫的引用,dao對象庫能夠讓你操作microsoft的jet數據庫引擎。
打開工程菜單,點擊on the project menu, click on components and select the windows common controls 1 library.
添加一個命令按鈕和一個進度條道窗體上。
在command1的click事件處理部分,輸入下面的代碼:
private sub command1_click()
dim dbs as database
dim rst as recordset
dim objoutlook as new outlook.application
dim objoutlookmsg as outlook.mailitem
註釋:打開數據庫
set dbs = opendatabase(app.path & "contacts.mdb")
set rst = dbs.openrecordset("contacts")
rst.movefirst
progressbar1.visible = true
註釋:對數據表中的每個數據進行操作
do until rst.eof
progressbar1.value = rst.percentposition
註釋:建立新的郵件
set objoutlookmsg = objoutlook.createitem(olmailitem)
with objoutlookmsg
.to = rst!email 註釋:給出收信人的郵件地址
.subject = "address check" 註釋:給出郵件的主題
註釋:下面是郵件的正文部分
.body = "dear " & rst!title & " " & rst!lastname & vbnewline & vbnewline
.body = .body & "this is an email to confirm your address. "
.body = .body & "please check the address below to make sure "
.body = .body & "that it is correct" & vbnewline & vbnewline
.body = .body & rst!address & vbnewline & rst!city & vbnewline
.body = .body & rst!stateorprovince & vbnewline & rst!postalcode
.body = .body & vbnewline & rst!country & vbnewline & vbnewline
.body = .body & "tel: " & rst!phonenumber
.importance = olimportancehigh
.send
end with
註釋:取消對對象的引用
set objoutlookmsg = nothing
rst.movenext
loop
progressbar1.visible = false
註釋:取消對對象的引用,這一步很重要。
set objoutlook = nothing
註釋:關閉數據庫dbs.close
msgbox "auto email complete", vbinformation
set dbs = nothing
set rst = nothing
end sub
在你按下開始鍵之後,所有再數據庫中的客戶都被髮送了一封確認信,你可以通過檢查發件箱來發現這一點。
最後,關於應用程序的發佈要做一點說明。如果你決定在你的應用程序中使用諸如outlook這樣的ole服務器,你就必須考慮到,應用程序的最終使用者可 能並沒有在電腦中安裝outlook,或者安裝的版本不符,這樣的話程序式不能夠運行的。但是,你還是可以在你自己的電腦上開發一些automation 的程序,有時這會爲你節約大量的時間和精力。