使用hotmail

时间:2015-08-31 12:59:55

标签: asp.net outlook c#-3.0 pop3 hotmail

我正在使用POP3代码接收来自邮件服务器的邮件它在GMail和雅虎上运行良好,但是当我尝试连接hotmail时出现错误

  

string response = SendCommand(“STAT”);

“ - 现在不期望ERR命令\ r \ n”  我附上邮件代码请查看并建议我可能的解决方案。

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Xml;

namespace CallScreen24x7.BAL
{
    public class Pop3Client : IDisposable
    {
        //string _host,_email,_pass;
        //int port;
      //  string _host = ConfigurationSettings.AppSettings["host"];
        public string Host { get; protected set; }
        public int Port { get; protected set; }
        public string Email { get; protected set; }
        public string Password { get; protected set; }
        public bool IsSecure { get; protected set; }
        public TcpClient Client { get; protected set; }
        public Stream ClientStream { get; protected set; }
        public StreamWriter Writer { get; protected set; }
        public StreamReader Reader { get; protected set; }
        private bool disposed = false;
        //public Pop3Client(string host, int port, string email, string password) : this("mail.ansitdev.com", 110, "dev@ansitdev.com", "P@ssword123", false) { }
        public Pop3Client(string host, int port, string email, string password, bool secure)
        {
            try
            {

                Host = host;// ConfigurationSettings.AppSettings["host"];// "mail.ansitdev.com";
                Port = port;
                Email = email;// "dev@ansitdev.com";
                Password = password;// ;
                IsSecure = true;
            }
            catch (Exception ex)
            { }

        }
        public void Connect()
        {
            try
            {
                if (Client == null)
                    Client = new TcpClient();
                if (!Client.Connected)
                    Client.Connect(Host, Port);
                if (IsSecure)
                {
                    SslStream secureStream = new SslStream(Client.GetStream());
                    secureStream.AuthenticateAsClient(Host);
                    ClientStream = secureStream;
                    secureStream = null;
                }
                else
                    ClientStream = Client.GetStream();
                Writer = new StreamWriter(ClientStream);
                Reader = new StreamReader(ClientStream);
                ReadLine();
                Login();
            }
            catch(Exception ex)
            {}
        }
        public int GetEmailCount()
        {
              int count = 0;
                string response = SendCommand("STAT");
                if (IsResponseOk(response))
                {
                    string[] arr = response.Substring(4).Split(' ');
                    count = Convert.ToInt32(arr[0]);
                }
                else
                    count = -1;
                return count;


        }
        public Email FetchEmail(int emailId)
        {

                if (IsResponseOk(SendCommand("TOP " + emailId + " 0")))
                    return new Email(ReadLines());
                else
                    return null;

        }
        public List<Email> FetchEmailList(int start, int count)
        {

                List<Email> emails = new List<Email>(count);
                for (int i = start; i >=(start-count)+1; i--)
                {
                    if (i >= 0)
                    {
                        Email email = FetchEmail(i);
                        if (email != null)
                            emails.Add(email);
                    }
                }
                return emails;

        }
        public List<MessagePart> FetchMessageParts(int emailId)
        {

            if (IsResponseOk(SendCommand("RETR " + emailId)))
                return Util.ParseMessageParts(ReadLines());

            return null;
        }
        public void Close()
        {
            try
            {
                if (Client != null)
                {
                    if (Client.Connected)
                        Logout();
                    Client.Close();
                    Client = null;
                }
                if (ClientStream != null)
                {
                    ClientStream.Close();
                    ClientStream = null;
                }
                if (Writer != null)
                {
                    Writer.Close();
                    Writer = null;
                }
                if (Reader != null)
                {
                    Reader.Close();
                    Reader = null;
                }
                disposed = true;
            }
            catch (Exception ex)
            { }
        }
        public void Dispose()
        {
            try
            {
                if (!disposed)
                    Close();
            }
            catch (Exception ex)
            { }
        }
        protected void Login()
        {
            try
            {
                if (!IsResponseOk(SendCommand("USER " + Email)) || !IsResponseOk(SendCommand("PASS " + Password))) { }
                  // throw new Exception("User/password not accepted");
            }
            catch (Exception ex)
            { }
        }
        protected void Logout()
        {

            SendCommand("RSET");
        }
        protected string SendCommand(string cmdtext)
        {
            try
            {
                Writer.WriteLine(cmdtext);
                Writer.Flush();

                return ReadLine();
            }
            catch (Exception ex) { return null; }

        }
        protected string ReadLine()
        {


                return Reader.ReadLine() + "\r\n";

        }
        protected string ReadLines()
        {
            StringBuilder b = new StringBuilder();
            while (true)
            {
                string temp = ReadLine();
                if (temp == ".\r\n" || temp.IndexOf("-ERR") != -1)
                    break;
                b.Append(temp);
            }
            return b.ToString();
        }
        protected static bool IsResponseOk(string response)
        {
            if (response.StartsWith("+OK"))
                return true;
            if (response.StartsWith("-ERR"))
                return false;
            return true;
            // throw new Exception("Cannot understand server response: " + response);
        }
    }
    public class Email
    {

