[译]在ASP.NET中阅读Gmail收件箱消息
By robot-v1.0
本文链接 https://www.kyfws.com/applications/read-gmail-inbox-message-in-asp-net-zh/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 9 分钟阅读 - 4015 个词 阅读量 0[译]在ASP.NET中阅读Gmail收件箱消息
原文地址:https://www.codeproject.com/Articles/188349/Read-Gmail-Inbox-Message-in-ASP-NET
原文作者:PrabhuMuthusamy
译文由本站 robot-v1.0 翻译
前言
Get into our Gmail inbox in our Web Page
在我们的网页上进入我们的Gmail收件箱
介绍(Introduction)
这是电子邮件客户端用来连接到远程服务器上的邮箱并从中检索电子邮件的协议(一组命令).我们将开发连接到POP3服务器并发送命令以检索服务器上电子邮件列表的代码,然后在以后使用ASP.NET页向用户显示该列表.为了演示该代码,我们将使用SSL(安全套接字层)连接到Gmail的POP3服务器.要连接到您自己的POP3邮件服务器,可以在邮件服务器支持的情况下使用安全连接(SSL),也可以以不安全模式进行连接.该代码易于理解,通过阅读它,您将学到很多有关在.NET环境中如何进行网络编程的知识.(This is a protocol (a set of commands) used by an email client to connect to and retrieve email(s) from the mailbox on the remote server. We will develop the code that connects to the POP3 server and sends commands to retrieve the list of emails on the server, and then later, using an ASP.NET page, display the list to the user. To demonstrate the code, we will be connecting to Gmail’s POP3 server using SSL (Secure Sockets Layer). To connect to your own POP3 mail server, you can either use the secure connection (SSL) if your mail server supports it or connect in unsecure mode. The code is simple to understand and by looking at it you will learn a lot about how network programming is done in the .NET environment.)
POP3基本命令(Basic POP3 Commands)
以下是常用的POP3命令的列表:(Following is a list of commonly used POP3 commands:)
USER
-接受一个参数,即试图连接到他/她的邮箱的用户的电子邮件地址.用法示例:(- Takes one argument i.e., the email address of the user trying to connect to his/her mailbox. Example usage:)PASS
-接受一个参数,即用户密码.用法示例:(- Takes one argument i.e., the password of the user. Example usage:)STAT
-返回邮箱中的电子邮件数量以及服务器上所有电子邮件占用的字节数.用法示例:(- Returns the number of emails in the mailbox and the number of bytes all the emails are taking on the server. Example usage:)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:)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:)DELE
-接受一个参数,即服务器上电子邮件的分类号,然后将其删除.用法示例:(- Takes one argument i.e., the sort number of the email on the server and deletes it. Example usage:)RSET
-重置任何(- Resets any)DELE
上面给出的命令.被DELE命令标记为要删除的电子邮件是未标记的.用法示例:(commands given above. The emails marked to be deleted by DELE command are unmarked. Example usage:)QUIT
-关闭与服务器的用户会话.用法示例:(- Closes the user session with the server. Example usage:)
脚步(Steps)
在VS 2005中创建一个新的WebPage.(Create a new WebPage in VS 2005.)
第1步(Step 1)
创建一个名为的类文件(Create a Class file named as)Pop3.cs(Pop3.cs).(.)
将此代码粘贴到Pop3.cs中:(Paste this code 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 Prabhu
{
public class Pop3Client : IDisposable
{
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(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 { 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.");
}
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");
}
}
}
第2步(Step 2)
添加一个名为的网页(Add a WebPage named as)Home.aspx(Home.aspx).(.)
将此设计页面粘贴到(Paste this Designing Page into)Home.aspx(Home.aspx):(:)
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Home.aspx.cs" Inherits="Home" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
<style type="text/css">
.style1
{
width: 50%;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<table class="style1">
<tr>
<td colspan="3">
<h2 style="text-align: center">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-align: center">
<asp:Button ID="Button1" runat="server" CausesValidation="False"
onclick="Button1_Click" style="text-align: center" Text="Login" Width="72px" />
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
将此代码粘贴到(Paste this code into)Home.aspx.cs(Home.aspx.cs):(:)
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(Pop3Client.aspx).(.)
将此设计页面粘贴到(Paste this Designing Page into)Pop3Client.aspx(Pop3Client.aspx):(:)
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Pop3Client.aspx.cs"
Inherits="Pop3Client" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server">
<title></title>
<style type="text/css">
.emails-table { width: 600px; border: solid 1px #444444; }
.emails-table-header { font-family: "Trebuchet MS"; font-size: 9pt;
background-color: #0099B9; color: white;
border: solid 1px #444444; }
.emails-table-header-cell { font-family: "Georgia"; font-size: 9pt;
font-weight: bold; border: solid 1px #666666; padding: 6px; }
.emails-table-cell { font-family: "Georgia"; font-size: 9pt;
border: solid 1px #666666; padding: 6px; }
.emails-table-footer { border: solid 1px #666666; padding: 3px;
width: 50%; }
.email-datetime { float: right; color: #666666; }
a { font-family: "Lucida Sans Unicode", "Trebuchet MS"; font-size: 9pt;
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 & 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 coding into)Pop3Client.aspx.cs(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 Prabhu;
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="http://www.codeproject.com/%22Pop3Client.aspx?page={0}\"">{1}</a>";
public const string DisplayEmailLink =
"<a href="http://www.codeproject.com/%22DisplayPop3Email.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 (Prabhu.Pop3Client client = new Prabhu.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;
}
}
第4步(Step 4)
添加一个名为的网页(Add a WebPage named as)DisplayPop3Email.aspx(DisplayPop3Email.aspx).(.)
将此设计页面粘贴到(Paste this Designing Page into)DisplayPop3Email.aspx(DisplayPop3Email.aspx):(:)
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="DisplayPop3Email.aspx.cs" Inherits="DisplayPop3Email" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
<style type="text/css">
.emails-table { width: 600px; border: solid 1px #444444; }
.emails-table-header { font-family: "Trebuchet MS"; font-size: 9pt;
background-color: #0099B9; font-weight: bold; color: white;
text-align: center; border: solid 1px #444444; }
.emails-table-header-cell { font-family: "Georgia"; font-size: 9pt;
font-weight: bold; border: solid 1px #666666; padding: 6px; }
.emails-table-cell { font-family: "Georgia"; font-size: 9pt;
border: solid 1px #666666; padding: 6px; }
.emails-table-footer { border: solid 1px #666666; padding: 3px;
width: 50%; } .email-datetime { float: right; color: #666666; }
a { font-family: "Lucida Sans Unicode", "Trebuchet MS"; font-size: 9pt;
color: #005B7F; } a:hover { color:red; }
pre { font-family: "Georgia"; font-size: 9pt; }
</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 & 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(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 Prabhu;
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 (Prabhu.Pop3Client client =
new Prabhu.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);
}
}
历史(History)
- 27(27)日(th)2011年4月:初始版本(April, 2011: Initial version)
许可
本文以及所有相关的源代码和文件均已获得The Code Project Open License (CPOL)的许可。
C# .NET Windows ASP.NET 新闻 翻译