读取邮件很简单,现在我以ADO访问WSS读取邮件为例给你说一下如何收邮件并读取附件:
首先引入(添加引用)ADO2.6或是2.7无所谓了>=2.5就可以。添加Microsoft CDO For Exchange 2000 Library;
然我读取邮件我采用ADO来完成;
using System.Reflection;
private object obj=Missing.Value;
private void ReadMail()
{
   ADODB.RecordsetClass aRS = new ADODB.RecordsetClass();
   ADODB.ConnectionClass aConn = new ADODB.ConnectionClass();
   string strurl =  @"file://./backofficestorage/"+GetDomainName+"/mbx/"+strchanged+"/收件箱/";
    //strurl里面的东西不用我解释了吧!变量GetDomainName和strchanged分别代表当前服务器域名(完整的域名)和收件人名称
    aConn .provider="exoledb.datasource";
    aConn .Open(strurl,String.Empty,String.Empty,0);
    //以上部分完成了打开某收件人邮箱的功能
    string strQ="";
    strQ = "select ";
    strQ = strQ + " \""urn:schemas:mailheader:thread-topic"\""; //标题  
    strQ = strQ + ", \""urn:schemas:httpmail:displayto"\""; //收件人姓名
    strQ = strQ + ", \""urn:schemas:httpmail:displaycc"\""; //抄送
    strQ = strQ + ", \""urn:schemas:httpmail:thread-topic"\"";
    strQ = strQ + ", \""urn:schemas:httpmail:priority"\"" ;//级别
    strQ = strQ + ", \""urn:schemas:httpmail:importance"\"" ; //级别
     strQ = strQ + ", \""urn:schemas:mailheader:message-id"\"";
    strQ = strQ + ", \""urn:schemas:httpmail:htmldescription"\"";//邮件的内容
    strQ = strQ + ", \""urn:schemas:httpmail:subject"\"";
    strQ = strQ + ", \""urn:schemas:httpmail:sendername"\"";
    strQ = strQ + ", \""urn:schemas:mailheader:received"\""; //收件日期
    strQ = strQ + ", \""DAV:contentclass"\"";  //项目资源的内容类别
    strQ = strQ + ", \""DAV:displayname"\"";  //项目资源在web存储系统中的名称
    strQ = strQ + ", \""DAV:id"\"";  //(相当于关系数据库中的主键)
    strQ = strQ + ", \""DAV:href"\""; //项目资源的完整url
    strQ = strQ + " from scope ('shallow traversal of " ;//'使用何种搜索方式
    strQ = strQ + "\"" strurl  + "\"') ";
    strQ = strQ + "where \""urn:schemas:mailheader:message-id"\"='"+itemtypes+"'and \""DAV:contentclass"\"<>'urn:content-classes:document'";
   //以上为查询邮件主要内容的SQL语句,不要用Select *,因为这样会很慢的!
   aRS.Open(strQ ,aConn,ADODB.CursorTypeEnum.adOpenForwardOnly,ADODB.LockTypeEnum.adLockReadOnly,0);
   while(!aRS.EOF)
   {
         Response.Write("邮件内容"+aRS.Fields("urn:schemas:httpmail:htmldescription").Value.ToString());
         string strmsgurl=strurl+aRS.Fields("DAV:displayname").Value.ToString();
         CDO.MessageClass cMsg=new CDO.MessageClass();
         cMsg.DataSource.Open(strmsgurl,o,ADODB.ConnectModeEnum.adModeRead,ADODB.RecordCreateOptionsEnum.adOpenIfExists,ADODB.RecordOpenOptionsEnum.adOpenSource,String.Empty,String.Empty); 
          if(cMsg.Attachments.Count>0)
{
    foreach(CDO.IBodyPart ibd1 in cMsg.Attachments)
    {
                 //通过ibd1你就可以得到附件的文件了,可以SaveToFile(XXX)也可以保 存为Stream,你可以看一下,保存为文件的时候由于你是通过WEB形式开发的,所以会保存到服务器端,保存以后怎么处理你可以自己考虑一下。具体收邮件和收附件就是这样的,调试过程中可能有些问题,你遇到以后再问。也可能一次通过:)
              }
}
        Rs.MoveNext
   }
}

