Skip to main content

Retrieve Gmail Inbox into Asp.Net using Pop3.

Introduction:

In this article I will explain how to integrate gmail mail into asp.net using pop3 server.

Pop3 Commands:

The commands used to retrieve mail from a Pop3 server by an email client are a series of text commands with single line responses from the mail server. The commands and examples used here are defined by RFC 1939- Post Office Protocol- Version 3.

user:

User is the first command after the connection is established. To connect, all you have to do is supply your e-mail user id.

Example Usage:

USER john.smith

PASS:

After having supplied your user name, the next command is to supply your e-mail password.

Example Usage:

PASS ****

STAT:

Returns the number of emails in the mailbox and the number of bytes all the emails are taking on the server.

Example Usage:

STAT

Sample Response: +OK 3 345910

 TOP:

Takes  two arguments i.e., the sort number of the email on the server and the number of lines of text to retrieve from the body of the email.

Example Usage:

TOP 1 0

retr:

Takes one argument i.e., the sort number of the email on the server and returns all the headers and lines from the body of the email.

Example Usage:

RETR 1


dele:

Takes one argument i.e., the sort number of the email on the server and deletes it.

Example Usage:

DELE 1

 rset:

Reset  any DELE commands given above. The emails marked to be deleted by DELE command are unmarked. 

Example Usage:

RSET

 quit:

Closes the user session with the server.

Example Usage:

QUIT

Steps:

Create a new WebPage  in VS 2008.

Step 1:

Create a Class file named Pop3.cs.

Paste the code below into Pop3.cs:

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 mail
{
    public class Pop3Client : IDisposable
    {
        public string Host { getprotected set; }
        public int Port { getprotected set; }
        public string Email { getprotected set; }
        public string Password { getprotected set; }
        public bool IsSecure { getprotected set; }
        public TcpClient Client { getprotected set; }
        public Stream ClientStream { getprotected set; }
        public StreamWriter Writer { getprotected set; }
        public StreamReader Reader { getprotected set; }
        private bool disposed = false;
        public Pop3Client(string host, int port, string email, string password): this(host, port, email, password, false){}
        public Pop3Client(string host, int port, string email, string password, bool secure)
        {
            Host = host;
            Port = port;
            Email = email;
            Password = password;
            IsSecure = secure;
        }
        public void Connect()
        {
            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();
        }
        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); i++)
            {
                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()
        {
            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;
        }
        public void Dispose()
        {
            if (!disposed)
                Close();
        }
        protected void Login()
        {
            if ((!IsResponseOk(SendCommand("USER " + Email))) || (!IsResponseOk(SendCommand("PASS " + Password))))
                throw new Exception("User/password not accepted");
        }
        protected void Logout()
        {
            SendCommand("RSET");
        }
        protected string SendCommand(string cmdtext)
        {
            Writer.WriteLine(cmdtext);
            Writer.Flush();
            return ReadLine();
        }
        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;
            throw new Exception("Cannot understand server response: " + response);
        }
    }
    public class Email
    {
        public NameValueCollection Headers { getprotected set; }
        public string ContentType { getprotected set; }
        public DateTime UtcDateTime { getprotected set; }
        public string From { getprotected set; }
        public string To { getprotected set; }
        public string Subject { getprotected 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 { getprotected set; }
        public string ContentType { getprotected set; }
        public string MessageText { getprotected 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.");
                }
                string offsetSign = m.Groups["offsetsign"].Value;
                int offsetHours = Convert.ToInt32(m.Groups["offsethours"].Value);
                int offsetMinutes = Convert.ToInt32(m.Groups["offsetminutes"].Value);
                DateTime dt = new DateTime(year, month, day, hour, min, sec);
                if (offsetSign == "+")
                {
                    dt.AddHours(offsetHours);
                    dt.AddMinutes(offsetMinutes);
                }
                else if (offsetSign == "-")
                {
                    dt.AddHours(-offsetHours);
                    dt.AddMinutes(-offsetMinutes);
                }
                return dt;
            }
            throw new FormatException("Incompatible date/time string format");
        }
    }
}

 Step 2:

Add a WebPage named as Home.aspx.