        public NameValueCollection Headers { get; protected set; }
        public string ContentType { get; protected set; }
        public DateTime UtcDateTime { get; protected set; }
        public string From { get; protected set; }
        public string To { get; protected set; }
        public string Subject { get; protected set; }
        public Email(string emailText)
        {
            Headers = Util.ParseHeaders(emailText);
            ContentType = Headers["Content-Type"];
            From = Headers["From"];
            To = Headers["To"];
            Subject = Headers["Subject"];
            if (Headers["Date"] != null)
                try
                {
                    UtcDateTime = Util.ConvertStrToUtcDateTime(Headers["Date"]);
                }
                catch (FormatException)
                {
                    UtcDateTime = DateTime.MinValue;
                }
            else
                UtcDateTime = DateTime.MinValue;
        }

    }
    public class MessagePart
    {
        public NameValueCollection Headers { get; protected set; }
        public string ContentType { get; protected set; }
        public string MessageText { get; protected set; }
        public MessagePart(NameValueCollection headers, string messageText)
        {
            Headers = headers;
            ContentType = Headers["Content-Type"];
            MessageText = messageText;
        }
    }
    public class Util
    {
        protected static Regex BoundaryRegex = new Regex("Content-Type: multipart(?:/\\S+;)" + "\\s+[^\r\n]*boundary=\"?(?<boundary>" + "[^\"\r\n]+)\"?\r\n", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        protected static Regex UtcDateTimeRegex = new Regex(@"^(?:\w+,\s+)?(?<day>\d+)\s+(?<month>\w+)\s+(?<year>\d+)\s+(?<hour>\d{1,2})" + @":(?<minute>\d{1,2}):(?<second>\d{1,2})\s+(?<offsetsign>\-|\+)(?<offsethours>" + @"\d{2,2})(?<offsetminutes>\d{2,2})(?:.*)$", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        public static NameValueCollection ParseHeaders(string headerText)
        {
            NameValueCollection headers = new NameValueCollection();
            StringReader reader = new StringReader(headerText);
            string line;
            string headerName = null, headerValue;
            int colonIndx;
            while ((line = reader.ReadLine()) != null)
            {
                if (line == "")
                    break;
                if (Char.IsLetterOrDigit(line[0]) && (colonIndx = line.IndexOf(':')) != -1)
                {
                    headerName = line.Substring(0, colonIndx);
                    headerValue = line.Substring(colonIndx + 1).Trim();
                    headers.Add(headerName, headerValue);
                }
                else if (headerName != null)
                    headers[headerName] += " " + line.Trim();
                else
                    throw new FormatException("Could not parse headers");
            }
            return headers;
        }
        public static List<MessagePart> ParseMessageParts(string emailText)
        {
            List<MessagePart> messageParts = new List<MessagePart>();
            int newLinesIndx = emailText.IndexOf("\r\n\r\n");
            Match m = BoundaryRegex.Match(emailText);
            if (m.Index < emailText.IndexOf("\r\n\r\n") && m.Success)
            {
                string boundary = m.Groups["boundary"].Value;
                string startingBoundary = "\r\n--" + boundary;
                int startingBoundaryIndx = -1;
                while (true)
                {
                    if (startingBoundaryIndx == -1)
                        startingBoundaryIndx = emailText.IndexOf(startingBoundary);
                    if (startingBoundaryIndx != -1)
                    {
                        int nextBoundaryIndx = emailText.IndexOf(startingBoundary, startingBoundaryIndx + startingBoundary.Length);
                        if (nextBoundaryIndx != -1 && nextBoundaryIndx != startingBoundaryIndx)
                        {
                            string multipartMsg = emailText.Substring(startingBoundaryIndx + startingBoundary.Length, (nextBoundaryIndx - startingBoundaryIndx - startingBoundary.Length));
                            int headersIndx = multipartMsg.IndexOf("\r\n\r\n");
                            if (headersIndx == -1)
                                throw new FormatException("Incompatible multipart message format");
                            string bodyText = multipartMsg.Substring(headersIndx).Trim();
                            NameValueCollection headers = Util.ParseHeaders(multipartMsg.Trim());
                            messageParts.Add(new MessagePart(headers, bodyText));
                        }
                        else
                            break;
                        startingBoundaryIndx = nextBoundaryIndx;
                    }
                    else
                        break;
                }
                if (newLinesIndx != -1)
                {
                    string emailBodyText = emailText.Substring(newLinesIndx + 1);
                }
            }
            else
            {
                int headersIndx = emailText.IndexOf("\r\n\r\n");
                if (headersIndx == -1)
                    throw new FormatException("Incompatible multipart message format");
                string bodyText = emailText.Substring(headersIndx).Trim();
                NameValueCollection headers = Util.ParseHeaders(emailText);
                messageParts.Add(new MessagePart(headers, bodyText));
            }
            return messageParts;
        }
        public static DateTime ConvertStrToUtcDateTime(string str)
        {
            Match m = UtcDateTimeRegex.Match(str);
            int day, month, year, hour, min, sec;
            if (m.Success)
            {
                day = Convert.ToInt32(m.Groups["day"].Value);
                year = Convert.ToInt32(m.Groups["year"].Value);
                hour = Convert.ToInt32(m.Groups["hour"].Value);
                min = Convert.ToInt32(m.Groups["minute"].Value);
                sec = Convert.ToInt32(m.Groups["second"].Value);
                switch (m.Groups["month"].Value)
                {
                    case "Jan":
                        month = 1;
                        break;
                    case "Feb":
                        month = 2;
                        break;
                    case "Mar":
                        month = 3;
                        break;
                    case "Apr":
                        month = 4;
                        break;
                    case "May":
                        month = 5;
                        break;
                    case "Jun":
                        month = 6;
                        break;
                    case "Jul":
                        month = 7;
                        break;
                    case "Aug":
                        month = 8;
                        break;
                    case "Sep":
                        month = 9;
                        break;
                    case "Oct":
                        month = 10;
                        break;
                    case "Nov":
                        month = 11;
                        break;
                    case "Dec":
                        month = 12;
                        break;
                    default:
                        throw new FormatException("Unknown month.");
                }


                DateTime dt = new DateTime(year, month, day, hour, min, sec);

                DateTime kt = dt.AddHours(-offsetHours);
                kt = kt.AddMinutes(-offsetMinutes);

                return kt;
            }
            throw new FormatException("Incompatible date/time string format");
        }

    }
}

and 

