程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#與Outlook交互收發郵件

C#與Outlook交互收發郵件

編輯:C#入門知識

.Net對POP3郵件系統已經集成了相應的功能,但是如果是基於Exchange server的郵件系統,相對就比較復雜。如果僅僅是發送,可以簡單地調用CDO來實現(參見我以前的一篇文章http://www.BkJia.com/kf/201203/122705.html ),但是如果要接收或進行其它一些更復雜一些操作,CDO就無法實現。

 

事實上,Exchange Server 2003根本不支持與.Net直接交互,據說Exchange Server 2007開放了一組Web Service接口,如果使用了Exchange Server 2007,則可以直接通過Web Service接口直接與Exchange server交互,不過我們公司目前還是使用exchange server 2003,所以也沒有測試這組接口要如何使用。

 

對使用exchange server 2003的環境來說,代價最低的應該說就是調用outlook的功能了,以下列舉與outlook交互的一些常用操作。

 

首先,在項目中添加對outlook組件的引用(Project—>Add Reference—>切換到COM標簽頁—>選擇Microsoft Outlook 14.0 Object Library),這裡outlook的具體版本號取決於本地安裝的outlook版本,我安裝的是outlook 2010, 所以顯示的版本號是14.0,這個關系不大,各個版本之間的代碼似乎是完全相同的。

 

以下代碼列舉收件箱中的未讀郵件:

            var app = new Microsoft.Office.Interop.Outlook.Application();
            var ns = app.GetNamespace("MAPI");
            ns.Logon("Outlook", Type.Missing, false, false);

            var inbox = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
            for (int i = 1; i <= inbox.Items.Count; i++)
            {
                if (inbox.Items[i].UnRead)
                {
                    txtMailList.Text += inbox.Items[i].Subject + System.Environment.NewLine;
                }
            }
            ns.Logoff();
            Marshal.ReleaseComObject(inbox);
            Marshal.ReleaseComObject(ns);
            Marshal.ReleaseComObject(app);
            inbox = null;
            ns = null;
            app = null;
 

上述代碼第三行中出現的“Outlook”字樣,這是Outlook自動創建的默認profile名稱,如果曾經修改過這個profile,或者本地包含多個profile,或者不確定profile名稱,請點擊控制面板-->User Accounts-->郵件,如下圖:

  image


 

點擊“顯示配置文件”:

  image


 

即可看到配置文件的名稱。

 

用循環枚舉收件箱的項目時,需要注意從1開始編號。

如果要讀取本地數據文件中的郵件:

var localFolder = ns.Stores["Local"].GetRootFolder().Folders["Archieve"];
如果要刪除文件中的郵件,注意每刪除一封索引號都會重新編號,所以不能遞增循環, 而必須從大到小遞減循環。

如果需要調用exchange server解析別名的功能:

                string alias = "Marvin Yan";
                var recipient = app.Session.CreateRecipient(alias);
                if (!recipient.Resolve())
                {
                      //alias can't be recoganized.
                }

根據recipient獲取smtp地址(username@server 格式的郵件地址):

string mailAddr = recipient.AddressEntry.GetExchangeUser().PrimarySmtpAddress;
 

如果要回復一封已有郵件:

                        var mail = item.Reply();
                        mail.To = item.SenderEmailAddress;
                        mail.Subject = "Hello";
                        mail.HTMLBody = "F.Y.I.<br />" + mail.HTMLBody;
                        mail.Send();

創建一封新的郵件並發送的代碼如下:

            var mail = app.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
            mail.HTMLBody = "Hello!";
            //Add an attachment.
            String attachName = "hello";
            int attachPos = (int)mail.Body.Length + 1;
            int attachType = (int)Microsoft.Office.Interop.Outlook.OlAttachmentType.olByValue;
            //now attached the file
            mail.Attachments.Add(@"C:\\hello.txt", attachType, attachPos, attachName);
            //Subject line
            mail.Subject = "test";
            // Add a recipient.
            var oRecip = mail.Recipients.Add("[email protected]");
            oRecip.Resolve();
            // Send.
            mail.Send();

 作者:夏狼哉
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved