接受Exchange邮件+附件代码

        private List<emailMessage> GetEmailsFromExchangeServer(string server, string domain, string username, string password)
        {
            List<emailMessage> ReturnList = new List<emailMessage>();
            try
            {
                ExUser ExchangeUser = new ExUser(server, username, password, domain);
                ExInBox Inbox = new ExInBox(ExchangeUser);
                ExMailMessage[] message = Inbox.GetMessageListFromInbox();
                if (message.Length > 0)
                {
                    for (int i = 0; i < message.Length; i++)
                    {
                        emailMessage tmp = new emailMessage();
                        tmp.mailindex = i+1;
                        tmp.subject = message[i].Subject;
                        tmp.date = message[i].Date;
                        tmp.body = message[i].Body;
                        //tmp.attachments=message[0].Url
                        string from = message[i].From;
                        if(from.Contains("<"))
                            from = from.Substring(from.IndexOf('<') + 1, from.IndexOf('>') - 1 - from.IndexOf('<'));
                        tmp.from = from;
                        tmp.displayname = from;
                        string to = message[i].To;
                        if (to.Contains("<"))
                            to = to.Substring(to.IndexOf('<') + 1, to.IndexOf('>') - 1 - to.IndexOf('<'));
                        tmp.to = to;
                        tmp.displaytoname = to;
                        if (message[i].HasAttachment)
                        {
                            try
                            {
                                Attachment attach = GetAttachment(message[i], domain, username, password);
                                if (attach != null)
                                {
                                    tmp.attachmentByte = attach.attachmentByte;
                                    tmp.attachmentName = attach.attachmentName;
                                }
                            }
                            catch(Exception ex)
                            { }
                        }
                        ReturnList.Add(tmp);
                        Inbox.DeleteMessage(message[i].Url);
                    }
                }
            }
            catch(Exception e)
            {}
            return ReturnList;
        }

 

        private Attachment GetAttachment(ExMailMessage mailMessage, string domain, string username, string password)
        {
            // Variables.
            Attachment result = null;
            System.Net.HttpWebRequest Request;
            System.Net.WebResponse Response;
            System.Net.CredentialCache MyCredentialCache;
            System.IO.Stream ResponseStream = null;
            System.Xml.XmlDocument ResponseXmlDoc = null;
            System.Xml.XmlNode root = null;
            System.Xml.XmlNamespaceManager nsmgr = null;
            System.Xml.XmlNodeList PropstatNodes = null;
            System.Xml.XmlNodeList HrefNodes = null;
            System.Xml.XmlNode StatusNode = null;
            System.Xml.XmlNode PropNode = null;

            string[] _attachmentName = null;
            string[] _realAttachmentName = null;
            System.Xml.XmlNode NameNode = null;
            try
            {
                // Create a new CredentialCache object and fill it with the network
                // credentials required to access the server.
                MyCredentialCache = new System.Net.CredentialCache();
                MyCredentialCache.Add(new System.Uri(mailMessage.Url),
                    "NTLM",
                    new System.Net.NetworkCredential(username, password, domain)
                    );

                // Create the HttpWebRequest object.
                Request = (System.Net.HttpWebRequest)HttpWebRequest.Create(mailMessage.Url);

                // Add the network credentials to the request.
                Request.Credentials = MyCredentialCache;

                // Specify the method.
                Request.Method = "X-MS-ENUMATTS";

                // Send the X-MS-ENUMATTS method request and get the
                // response from the server.
                Response = (HttpWebResponse)Request.GetResponse();

                // Get the XML response stream.
                ResponseStream = Response.GetResponseStream();

                // Create the XmlDocument object from the XML response stream.
                ResponseXmlDoc = new System.Xml.XmlDocument();

                // Load the XML response stream.
                ResponseXmlDoc.Load(ResponseStream);

                // Get the root node.
                root = ResponseXmlDoc.DocumentElement;

                // Create a new XmlNamespaceManager.
                nsmgr = new System.Xml.XmlNamespaceManager(ResponseXmlDoc.NameTable);

                // Add the DAV: namespace, which is typically assigned the a: prefix
                // in the XML response body.  The namespaceses and their associated
                // prefixes are listed in the attributes of the DAV:multistatus node
                // of the XML response.
                nsmgr.AddNamespace("a", "DAV:");

                // Add the http://schemas.microsoft.com/mapi/proptag/ namespace, which
                // is typically assigned the d: prefix in the XML response body.
                nsmgr.AddNamespace("d", "http://schemas.microsoft.com/mapi/proptag/");
                nsmgr.AddNamespace("e", "urn:schemas:httpmail:");
                // Use an XPath query to build a list of the DAV:propstat XML nodes,
                // corresponding to the returned status and properties of
                // the file attachment(s).
                PropstatNodes = root.SelectNodes("//a:propstat", nsmgr);

                // Use an XPath query to build a list of the DAV:href nodes,
                // corresponding to the URIs of the attachement(s) on the message.
                // For each DAV:href node in the XML response, there is an
                // associated DAV:propstat node.
                HrefNodes = root.SelectNodes("//a:href", nsmgr);

                // Attachments found?
                if (HrefNodes.Count > 0)
                {
                    _attachmentName = new string[HrefNodes.Count];
                    _realAttachmentName = new string[HrefNodes.Count];
                    // Display the number of attachments on the message.
                    // Iterate through the attachment properties.
                    for (int i = 0; i < HrefNodes.Count; i++)
                    {
                        // Use an XPath query to get the DAV:status node from the DAV:propstat node.
                        StatusNode = PropstatNodes[i].SelectSingleNode("a:status", nsmgr);

                        // Check the status of the attachment properties.
                        if (StatusNode.InnerText != "HTTP/1.1 200 OK")
                        {
                            return null;
                        }
                        else
                        {
                            // Get the CdoPR_ATTACH_FILENAME_W MAPI property tag,
                            // corresponding to the attachment file name.  The
                            // http://schemas.microsoft.com/mapi/proptag/ namespace is typically
                            // assigned the d: prefix in the XML response body.
                            NameNode = PropstatNodes[i].SelectSingleNode("a:prop/d:x3704001f", nsmgr);
                            // Get the CdoPR_ATTACH_SIZE MAPI property tag,
                            // corresponding to the attachment file size.
                            PropNode = PropstatNodes[i].SelectSingleNode("a:prop/d:x0e200003", nsmgr);
                            string size;
                            if (Convert.ToInt32(PropNode.InnerText) > 1024 * 1224)
                            {
                                size = (Convert.ToInt32(PropNode.InnerText) / (1024 * 1024)).ToString() + "M";
                            }
                            else if (Convert.ToInt32(PropNode.InnerText) > 1024)
                            {
                                size = (Convert.ToInt32(PropNode.InnerText) / 1024).ToString() + "KB";
                            }
                            else
                            {
                                size = PropNode.InnerText + "B";
                            }
                            int index = HrefNodes[i].InnerText.LastIndexOf('/') + 1;
                            string attachmentName = HrefNodes[i].InnerText.Substring(index);
                            int mLastIndex = attachmentName.LastIndexOf('.');
                            string mMainName = attachmentName.Substring(0, mLastIndex);
                            //mMainName = Server.UrlDecode(mMainName);
                            int mExtLength = attachmentName.Length - mLastIndex;
                            string mExtName = attachmentName.Substring(mLastIndex, mExtLength);
                            string LAttachment= mailMessage.Url + "/" + mMainName +  mExtName ;
                            _attachmentName[i] = mailMessage.Url + "/" + mMainName + mExtName + "/C58EA28C-18C0-4a97-9AF2-036E93DDAFB3/" + mMainName + mExtName + "?attach=1";
                            _realAttachmentName[i] = PropstatNodes[i].SelectSingleNode("a:prop/e:attachmentfilename", nsmgr).InnerText;
                        }
                    }

                }

                // Clean up.
                ResponseStream.Close();
                Response.Close();
                result = this.GetAttachmentFile(mailMessage, domain, username, password, HrefNodes.Count, _attachmentName,_realAttachmentName);
            }
            catch (Exception ex)
            {
                // Catch any exceptions. Any error codes from the X-MS-ENUMATTS
                // method request on the server will be caught here, also.

            }
            return result;
        }

        private Attachment GetAttachmentFile(ExMailMessage mailMessage, string domain, string username, string password, int Count, string[] _attachmentName, string[] _realAttachmentName)
        {
            //_attachmentName[0] = "http://mail.blifax.com/Exchange/HongC/Inbox/blifax.com.EML/1_multipart_xF8FF_3_1.0.0.15.sql";
            Attachment attach = new Attachment();
            System.Net.HttpWebRequest Request;
            System.Net.WebResponse Response;
            System.Net.CredentialCache MyCredentialCache;
            Stream ResponseStream = null;
            try
            {
                for(int i=0;i<_attachmentName.Length;i++)
                {
                    // Create a new CredentialCache object and fill it with the network
                    // credentials required to access the server.
                    MyCredentialCache = new System.Net.CredentialCache();
                    MyCredentialCache.Add(new System.Uri(_attachmentName[i]),
                        "NTLM",
                        new System.Net.NetworkCredential(username, password, domain)
                        );

                    // Create the HttpWebRequest object.
                    Request = (System.Net.HttpWebRequest)HttpWebRequest.Create(_attachmentName[i]);
                    Request.UnsafeAuthenticatedConnectionSharing = true;
                    // Add the network credentials to the request.
                    Request.Credentials = MyCredentialCache;

                    // Specify the method.
                    Request.Method = "GET";

                    // Send the X-MS-ENUMATTS method request and get the
                    // response from the server.
                    Response = (HttpWebResponse)Request.GetResponse();
                   
                    // Get the XML response stream.
                    ResponseStream = Response.GetResponseStream();

                    MemoryStream ms = new MemoryStream();
                    StreamReader sr = new StreamReader(ResponseStream);
                    byte[] buffer = new byte[256];
                    int count = ResponseStream.Read(buffer, 0, 256);
                    while (count > 0)
                    {
                        ms.Write(buffer, 0, count);
                        count = ResponseStream.Read(buffer, 0, 256);
                    }
                    byte[] bs = ms.ToArray();
                    attach.attachmentByte = bs;
                    attach.attachmentName = _realAttachmentName[i];
                    ResponseStream.Close();
                    Response.Close();
                }
                return attach;
            }
            catch(Exception e)
            {
                return attach;
            }
        }

posted on 2008-07-28 17:05  美丽心情11  阅读(318)  评论(0编辑  收藏  举报