Paste this Designing Page into Home.aspx:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
    <style type="text/css">
        .style1
        {
            width50%;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>
   
        <table class="style1">
            <tr>
                <td colspan="3">
                    <h2 style="text-aligncenter">Welcome To Gmail</h2></td>
            </tr>
            <tr>
                <td>
                    <asp:Label ID="Label1" runat="server" Text="Gmail ID :"></asp:Label>
                </td>
                <td>
                    <asp:TextBox ID="txt_email" runat="server" Width="241px"></asp:TextBox>
                </td>
                <td>
                    <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server"
                        ControlToValidate="txt_email" ErrorMessage="Invalid Mail Format"
                        ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator>
                </td>
            </tr>
            <tr>
                <td>
                    <asp:Label ID="Label2" runat="server" Text="Password :"></asp:Label>
                </td>
                <td>
                    <asp:TextBox ID="txt_password" runat="server" TextMode="Password" Width="239px"></asp:TextBox>
                </td>
                <td>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
                        ControlToValidate="txt_password" ErrorMessage="*"></asp:RequiredFieldValidator>
                </td>
            </tr>
            <tr>
                <td colspan="3" style="text-aligncenter">
                    <asp:Button ID="Button1" runat="server" CausesValidation="False"
                        onclick="Button1_Click" style="text-aligncenter"Text="Login" Width="72px" />
                </td>
            </tr>
        </table>
   
    </div>
    </form>
</body>
</html>

Paste this code into Home.aspx.cs:

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class Home : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Session["email"] = txt_email.Text;
        Session["pwd"] = txt_password.Text;
        Response.Redirect("Pop3Client.aspx");
    }
}
Step 3:
Add a WebPage named as Pop3Client.aspx.

