博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)C#与Outlook交互收发邮件
阅读量:7062 次
发布时间:2019-06-28

本文共 3164 字,大约阅读时间需要 10 分钟。

本文转载自:http://www.cnblogs.com/Moosdau/archive/2012/03/11/2390729.html

.Net对POP3邮件系统已经集成了相应的功能,但是如果是基于Exchange server的邮件系统,相对就比较复杂。如果仅仅是发送,可以简单地调用CDO来实现(参见我以前的一篇文章),但是如果要接收或进行其它一些更复杂一些操作,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-->邮件,如下图:

 

点击“显示配置文件”:

 

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

 

用循环枚举收件箱的项目时,需要注意从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地址( 格式的邮件地址):

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

 

如果要回复一封已有邮件:

var mail = item.Reply();                        mail.To = item.SenderEmailAddress;                        mail.Subject = "Hello";                        mail.HTMLBody = "F.Y.I.
" + 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("xx@xxx.com");            oRecip.Resolve();            // Send.            mail.Send();

---------------------------------------------

作者:夏狼哉

博客:http://www.cnblogs.com/Moosdau

如需引用,敬请保留作者信息,谢谢

 
你可能感兴趣的文章
一起谈.NET技术,Silverlight 游戏开发小技巧:升级和传送点特效1
查看>>
一起谈.NET技术,SharePoint 2010中的单点登录
查看>>
vue2的keep-alive的总结
查看>>
在部署asp.net时,会出现的两种情况,记下来,以方便以后解决问题。
查看>>
(转)http协议
查看>>
C#枚举-避免不合理赋值
查看>>
Setting up Unicorn with Nginx
查看>>
PHP——内测:联系人管理
查看>>
How can I create an executable JAR with dependencies using Maven?
查看>>
delphi提示错误行号之Assert(断言)
查看>>
springmvc 导出excel
查看>>
[Cocoa]iOS 开发者账户,联机调试,发布应用事宜
查看>>
mac os下通过命令行的方式编译c++代码并在xcode里引用
查看>>
[更新]缓存管理的帮助类(MemoryCache版,需要.net 4以上)
查看>>
Rafy 领域实体框架演示(2) - 新功能展示
查看>>
自行控制loadrunner的socket协议性能测试 (转)
查看>>
【ASP】简单Url编码和Url解码实例
查看>>
整理OpenResty+Mysql+Tomcat+JFinal+Cannal+HUI
查看>>
android搜索框列表布局,流程及主要步骤思维导图
查看>>
一场惊天跨国跨时区作弊案,除了需要爆表智商,还需要啥?
查看>>