设为首页 收藏本站
查看: 1570|回复: 0

[经验分享] C#与Outlook交互收发邮件

[复制链接]

尚未签到

发表于 2015-9-12 12:56:25 | 显示全部楼层 |阅读模式
  .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.UnRead)
{
txtMailList.Text += inbox.Items.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-->邮件,如下图:
DSC0000.png
  
  点击“显示配置文件”:
DSC0001.png
  
  即可看到配置文件的名称。
  
  用循环枚举收件箱的项目时,需要注意从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();

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-112673-1-1.html 上篇帖子: 收件箱修复工具 Scanpst.exe 修复 Outlook 收件箱 下篇帖子: Outlook 2010邮件管理OBA插件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表