Paste this Designing Page into Pop3Client.aspx:
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
    <style type="text/css">
            .emails-table { width600pxbordersolid 1px #444444; }
            .emails-table-header { font-family"Trebuchet MS"font-size9pt;
                  background-color#0099B9colorwhite;
                  bordersolid 1px #444444; }
            .emails-table-header-cell { font-family"Georgia"font-size9pt;
                  font-weightboldbordersolid 1px #666666padding6px; }
            .emails-table-cell { font-family"Georgia"font-size9pt;
                  bordersolid 1px #666666padding6px; }
            .emails-table-footer { bordersolid 1px #666666padding3px;
                  width50%; }
            .email-datetime { floatrightcolor#666666; }
           
            a { font-family"Lucida Sans Unicode", "Trebuchet MS"font-size9pt;
                  color#005B7F; }
            a:hover { color:red; }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>
            <asp:Table ID="EmailsTable" CssClass="emails-table" runat="server">
            <asp:TableHeaderRow>
                  <asp:TableHeaderCell CssClass="emails-table-header"
                        ColumnSpan="4">Listing emails
                  <asp:Literal ID="EmailFromLiteral" runat="server" />-
                  <asp:Literal ID="EmailToLiteral" runat="server" /> of
                  <asp:Literal ID="EmailTotalLiteral" runat="server" /> for
                  <asp:Literal ID="EmailLiteral" runat="server" />
                  </asp:TableHeaderCell>
            </asp:TableHeaderRow>
            <asp:TableRow>
                  <asp:TableCell CssClass="emails-table-header-cell">
                        #</asp:TableCell>
                  <asp:TableCell CssClass="emails-table-header-cell">
                        From</asp:TableCell>
                  <asp:TableCell CssClass="emails-table-header-cell">
                        Subject</asp:TableCell>
                  <asp:TableCell CssClass="emails-table-header-cell">
                        Date &amp; Time</asp:TableCell>
            </asp:TableRow>
            <asp:TableFooterRow>
                  <asp:TableCell CssClass="emails-table-footer" ColumnSpan="4">
                  <asp:Table ID="FooterTable" Width="100%"
                        BorderWidth="0" runat="server">
                  <asp:TableRow>
                  <asp:TableCell>
                        <asp:Literal ID="PreviousPageLiteral" runat="server" />
                  </asp:TableCell>
                  <asp:TableCell HorizontalAlign="Right">
                        <asp:Literal ID="NextPageLiteral" runat="server" />
                  </asp:TableCell>
                  </asp:TableRow>
                  </asp:Table>
                  </asp:TableCell>
            </asp:TableFooterRow>
            </asp:Table>
    </div>
    </form>
</body>
</html>
Paste this code into Pop3Client.aspx.cs:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections.Generic;
using mail;
public partial class Pop3Client : System.Web.UI.Page
{
    public const string Host = "pop.gmail.com";
    public const int Port = 995;
    public string Email ;
    public string Password ;
    public const int NoOfEmailsPerPage = 5;
    public const string SelfLink ="<a href=\"Pop3Client.aspx?page={0}\">{1}</a>";
    public const string DisplayEmailLink ="<a href=\"DisplayPop3Email.aspx?emailId={0}\">{1}</a>";
    protected void Page_Load(object sender, EventArgs e)
    {
      
        int page = 1;
        if (Request.QueryString["page"] == null)
        {
            Response.Redirect("Pop3Client.aspx?page=1");
            Response.Flush();
            Response.End();
        }
        else
            page = Convert.ToInt32(Request.QueryString["page"]);
        try
        {
            Email = Session["email"].ToString();
            Password = Session["pwd"].ToString();
        }
        catch (Exception ex) { Response.Redirect("Home.aspx"); }
        int totalEmails;
        List<Email> emails;
        string emailAddress;
        using (mail.Pop3Client client = new mail.Pop3Client(Host, Port, Email, Password, true))
        {
            emailAddress = client.Email;
            client.Connect();
            totalEmails = client.GetEmailCount();
            emails = client.FetchEmailList(((page - 1) * NoOfEmailsPerPage) + 1, 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++)
        {
            Email email = emails[i];
            int emailId = ((page - 1) * NoOfEmailsPerPage) + i + 1;
            TableCell noCell = new TableCell();
            noCell.CssClass = "emails-table-cell";
            noCell.Text = Convert.ToString(emailId);
            TableCell fromCell = new TableCell();
            fromCell.CssClass = "emails-table-cell";
            fromCell.Text = email.From;
            TableCell subjectCell = new TableCell();
            subjectCell.CssClass = "emails-table-cell";
            subjectCell.Style["width"] = "300px";
            subjectCell.Text = String.Format(DisplayEmailLink, emailId, email.Subject);
            TableCell dateCell = new TableCell();
            dateCell.CssClass = "emails-table-cell";
            if (email.UtcDateTime != DateTime.MinValue)
               dateCell.Text = email.UtcDateTime.ToString();
            TableRow emailRow = new TableRow();
            emailRow.Cells.Add(noCell);
            emailRow.Cells.Add(fromCell);
            emailRow.Cells.Add(subjectCell);
            emailRow.Cells.Add(dateCell);
            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;
    }
}


 Step 4:

Add a WebPage named as DisplayPop3Email.aspx.

Paste this Designing Page into DisplayPop3Email.aspx:

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
    <style type="text/css">
            .emails-table { width600pxbordersolid 1px #444444; }
            .emails-table-header { font-family"Trebuchet MS"font-size9pt;
                  background-color#0099B9font-weightboldcolorwhite;
                  text-aligncenterbordersolid 1px #444444; }
            .emails-table-header-cell { font-family"Georgia"font-size9pt;
                  font-weightboldbordersolid 1px #666666padding6px; }
            .emails-table-cell { font-family"Georgia"font-size9pt;
                  bordersolid 1px #666666padding6px; }
            .emails-table-footer { bordersolid 1px #666666padding3px;
                  width50%; }
            .email-datetime { floatrightcolor#666666; }
           
            a { font-family"Lucida Sans Unicode", "Trebuchet MS"font-size9pt;
                  color#005B7F; }
            a:hover { color:red; }
            pre { font-family"Georgia"font-size9pt; }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <asp:Literal ID="DebugLiteral" runat="server" />
   
    <table class="emails-table">
    <tr>
            <td class="emails-table-header" colspan="2">
            Email #<asp:Literal ID="EmailIdLiteral" runat="server" /></td>
    </tr>
    <tr>
            <td class="emails-table-header-cell">Date &amp; Time</td>
            <td class="emails-table-cell">
                  <asp:Literal ID="DateLiteral" runat="server" /></td>
    </tr>
    <tr>
            <td class="emails-table-header-cell">From</td>
            <td class="emails-table-cell">
                  <asp:Literal ID="FromLiteral" runat="server" /></td>
    </tr>
    <tr>
            <td class="emails-table-header-cell">Subject</td>
            <td class="emails-table-cell">
                  <asp:Literal ID="SubjectLiteral" runat="server" /></td>
    </tr>
    <tr id="AttachementsRow" runat="server">
            <td class="emails-table-header-cell">Attachments</td>
            <td class="emails-table-cell">
                  <asp:Literal ID="AttachmentsLiteral" runat="server" /></td>
    </tr>
     <tr>
            <td class="emails-table-cell" colspan="2">
                  <asp:Literal ID="HeadersLiteral" runat="server" /></td>
    </tr>
    <tr>
            <td class="emails-table-cell" colspan="2">
                  <asp:Literal ID="BodyLiteral" runat="server" /></td>
    </tr>
    </table>
    </form>
</body>
</html>


Paste this code into DisplayPop3Email.aspx.cs:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections.Generic;
using mail;
using System.Text.RegularExpressions;
using System.Text;
public partial class DisplayPop3Email : System.Web.UI.Page
{
    public const string Host = "pop.gmail.com";
    public const int Port = 995;
    public string Email ;
    public string Password;
    protected static Regex CharsetRegex = new Regex("charset=\"?(?<charset>[^\\s\"]+)\"?"RegexOptions.IgnoreCase | RegexOptions.Compiled);
    protected static Regex QuotedPrintableRegex = new Regex("=(?<hexchars>[0-9a-fA-F]{2,2})"RegexOptions.IgnoreCase | RegexOptions.Compiled);
    protected static Regex UrlRegex = new Regex("(?<url>https?://[^\\s\"]+)",RegexOptions.IgnoreCase | RegexOptions.Compiled);
    protected static Regex FilenameRegex = new Regex("filename=\"?(?<filename>[^\\s\"]+)\"?"RegexOptions.IgnoreCase | RegexOptions.Compiled);
    protected static Regex NameRegex = new Regex("name=\"?(?<filename>[^\\s\"]+)\"?"RegexOptions.IgnoreCase | RegexOptions.Compiled);
    protected void Page_Load(object sender, EventArgs e)
    {
        int emailId = -1;
            if (Request.QueryString["emailId"] == null)
            {
                  Response.Redirect("Pop3Client.aspx");
                  Response.Flush();
                  Response.End();
            }
            else
            Email = Session["email"].ToString();
        Password = Session["pwd"].ToString();
                  emailId = Convert.ToInt32(Request.QueryString["emailId"]);
            Email email = null;
            List<MessagePart> msgParts = null;
            using (mail.Pop3Client client = new mail.Pop3Client (Host, Port,Email, Password, true))
            {
                  client.Connect();
                  email = client.FetchEmail(emailId);
                  msgParts = client.FetchMessageParts(emailId);
            }
            if (email == null || msgParts == null)
            {
                  Response.Redirect("Pop3Client.aspx");
                  Response.Flush();
                  Response.End();
            }
            MessagePart preferredMsgPart = FindMessagePart(msgParts, "text/html");
            if (preferredMsgPart == null)
                  preferredMsgPart = FindMessagePart(msgParts, "text/plain");
            else if (preferredMsgPart == null && msgParts.Count > 0)
                  preferredMsgPart = msgParts[0];
            string contentType, charset, contentTransferEncoding, body = null;
            if (preferredMsgPart != null)
            {
                  contentType = preferredMsgPart.Headers["Content-Type"];
                  charset = "us-ascii";
                  contentTransferEncoding =preferredMsgPart.Headers["Content-Transfer-Encoding"];
                  Match m = CharsetRegex.Match(contentType);
                  if (m.Success)
                        charset = m.Groups["charset"].Value;
                  HeadersLiteral.Text = contentType != null ? "Content-Type: " +contentType + "<br />" : string.Empty;
                  HeadersLiteral.Text += contentTransferEncoding != null ?"Content-Transfer-Encoding: " +contentTransferEncoding : string.Empty;
                  if (contentTransferEncoding != null)
                  {
                        if (contentTransferEncoding.ToLower() == "base64")
                              body = DecodeBase64String(charset,preferredMsgPart.MessageText);
                        else if (contentTransferEncoding.ToLower() =="quoted-printable")
                              body = DecodeQuotedPrintableString(preferredMsgPart.MessageText);
                        else
                              body = preferredMsgPart.MessageText;
                  }
                  else
                        body = preferredMsgPart.MessageText;
            }
            EmailIdLiteral.Text = Convert.ToString(emailId);
            DateLiteral.Text = email.UtcDateTime.ToString(); ;
            FromLiteral.Text = email.From;
            SubjectLiteral.Text = email.Subject;
            BodyLiteral.Text = preferredMsgPart != null ? (preferredMsgPart.Headers["Content-Type"].IndexOf("text/plain") != -1 ?"<pre>" + FormatUrls(body) + "</pre>" : body) : null;
            ListAttachments(msgParts);
      }
    protected Decoder GetDecoder(string charset)
    {
        Decoder decoder;
        switch (charset.ToLower())
        {
            case "utf-7":
                decoder = Encoding.UTF7.GetDecoder();
                break;
            case "utf-8":
                decoder = Encoding.UTF8.GetDecoder();
                break;
            case "us-ascii":
                decoder = Encoding.ASCII.GetDecoder();
                break;
            case "iso-8859-1":
                decoder = Encoding.ASCII.GetDecoder();
                break;
            default:
                decoder = Encoding.ASCII.GetDecoder();
                break;
        }
        return decoder;
    }
    protected string DecodeBase64String(string charset, string encodedString)
    {
        Decoder decoder = GetDecoder(charset);
        byte[] buffer = Convert.FromBase64String(encodedString);
        char[] chararr = new char[decoder.GetCharCount(buffer,0, buffer.Length)];
        decoder.GetChars(buffer, 0, buffer.Length, chararr, 0);
        return new string(chararr);
    }
    protected string DecodeQuotedPrintableString(string encodedString)
    {
        StringBuilder b = new StringBuilder();
        int startIndx = 0;
        MatchCollection matches = QuotedPrintableRegex.Matches(encodedString);
        for (int i = 0; i < matches.Count; i++)
        {
            Match m = matches[i];
            string hexchars = m.Groups["hexchars"].Value;
            int charcode = Convert.ToInt32(hexchars, 16);
            char c = (char)charcode;
            if (m.Index > 0)
                b.Append(encodedString.Substring(startIndx, (m.Index - startIndx)));
            b.Append(c);
            startIndx = m.Index + 3;
        }
        if (startIndx < encodedString.Length)
            b.Append(encodedString.Substring(startIndx));
        return Regex.Replace(b.ToString(), "=\r\n""");
    }
    protected void ListAttachments(List<MessagePart> msgParts)
    {
        bool attachmentsFound = false;
        StringBuilder b = new StringBuilder();
        b.Append("<ol>");
        foreach (MessagePart p in msgParts)
        {
            string contentType = p.Headers["Content-Type"];
            string contentDisposition = p.Headers["Content-Disposition"];
            Match m;
            if (contentDisposition != null)
            {
                m = FilenameRegex.Match(contentDisposition);
                if (m.Success)
                {
                    attachmentsFound = true;
                    b.Append("<li>").Append(m.Groups["filename"].Value).Append("</li>");
                   
                }
            }
            else if (contentType != null)
            {
                m = NameRegex.Match(contentType);

                if (m.Success)
                {
                    attachmentsFound = true;
                    b.Append("<li>").Append(m.Groups["filename"].Value).Append("</li>");
                }
            }
        }
        b.Append("</ol>");
        if (attachmentsFound)
            AttachmentsLiteral.Text = b.ToString();
        else
            AttachementsRow.Visible = false;
    }
    protected MessagePart FindMessagePart(List<MessagePart> msgParts,string contentType)
    {
        foreach (MessagePart p in msgParts)
            if (p.ContentType != null && p.ContentType.IndexOf(contentType) != -1)
                return p;
        return null;
    }
    protected string FormatUrls(string plainText)
    {
        string replacementLink = "<a href=\"${url}\">${url}</a>";
        return UrlRegex.Replace(plainText, replacementLink);
    }
}










Comments

Popular posts from this blog

How to Create ContactUs page using Rich TextBox in Asp.Net

I ntroduction : As we know, ASP.NET lacks a control that we need most,   RichText  editor. If you are trying to create an application or website with Admin Panel or Blog or Forum Website or some such project for Web in ASP.NET platform, we need RichText Editor. To overcome this, we can use many open source JavaScript based editors, like Tiny MCE, FCKEditor, etc. here we are using TinyMCE, which is one of the most popular and Open Source projects. Download the latest version of TinyMCE from  download page , and extract the zip file. Steps: Create a new WebPage  in  VS 2008. Browse the extracted location and go to  ..\tinymce_3.5.6\tinymce\jscripts   folder. Now copy the  tinymce  folder from the above location to your solution in Visual Studio. Step 1: Create a  WebPage  file named  ContactUs.aspx . Paste the code below into  ContactUs.aspx: < html   xmlns ="http:/...

Insert, Edit, Update, Delete in Asp.Net Gridview

I ntroduction : In this article I will explain how to Insert, Edit, Update, Delete in Gridview in Asp.Net using C#. Description: First I will write code to Insert data into Gridview then I will perform Edit, Update and Delete operations on it. For achieving all these functionalities I have used following Gridview commands, they are: onrowediting onrowupdating onrowcancelingedit onPageIndexChanging Below is the code for aspx page: < html   xmlns ="http://www.w3.org/1999/xhtml"   > < head   id ="Head1"   runat ="server">      < title > Untitled Page </ title >      < style   type ="text/css"> .Gridview { font-family:Verdana; font-size:10pt; font-weight:normal; color:black; } </ style > < script   type ="text/javascript"> function  ConfirmationBox(username) { var  result = confirm( 'Are you sure you want to delete ' +user...