接收电子邮件的源代码

时间:2015-07-21 19:52:32

标签: asp.net

我在asp.net C#中制作电子邮件客户端。在其中,GridView不会获取超过5行的数据。我的邮箱里有250封邮件。但GridView没有显示该数据。它最多只显示5行,然后在GridView中显示5到6行数据。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CS.aspx.cs" Inherits="CS" %>
<!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></title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js">
</script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.9/jquery-ui.js" type="text/javascript">
</script>
<link href="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.9/themes/start/jquery-ui.css"
rel="stylesheet" type="text/css" 
 />
<script type="text/javascript">
$("[id*=lnkView]").live("click", function () {
    var subject = $(this).text();
    var row = $(this).closest("tr");
    $("#body").html($(".body", row).html());
    $("#attachments").html($(".Attachments", row).html());
    $("#dialog").dialog({
        title: subject,
        buttons: {
            Ok: function () {
                $(this).dialog('close');
            }
        }
    });
    return false;
});
</script>
</head>
<body style="font-family: Arial; font-size: 10pt">
<form id="form1" runat="server">
<asp:GridView ID="gvEmails" runat="server" OnRowDataBound="OnRowDataBound" DataKeyNames="MessageNumber"
AutoGenerateColumns="false">
<Columns>
    <asp:BoundField HeaderText="From" DataField="From" HtmlEncode="false" />
    <asp:TemplateField HeaderText="Subject">
        <ItemTemplate>
            <asp:LinkButton ID="lnkView" runat="server" Text='<%#           Eval("Subject") %>' />
            <span class="body" style="display: none">
                <%# Eval("Body") %></span>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:BoundField HeaderText="Date" DataField="DateSent" />
    <asp:TemplateField ItemStyle-CssClass="Attachments">
        <ItemTemplate>
            <asp:Repeater ID="rptAttachments" runat="server">
                <ItemTemplate>
     <asp:LinkButton ID="lnkAttachment" runat="server" OnClick="Download" Text='<%# Eval("FileName") %>' />
                </ItemTemplate>
                <SeparatorTemplate>
                    <br>
                </SeparatorTemplate>
            </asp:Repeater>
        </ItemTemplate>
    </asp:TemplateField>
</Columns>
</asp:GridView>
<div id="dialog" style="display: none">
<span id="body"></span>
<br />
<span id="attachments"></span>
</div>
</form>
</body> 
</html>

代码背后:

public partial class CS : System.Web.UI.Page
{

protected List<Email> Emails
{
    get { return (List<Email>)ViewState["Emails"]; }
    set { ViewState["Emails"] = value; }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        this.Read_Emails();
    }
}

private void Read_Emails()
{
    Pop3Client pop3Client;
    if (Session["Pop3Client"] == null)
    {
        pop3Client = new Pop3Client();
        pop3Client.Connect("pop.gmail.com", 995, true);
        pop3Client.Authenticate("example@gmail.com", "password", AuthenticationMethod.TryBoth);
        Session["Pop3Client"] = pop3Client;
    }
    else
    {
        pop3Client = (Pop3Client)Session["Pop3Client"];
    }
    int count = pop3Client.GetMessageCount();
    this.Emails = new List<Email>();
    int counter = 0;
    for (int i = count; i >= 1; i--)
    {
        Message message = pop3Client.GetMessage(i);
        Email email = new Email()
        {
            MessageNumber = i,
            Subject = message.Headers.Subject,
            DateSent = message.Headers.DateSent,
            From = string.Format("<a href = 'mailto:{1}'>{0}</a>", message.Headers.From.DisplayName, message.Headers.From.Address),
        };
        MessagePart body = message.FindFirstHtmlVersion();
        if (body != null)
        {
            email.Body = body.GetBodyAsText();
        }
        else
        {
            body = message.FindFirstPlainTextVersion();
            if (body != null)
            {
                email.Body = body.GetBodyAsText();
            }
        }
        List<MessagePart> attachments = message.FindAllAttachments();

        foreach (MessagePart attachment in attachments)
        {
            email.Attachments.Add(new Attachment
            {
                FileName = attachment.FileName,
                ContentType = attachment.ContentType.MediaType,
                Content = attachment.Body
            });
        }
        this.Emails.Add(email);
        counter++;
        if (counter > count)
        {
            break;
        }
        gvEmails.DataSource = this.Emails;
        gvEmails.DataBind();
    }
    //gvEmails.DataSource = this.Emails;
    //gvEmails.DataBind();
}
protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        Repeater rptAttachments = (e.Row.FindControl("rptAttachments") as Repeater);
        List<Attachment> attachments = this.Emails.Where(email => email.MessageNumber == Convert.ToInt32(gvEmails.DataKeys[e.Row.RowIndex].Value)).FirstOrDefault().Attachments;
        rptAttachments.DataSource = attachments;
        rptAttachments.DataBind();
    }
}
protected void Download(object sender, EventArgs e)
{
    LinkButton lnkAttachment = (sender as LinkButton);
    GridViewRow row = (lnkAttachment.Parent.Parent.NamingContainer as GridViewRow);
    List<Attachment> attachments = this.Emails.Where(email => email.MessageNumber == Convert.ToInt32(gvEmails.DataKeys[row.RowIndex].Value)).FirstOrDefault().Attachments;
    Attachment attachment = attachments.Where(a => a.FileName == lnkAttachment.Text).FirstOrDefault();
    Response.AddHeader("content-disposition", "attachment;filename=" + attachment.FileName);
    Response.ContentType = attachment.ContentType;
    Response.BinaryWrite(attachment.Content);
    Response.End();
}
}

[Serializable]

public class Email
{
public Email()
{
    this.Attachments = new List<Attachment>();
}
public int MessageNumber { get; set; }
public string From { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
public DateTime DateSent { get; set; }
public List<Attachment> Attachments { get; set; }
}

[Serializable]
public class Attachment
{
public string FileName { get; set; }
public string ContentType { get; set; }
public byte[] Content { get; set; }
}

0 个答案:

没有答案