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

.Net对POP3邮件系统已经集成了相应的功能,但是如果是基于Exchange server的邮件系统,相对就比较复杂。如果仅仅是发送,可以简单地调用CDO来实现(参见我以前的一篇文章http://www.cnblogs.com/Moosdau/archive/2007/09/28/908834.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-->邮件,如下图:

点击“显示配置文件”:

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

用循环枚举收件箱的项目时,需要注意从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("xx@xxx.com");
oRecip.Resolve();
// Send.
mail.Send();

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

作者:夏狼哉
博客:http://www.cnblogs.com/Moosdau

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

 

(转)C#与Outlook交互收发邮件的更多相关文章

  1. Outlook Express 收发邮件出现&quot;0x800CCC0F&quot;错误代码解决方法

    非常多网友在使用Outlook Express收发邮件的过程中,有时能够发送邮件,但出现不能接收信件的问题.每次在收邮件都会在某个地方停止不动,然后报超时,出现错误代码0x800CCC19或0x800 ...

  2. 如何使用Outlook 客户端配置其他邮箱客户端收发邮件

    本文介绍Outlook2016客户端配置QQ邮箱收发邮件 1.打开Outlook客户端,文件->信息->-添加账户 2.输入需要添加的邮箱账户,点击连接 3.输入密码并连接 4.打开QQ邮 ...

  3. Python收发邮件

    发送邮件使用SMTP协议,接受POP3或IMAP: 创建邮件内容email模块,发送邮件smtplib模块.发送邮件比较简单,只需先创建SMTP对象,登录服务器后根据发收邮箱地址发送即可: POP3接 ...

  4. mailkit库收发邮件

    mailkit库用于收发邮件.这个库可以替代C#自带的发邮件库 环境  W10 / VS2017CMMT / MailKit version="2.0.3" "net46 ...

  5. 在命令行上 使用 mutt, fetchmail, maildrop, msmtp 收发邮件

    基于shell 现在已经有了 Mail.app, Thunderbird, Outlook 这些图形化工具能很方便的处理邮件,为啥还需要 mutt 这种命令行文本方式的邮件工具呢?mutt 的一个优势 ...

  6. 使用python的email、smtplib、poplib模块收发邮件

    使用python的email.smtplib.poplib模块收发邮件 一封电子邮件的旅程是: MUA:Mail User Agent——邮件用户代理.(即类似Outlook的电子邮件软件) MTA: ...

  7. DouNet学习_收发邮件

    一.收发邮件 --->第一步:发邮件首先要有发送者的邮箱地址和登录的密码才能发送 这些都写在APP里  不要写死 --->第二步:发邮件就要有网络,要添加net.Mail命名空间 要发送的 ...

  8. 用 Apache James 搭建邮件服务器来收发邮件实践(一)(转)

    Apache James 简称 James, 是 Java Apache Mail Enterprise Server的缩写.James 是100%基于Java的电子邮件服务器.它是一种独立的邮件服务 ...

  9. 用Emacs收发邮件

    使用Emacs,将尽可能多的工作放到Emacs中来完成,这样可以提高工作效率. 1.安装必要的LISP插件和程序 $sudo apt-get install stunnel4 $sudo apt-ge ...

随机推荐

  1. git中Untracked files如何清除

    $ git status # On branch test # Untracked files: # (use "git add <file>..." to inclu ...

  2. codeforces 356 div2 C.Bear and Prime 100 数学

    C. Bear and Prime 100 time limit per test 1 second memory limit per test 256 megabytes input standar ...

  3. python 读取位于包中的数据文件

    假设你的包中的文件组织成如下: mypackage/ __init__.py somedata.dat spam.py 现在假设spam.py文件需要读取somedata.dat文件中的内容.你可以用 ...

  4. 使用属性动画 — Property Animation

    属性动画,就是通过控制对象中的属性值产生的动画.属性动画是目前最高级的2D动画系统. 在API Level 11中添加.Property Animation号称能控制一切对象的动画,包括可见的和不可见 ...

  5. Observer(观察者)

    意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 适用性: 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面.将这二者封装在独立 ...

  6. QWebEngineView_CssVariables

    1.测试代码,参考网址:http://blog.sina.com.cn/s/blog_1508519340102wgq0.html 2.测试下来,结果: 2.1.Qt5.6开始,没有 WebKit了. ...

  7. Java中的基本数据类型及其封装类

    Java中的数据类型有两种,基本数据类型和引用数据类型,引用数据类型的创建是 需要去new一个对象,该对象的内存分配在堆区,同时栈区会保存一个指向该对象的引用, 但是对于一些简单数据的创建,用new的 ...

  8. Hadoop异常

    org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://xxx:49000/user/had ...

  9. 个人知识管理系统Version1.0开发记录(08)

    切入点 前面,我们已经搭建好了web端的一种基本结构,需要进一步定位的主要问题有三点: 1.界面的选择和确定,用extjs做的初步样式,进一步改动为jqueryUI/html,再进一步改变为HTML5 ...

  10. HTML <select> 标签

    定义和用法 select 元素可创建单选或多选菜单. <select&> 元素中的 <option> 标签用于定义列表中的可用选项. HTML 4.01 与 HTML ...