دریافت و خواندن پیغام های ایمیل با پیوست از سرور پست الکترونیکی GMAIL POP3 در ASP.Net
با سلام در این مقاله نحوه خواندن ایمیل ها را از سرور ایمیل POP3 با استفاده از open source کتابخانه OpenPop.Net توضیح خواهیم داد . این کتابخانه API برای دسترسی و خواندن ایمیل ها از سرورهای Mail POP3 را فراهم می کند. برای این مقاله از Gmail Mail POP3 استفاده خواهم کرد
دانلود OpenPop.Net
شما می توانید OpenPop.Net را با استفاده از لینک دانلود زیر دانلود کنید
دانلود OpenPop.Net
کد HTML
در اینجا از کنترل GridView برای نمایش پیام های ایمیل استفاده کرده ایم. بدنه ایمیل را در یک HTML SPAN پنهان نگه میداریم چون بعد از استفاده از محاوره ی جی کوئری برای نشان دادن بدنه زمانی که موضوع کلیک شود استفاده می شود.
<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>
فضاهای نام
شما باید فضای نامهای زیر را وارد کنید
C #
using OpenPop.Pop3;
using OpenPop.Mime;
using System.Linq;
VB.Net
Imports OpenPop.Pop3
Imports OpenPop.Mime
Imports System.Linq
کلاس ویژگی سفارشی برای نگه داشتن پیام های ایمیل
شما باید یک کلاس ویژگی های سفارشی زیر ایجاد کنید که هدف آن برای نگه داشتن پیام ایمیل محرمانه است. دو کلاس برای پیام ایمیل و یکی برای پیوست ایجاد کرده ایم.
C #
[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; }
}
VB.Net
<Serializable()> _
Public Class Email
Public Sub New()
Me.Attachments = New List(Of Attachment)()
End Sub
Public Property MessageNumber() As Integer
Get
Return m_MessageNumber
End Get
Set(value As Integer)
m_MessageNumber = Value
End Set
End Property
Private m_MessageNumber As Integer
Public Property From() As String
Get
Return m_From
End Get
Set(value As String)
m_From = Value
End Set
End Property
Private m_From As String
Public Property Subject() As String
Get
Return m_Subject
End Get
Set(value As String)
m_Subject = Value
End Set
End Property
Private m_Subject As String
Public Property Body() As String
Get
Return m_Body
End Get
Set(value As String)
m_Body = Value
End Set
End Property
Private m_Body As String
Public Property DateSent() As DateTime
Get
Return m_DateSent
End Get
Set(value As DateTime)
m_DateSent = Value
End Set
End Property
Private m_DateSent As DateTime
Public Property Attachments() As List(Of Attachment)
Get
Return m_Attachments
End Get
Set(value As List(Of Attachment))
m_Attachments = Value
End Set
End Property
Private m_Attachments As List(Of Attachment)
End Class
<Serializable()> _
Public Class Attachment
Public Property FileName() As String
Get
Return m_FileName
End Get
Set(value As String)
m_FileName = Value
End Set
End Property
Private m_FileName As String
Public Property ContentType() As String
Get
Return m_ContentType
End Get
Set(value As String)
m_ContentType = Value
End Set
End Property
Private m_ContentType As String
Public Property Content() As Byte()
Get
Return m_Content
End Get
Set(value As Byte())
m_Content = Value
End Set
End Property
Private m_Content As Byte()
End Class
توجه :
این کلاس ها را به عنوان Serializable مشخص کرده ایم، زیرا پیام های ایمیل محرمانه را در یک متغیر ViewState برای ذخیره داده ها در PostBacks ذخیره می کنیم.
دریافت پیام های ایمیل از سرور ایمیل POP3 و اتصال آنها به GridView
کد زیر برای فرستادن پیام های ایمیل از سرور ایمیل POP3 GMAIL است.
1. به سرور ایمیل POP3 با استفاده از نام کاربری و رمز عبور GMAIL وصل میشویم.
2. هنگامی که متصل میشوید، به دنبال گرفتن سه پیام اخیر ایمیل بالا و آنها به ویژگی املا ViewState اضافه کنید نوع آن از کلاس ویژگی سفارشی است. ایمیلی که قبلا ایجاد کردیم
3. در حالی که حلقه را اجرا می کنیم، بررسی می کنیم که آیا در ایمیل وجود دارد و اگر پیامی وجود داشته باشد، پیوست ها را نیز اضافه می کنیم. املاء پیوست ها از کلاس ایمیل که نوع کلاس ویژگی سفارشی است که قبلا ایجاد کرده ایم.
C #
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("youremail@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 > 2)
{
break;
}
}
gvEmails.DataSource = this.Emails;
gvEmails.DataBind();
}
VB.Net
Protected Property Emails() As List(Of Email)
Get
Return DirectCast(ViewState("Emails"), List(Of Email))
End Get
Set(value As List(Of Email))
ViewState("Emails") = value
End Set
End Property
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
If Not IsPostBack Then
Me.Read_Emails()
End If
End Sub
Private Sub Read_Emails()
Dim pop3Client As Pop3Client
If Session("Pop3Client") Is Nothing Then
pop3Client = New Pop3Client()
pop3Client.Connect("pop.gmail.com", 995, True)
pop3Client.Authenticate("youremail@gmail.com", "password", AuthenticationMethod.TryBoth)
Session("Pop3Client") = pop3Client
Else
pop3Client = DirectCast(Session("Pop3Client"), Pop3Client)
End If
Dim count As Integer = pop3Client.GetMessageCount()
Me.Emails = New List(Of Email)()
Dim counter As Integer = 0
For i As Integer = count To 1 Step -1
Dim message As Message = pop3Client.GetMessage(i)
Dim email As New Email()
email.MessageNumber = i
email.Subject = message.Headers.Subject
email.DateSent = message.Headers.DateSent
email.From = String.Format("<a href = 'mailto:{1}'>{0}</a>", message.Headers.From.DisplayName, message.Headers.From.Address)
Dim body As MessagePart = message.FindFirstHtmlVersion()
If body IsNot Nothing Then
email.Body = body.GetBodyAsText()
Else
body = message.FindFirstPlainTextVersion()
If body IsNot Nothing Then
email.Body = body.GetBodyAsText()
End If
End If
Dim attachments As List(Of MessagePart) = message.FindAllAttachments()
For Each attachment As MessagePart In attachments
Dim attachmentObj As New Attachment
attachmentObj.FileName = attachment.FileName
attachmentObj.ContentType = attachment.ContentType.MediaType
attachmentObj.Content = attachment.Body
email.Attachments.Add(attachmentObj)
Next
Me.Emails.Add(email)
counter += 1
If counter > 2 Then
Exit For
End If
Next
gvEmails.DataSource = Me.Emails
gvEmails.DataBind()
End Sub
تصاویر زیر نشان می دهد که GridView محدود به پیام های ایمیل محرمانه است و فایل های پیوست ایمیل نمایش داده می شوند.