 int page = 1;
            if (Request.QueryString["page"] == null)
            {
                Response.Redirect("DashBoard.aspx?page=1");
                Response.Flush();
                Response.End();
            }
            else
                page = Convert.ToInt32(Request.QueryString["page"]);
            try
            {
                Email = ConfigurationSettings.AppSettings["email"].ToString();
                Password = ConfigurationSettings.AppSettings["pass"].ToString();
            }
            catch (Exception ex)
            {
                Response.Redirect("DashBoard.aspx");

                objentityException.ExceptionDescription = ex.Message + " " + ex.StackTrace; ;
                objentityException.MethodName = "Page_Load";
                objentityException.CreatedBy = Session["UserName"].ToString();
                objException.InsertException(objentityException);


            }
            int totalEmails;
            List<Email> emails;
            string emailAddress;
            using (Pop3Client client = new Pop3Client(Host, Port, Email, Password, false))
            {
                emailAddress = client.Email;
                client.Connect();
                totalEmails = client.GetEmailCount();
                emails = client.FetchEmailList((totalEmails - ((page - 1) * 5)), NoOfEmailsPerPage);
            }
            int totalPages;
            int mod = totalEmails % NoOfEmailsPerPage;
            if (mod == 0)
                totalPages = totalEmails / NoOfEmailsPerPage;
            else
                totalPages = ((totalEmails - mod) / NoOfEmailsPerPage) + 1;
            for (int i = 0; i < emails.Count; i++)
            {
                AdminTransaction AT = new AdminTransaction();
                DAL.Emails objEmail = new DAL.Emails();

                Email email = emails[i];
                int emailId = ((totalEmails - ((page - 1) * 5) - i));
                TableCell noCell = new TableCell();
                noCell.CssClass = "emails-table-cell";
                noCell.Text = Convert.ToString(emailId);
                objEmail.EmailNo = emailId;
                TableCell fromCell = new TableCell();

                fromCell.Text = email.From;

                TableCell subjectCell = new TableCell();

                subjectCell.Style["width"] = "300px";
                subjectCell.Text = String.Format(DisplayEmailLink, emailId, page, email.Subject);

                TableCell dateCell = new TableCell();

                if (email.UtcDateTime != DateTime.MinValue)
                    dateCell.Text = email.UtcDateTime.ToString();
                int x = AT.AddEmail(objEmail);
                DataSet ds = AT.GetMailStatus(emailId);
                if (ds.Tables[0].Rows.Count > 0)
                {

                    // subjectCell.ForeColor = System.Drawing.Color.Red;
                    subjectCell.CssClass = "emails-table-cell";
                    fromCell.CssClass = "emails-table-cell";
                    dateCell.CssClass = "emails-table-cell";
                }
                else
                {
                    subjectCell.CssClass = "emails-table-cellRead";
                    fromCell.CssClass = "emails-table-cellRead";
                    dateCell.CssClass = "emails-table-cellRead";
                }
                TableRow emailRow = new TableRow();
                // emailRow.Cells.Add(noCell);
                emailRow.Cells.Add(fromCell);
                emailRow.Cells.Add(subjectCell);
                emailRow.Cells.Add(dateCell);
                //EmailsTable.Rows.Add(emailRow);
                EmailsTable.Rows.AddAt(2 + i, emailRow);


            }

            if (totalPages > 1)
            {
                if (page > 1)
                    PreviousPageLiteral.Text = String.Format(SelfLink, page - 1, "Previous Page");
                if (page > 0 && page < totalPages)
                    NextPageLiteral.Text = String.Format(SelfLink, page + 1, "Next Page");
            }
            EmailFromLiteral.Text = Convert.ToString(((page - 1) * NoOfEmailsPerPage) + 1);
            EmailToLiteral.Text = Convert.ToString(page * NoOfEmailsPerPage);
            EmailTotalLiteral.Text = Convert.ToString(totalEmails);
            EmailLiteral.Text = emailAddress;
        }

0 个答案:

没有答案