用OLE自動化Outlook

昨天的製作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能夠讓你輕鬆的在你的應用程序中引入像wordexcel等大型應用軟件的功能。通過這些程序暴露在外部的編程接口(包括函數和方法等),你可以很容易的得到那些大型軟件的強的功能,大大的擴展你的程序的實用性。

當然,我不會在這兒教你如何去編寫一個病毒程序,但是我會告訴你,如何利用ole的強大功能來實現對outlook的自動化操作,比如自動的發郵件,讀取新聞組等等。如果你確實對病毒更感興趣,寫好了也不要把它發佈出來,否則對大家都沒有什麼好處。

  什麼是ole automation?
    這兒可以給出一個ole automation的一個很簡單的例子:可以操作支持ole特性的應用程序暴露在外部的可編程對象的能力。大部分的這些可編程對象都被內嵌在某種宏語言 中,比如vba,它就是一種使用在microsoft office應用程序中的宏語言。

  vbavisual 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")
   基於以下的幾個原因,早期綁定在一般來說要筆晚期綁定要好一些:
   * 早期綁定能夠讓你是用到vbintellisense特性,它可以自動的爲你做對象的一般拼寫檢查,自動列出相關對象的屬性和方法,以及諸方法的參數。這爲你的編碼過程提供了很大的方便。
   * 早期綁定運行的速度要必晚期綁定快一些,因爲,具體的內存非配動作是要到運行時才動態的分配。而且,當把對象申明爲一個object的類型時,vb並不能夠確定具體的對象類型,這樣,如果在其中引用了非法的屬性和方法,vb也不能夠報錯,造成運行時錯誤。
   雖然晚期綁定比早期綁定要慢而且不是很安全,但有時它又是必須的。在某些情況下,非要等到運行時才能夠確定對象的類型,這兒後就非得使用晚期綁定不可了。但總的來說,能夠使用早期綁定的話就應該儘量的使用。
   郵件列表
   vb中有專門爲郵件處理而編寫的控件,但我們在這兒要拋棄他們。我們談論的是ole。有了上面的那個例子作爲引導,用vboutlook來編制郵件列表的程序應該是很簡單的了。
    通過一個數據庫的協助,你可以很容易利用ole實現一個郵件列表。vb支持大部分主流的數據庫格式,這兒你不妨就用access吧,在vb中可以用dao 來對數據庫進行操作。dao爲你提供了一個比較友好的數據庫編程對象模型,可以用較少的代碼實現你想要的大部分功能。雖然它有一些侷限性,但對於這樣的小 應用已是綽綽有餘的了。因爲它也是以對象庫的形式被vb所引用的,所以在使用它之前也必須在工程加上對其的引用。 在開始之前,我們需要一個access數據庫,其中包含了郵件列表的客戶信息。數據庫的文件名爲contacts.mdb,內有一個contacts表。 包含了關於客戶的姓名,電子郵件地址,城市等等信息,由於結構比較簡單,這兒就不列出了。
   新建一個visual basic標準exe工程,然後爲工程添加microsoft outlookmicrosoft dao這兩個對象庫的引用,dao對象庫能夠讓你操作microsoftjet數據庫引擎。
   打開工程菜單,點擊on the project menu, click on components and select the windows common controls 1 library.

   添加一個命令按鈕和一個進度條道窗體上。

 command1click事件處理部分,輸入下面的代碼:
   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 的程序,有時這會爲你節約大量的時間和精力。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章