اتصال ضمیمه های ایمیل به Repeater در GridView
از کنترل Repeater در داخل TemplateField از GridView برای پیوست ایمیل استفاده میکنیم. یک Repeater در رویداد OnRowDataBound از GridView پیوند می دهیم .
C #
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();
}
}
VB.Net
Protected Sub OnRowDataBound(sender As Object, e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
Dim rptAttachments As Repeater = TryCast(e.Row.FindControl("rptAttachments"), Repeater)
Dim attachments As List(Of Attachment) = Me.Emails.Where(Function(email) email.MessageNumber = Convert.ToInt32(gvEmails.DataKeys(e.Row.RowIndex).Value)).FirstOrDefault().Attachments
rptAttachments.DataSource = attachments
rptAttachments.DataBind()
End If
End Sub
دانلود پیام پیوست ایمیل
هنگامی که نام فایل ضمیمه کلیک می شود، رویداد handler زیر را اجرا می کند که پیوست را از ایمیل PropertyState می گیرد و سپس آن را برای دانلود ارسال می کند.
C #
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();
}
VB.Net
Protected Sub Download(sender As Object, e As EventArgs)
Dim lnkAttachment As LinkButton = TryCast(sender, LinkButton)
Dim row As GridViewRow = TryCast(lnkAttachment.Parent.Parent.NamingContainer, GridViewRow)
Dim attachments As List(Of Attachment) = Me.Emails.Where(Function(email) email.MessageNumber = Convert.ToInt32(gvEmails.DataKeys(row.RowIndex).Value)).FirstOrDefault().Attachments
Dim attachment As Attachment = attachments.Where(Function(a) a.FileName = lnkAttachment.Text).FirstOrDefault()
Response.AddHeader("content-disposition", "attachment;filename=" + attachment.FileName)
Response.ContentType = attachment.ContentType
Response.BinaryWrite(attachment.Content)
Response.End()
End Sub
مشاهده کادر پیام ایمیل Body Client Side با استفاده از jQuery UI Dialog
Client side زمانی که موضوع را کلیک می کنید، کلید رویداد handler را کلیک کنید. این ایمیل، Subject، Body و Attachments را دریافت می کند و آن را در کادر محاوره jQuery UI نمایش می دهد که در تصویر زیر نشان داده شده است
<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>