解决方案 »

  1.   

    cMsg.DataSource.Open(strmsgurl,o,ADODB.ConnectModeEnum.adModeRead,ADODB.RecordCreateOptionsEnum.adOpenIfExists,ADODB.RecordOpenOptionsEnum.adOpenSource,String.Empty,String.Empty); 
    改一下o变为obj,忘了改了
      

  2.   

    strQ = strQ + "where \""urn:schemas:mailheader:message-id"\"='"+itemtypes+"'and \""DAV:contentclass"\"<>'urn:content-classes:document'";
    中的“itemtypes”这个从哪儿得到?请教!得出结果后即刻揭贴!
      

  3.   

    我把urn:schemas:mailheader:message-id的值直接复制进去,如下:
    strQ = strQ + "where \"urn:schemas:mailheader:message-id\"='" + "<[email protected]>" + "'and \"DAV:contentclass\"<>'urn:content-classes:document'";
    aRS.Open(strQ ,aConn,ADODB.CursorTypeEnum.adOpenForwardOnly,ADODB.LockTypeEnum.adLockReadOnly,0);
      

  4.   

    对了,忘了说了,在WHere条件中的urn:schemas:mailheader:message-id"\"='"+itemtypes+"'可以不要,那是因为我当初开发的时候自定义了几种消息形式,类型表示存在这个字段中,你可以不要的
    sql语句改成:
     string strQ="";
              strQ = "select ";
    strQ = strQ + " \"urn:schemas:mailheader:thread-topic\""; //标题  
    strQ = strQ + ", \"urn:schemas:httpmail:displayto\""; //收件人姓名
    strQ = strQ + ", \"urn:schemas:httpmail:displaycc\""; //抄送
    strQ = strQ + ", \"urn:schemas:httpmail:thread-topic\"";
    strQ = strQ + ", \"urn:schemas:httpmail:priority\"" ;//级别
    strQ = strQ + ", \"urn:schemas:httpmail:importance\"" ; //级别
    strQ = strQ + ", \"urn:schemas:mailheader:message-id\"";
    strQ = strQ + ", \"urn:schemas:httpmail:htmldescription\"";//邮件的内容
    strQ = strQ + ", \"urn:schemas:httpmail:subject\"";
    strQ = strQ + ", \"urn:schemas:httpmail:sendername\"";
    strQ = strQ + ", \"urn:schemas:mailheader:received\""; //收件日期
    strQ = strQ + ", \"DAV:contentclass\"";  //项目资源的内容类别
    strQ = strQ + ", \"DAV:displayname\"";  //项目资源在web存储系统中的名称
    strQ = strQ + ", \"DAV:id\"";  //(相当于关系数据库中的主键)
    strQ = strQ + ", \"DAV:href\""; //项目资源的完整url
    strQ = strQ + " from scope ('shallow traversal of " ;//'使用何种搜索方式
    strQ = strQ + "\""+ strurl  + "\"') ";
    strQ = strQ + "where  \"DAV:contentclass\"<>'urn:content-classes:document'";
      

  5.   

    行 56:  cMsg.DataSource.Open(strmsgurl,obj,ADODB.ConnectModeEnum.adModeRead,ADODB.RecordCreateOptionsEnum.adOpenIfExists,ADODB.RecordOpenOptionsEnum.adOpenSource,String.Empty,String.Empty);
    错误显示:不支持此接口 
    ???
    顺便请教一下,上面的SQL语句用哪个字段来区分每一封信呢??是不是还要在where中在加一个字段来区分?
    拜托了哈!!谢谢!!
      

  6.   

    strQ = strQ + ", \"DAV:id\"";  //(相当于关系数据库中的主键)
    这是数据记录在WSS(Web Storage System)中一个唯一的值.CDO.MessageClass cMsg=new CDO.MessageClass();
    改成:
    CDO.IMessage cMsg=new CDO.MessageClass();