محتویات سایت
        برچسب های محبوب 








 
   ارسال ایمیل، بررسی راهکار ها و چالش ها
  در این مقاله به بررسی جوانب مختلف ارسال ایمیل و مشکلات پیش روی آن می پردازم.
   C#
   ۲۵۴۷۶
   این مقاله حاوی فایل ضمیمه نمی باشد
   مرتضی صحراگرد
   ۱۳۸۷/۹/۲۲
نسخه قابل چاپ نسخه قابل چاپ

مقدمه :

ارسال ایمیل یکی از ساده ترین اعمال در #C می باشد. ولی اگر توقع شما کمی بیش از ارسال یک ایمیل ساده باشد، گاهی ریزه کاری ها و ملاحظاتی وجود دارند که رعایت نکردن آن ها باعث هدر شدن وقت و منابع و غیره می گردد.

اهمیت این نکات در سیستم های مبتنی بر ارسال ایمیل مانند خبرنامه ها، ارزش چندین برابری پیدا خواهند نمود.

قصد دارم در این مقاله به بررسی جوانب مختلف ارسال ایمیل بپردازم. به طوری که مطالب مطرح شده در این مقاله اکثر نیاز های برنامه نویسان را پوشش دهد و در صورتی که مطلبی از قلم افتاده بود، در آینده آن را بروز رسانی خواهم نمود.

آغاز :

قبل از انتشار DotNet Framework 2.0 برای ارسال ایمیل از فضای نامی System.Web.Mail استفاده می شد ولی پس از انتشار آن، فضای نامی System.Net.Mail معرفی شد که به نحو بسیار ساده و قدرتمند تری عمل می کند.

قبل از شروع به کد نویسی به یاد داشته باشید که حتما فضای نامی System.Net.Mail را به شکل زیر به بالای کلاس خود اضافه نمایید.

using System.Net.Mail;

ارسال یک ایمیل ساده در زبان #C به شکل زیر می باشید.

MailMessage message = new MailMessage("from@test.com", "to@test.com");

message.BodyEncoding = System.Text.Encoding.UTF8;

message.SubjectEncoding = System.Text.Encoding.UTF8;

message.Subject = "در این قسمت عنوان ایمیل قرار می گیرد";

message.Body = "در این قسمت متن اصلی ایمیل قرار می گیرد";

message.IsBodyHtml = true;

 

SmtpClient smtpClient = new SmtpClient("Your IP Address");

smtpClient.Send(message);

نحوده عملکرد قطعه کد بالا بسیار واضح می باشد. برای ارسال ایمیل از دو کلاس مهم موجود در فضای نامی System.Net.Mail به نام های MailMessage و SmtpClient استفاده شده است.

کلاس MailMessage مشخصات ایمیلی را که قرار است ارسال شود را نگهداری می کند و با استفاده از کلاس SmtpClient هم مشخصات آدرس سرور و پورت SMTP و سایر مشخصات لازم سروری که قرار است با استفاده از آن به ارسال ایمیل بپردازیم را تعیین می کنیم.

در مثال بالا ما به سازنده (Constructor) کلاس MailMessage دو پارامتر را ارسال نموده ایم. اولین پارامتر ایمیل فرستنده می باشد و پارامتر دوم ایمیل گیرنده.

در صورتی که بخواهیم به قسمت گیرنده (در حقیقت قسمت To) ایمیل های دیگری را اضافه کنیم، با استفاده از message.To.Add این کار را انجام خواهیم داد.

اضافه کردن ایمیل به Bcc و CC نیز به شکل مشابهی خواهد بود یعنی با استفاده از message.Bcc.Add ایمیل ها را به در یافت کنند گان رونوشت ایمیل یعنی Bcc اضافه می کنیم و با استفاده از message.CC.Add ایمیل ها را به CC اضافه خواهیم کرد.

استفاده از موارد فوق مشابه قطعه کد زیر خواهد بود.

MailMessage message = new MailMessage("from@test.com", "to@test.com");

message.BodyEncoding = System.Text.Encoding.UTF8;

message.SubjectEncoding = System.Text.Encoding.UTF8;

message.Subject = "در این قسمت عنوان ایمیل قرار می گیرد";

message.Body = "در این قسمت متن اصلی ایمیل قرار می گیرد";

message.IsBodyHtml = true;

 

message.To.Add("to2@test.com");

message.Bcc.Add("Bcc@test.com");

message.CC.Add("cc@test.com");

 

SmtpClient smtpClient = new SmtpClient("Your IP Address");

smtpClient.Send(message);

در قطع کد های بالا ما message.IsBodyHtml = true انتخاب نموده ایم تا بتوانیم از عناصر HTML در متن ایمیل خود استفاده نماییم.

ارسال ایمیل با استفاده از IIS :

در مثال های قبلی ما از آدرس IP یک سرور خارجی جهت ارسال ایمیل استفاده نموده ایم ولی این عمل را می توانیم با استفاده از IIS سیستم خودمان انجام دهیم. برای انجام این کار باید آدرس IP سرور را 127.0.0.1 انتخاب نموده و مقدار PickupDirectoryFromIis را به صفت DeliveryMethod کلاس SmtpClient نسبت دهیم. این اعمال را در قطعه کد زیر مشاهده می نمایید.

MailMessage message = new MailMessage("from@test.com", "to@test.com");

message.BodyEncoding = System.Text.Encoding.UTF8;

message.SubjectEncoding = System.Text.Encoding.UTF8;

message.Subject = "در این قسمت عنوان ایمیل قرار می گیرد";

message.Body = "در این قسمت متن اصلی ایمیل قرار می گیرد";

message.IsBodyHtml = true;

 

SmtpClient smtpClient = new SmtpClient("127.0.0.1");

smtpClient.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;

smtpClient.Send(message);

دقت کنید که ارسال ایمیل با استفاده از IIS می تواند با تاخیر فراوان همراه باشد و ضمنا امکان SPAM شناخته شدن این گونه ایمیل ها بسیار بالا می باشد. لذا استفاده از این روش توصیه نمی شود.

ارسال ایمیل با استفاده Credential :

اگر به قطعه کدهای ابتدای مقاله دقت کنید، متوجه خواهید شد که برای ارسال ایمیل، ما فقط نیاز داشتیم که آدرس IP یک سرور معتبر را داشته باشیم. این قابلیت می تواند باعث سوء استفاده افرادی که قصد دارند ایمیل های تجاری ، تبلیغاتی، جعلی و غیره بفرستند، شود.

لذا برای استفاده از سرور های معتبر جهت ارسال ایمیل، باید احراز هویت خود را انجام دهید. این احراز هویت توسط نام کاربری و رمز عبور صورت می گیرد. با استفاده از این روش، شما تنها زمانی می توانید با استفاده از From@test.com ایمیل ارسال کنید که حتما صاحب این ایمیل بوده و رمز عبور آن را نیز در اختیار داشته باشید.

نحوه احراز هویت را قطعه کد زیر به صورت بولد شده مشاهده می نمایید.

MailMessage message = new MailMessage("From@test.com", "to@test.com");

message.BodyEncoding = System.Text.Encoding.UTF8;

message.SubjectEncoding = System.Text.Encoding.UTF8;

message.Subject = "در این قسمت عنوان ایمیل قرار می گیرد";

message.Body = "در این قسمت متن اصلی ایمیل قرار می گیرد";

message.IsBodyHtml = true;

 

SmtpClient smtpClient = new SmtpClient("Your IP Address");

smtpClient.Credentials = new System.Net.NetworkCredential("from@test.com", "FromPassword");

smtpClient.Send(message);

نمایش نام مناسب فرستنده در ایمیل گیرنده :

اگر با استفاده از روش هایی که تا کنون ذکر کردم، اقدام به ارسال ایمیل نمایید، گیرنده ایمیل، نامه شما را به شکل زیر در صفحه اول Inbox خود خواهد دید.

(این ایمیل توسط info[at]30sharp.com به سرور Gmail ارسال شده است)

همانطور که ملاحظه می کنید در قسمت نام فرستنده، کلمه info ذکر شده است. در حقیقت با روش هایی که تا کنون ذکر شده است، نام قبل از علامت "@" ایمیل فرستنده به عنوان نام فرستنده در نظر گرفته می شود.

قطعا این نام مطلوب شما نمی باشد و بهتر است نام مناسبی اینجا ذکر شود.

برای انجام این کار، تغییرات زیر باید انجام شود. (تغییرات جدید را به صورت بولد شده ملاحظه می کنید)

MailMessage message = new MailMessage("I am 30sharp.com<info@test.com>", "to@test.com");

message.BodyEncoding = System.Text.Encoding.UTF8;

message.SubjectEncoding = System.Text.Encoding.UTF8;

message.Subject = "در این قسمت عنوان ایمیل قرار می گیرد";

message.Body = "در این قسمت متن اصلی ایمیل قرار می گیرد";

message.IsBodyHtml = true;

 

SmtpClient smtpClient = new SmtpClient("Your IP Address");

smtpClient.Send(message);

پس از اعمال تغییرات فوق، ایمیل شما هنگام دریافت به شکل زیر مشاهده می شود.

ارسال فایل ضمیمه همراه ایمیل :

برای ارسال فایل ضمیمه همراه ایمیل باید از کلاس Attachment استفاده کنیم. در قطعه کد زیر نحوه استفاده از این کلاس را به شکل بولد ملاحظه می کنید.

MailMessage message = new MailMessage("from@test.com", "to@test.com");

message.BodyEncoding = System.Text.Encoding.UTF8;

message.SubjectEncoding = System.Text.Encoding.UTF8;

message.Subject = "در این قسمت عنوان ایمیل قرار می گیرد";

message.Body = "در این قسمت متن اصلی ایمیل قرار می گیرد";

message.Attachments.Add(new Attachment(Server.MapPath("~/Files/MyFile.zip")));

message.IsBodyHtml = true;

 

SmtpClient smtpClient = new SmtpClient("Your IP Address");

smtpClient.Send(message);

همانطور که ملاحظه می کنید، در قطعه کد بالا من فرض نموده ام که فایلی که قرار است به عنوان ضمیمه ارسال شود در داخل فولدر Files در ریشه سایت قرار دارد.

ارسال ایمیل به شکل انبوه :

هنگام نوشتن سیستم هایی مانند خبرنامه، ارسال درست و مناسب ایمیل اهمیت بسیار زیادی دارد. عدم رعایت برخی نکات باعث از کار افتادن سیستم و تبدیل شدن سرور شما به SPAM و مشکلات دیگری خواهد شد.

در زیر برخی نکات مهم را ملاحظه می کنید.

  •  در بسیاری از موارد مشاهده می شود که برنامه نویسان ایمیل های گیرنده را به تعداد زیاد به قسمت To اضافه می کنند. این عمل باعث می شود که هر شخصی که این ایمیل را دریافت می کند، ایمیل سایر دریافت کنندگان را نیز مشاهده کند که این امر باعث سوء استفاده برخی افراد می شود. لذا پیشنهاد می شود که در اینگونه مواقع، ایمیل ها را به قسمت Bcc اضافه نمایند.

  • در برخی مواقع نیاز است که ایمیل به تعداد بسیار زیادی از افراد ارسال شود. این عمل معمولا با استفاده از یک حلقه (Loop) ایجاد می شود. ذکر این نکته ضروری می باشد که ارسال ایمیل یک عمل هزینه بر برای سرور می باشد و ارسال تعداد بسیار زیادی ایمیل با استفاده از این روش می تواند باعث اختلال کار سرور و حتی از کار افتادن آن شود. برای رفع این مشکل نیاز است که پس از ارسال تعداد معینی ایمیل، به میزان مناسبی تاخییر ایجاد کنیم و سپس مجددا ارسال را آغاز نماییم.

  • اگر ایمیل با فرمت نادرستی در دیتابیس ذخیره شده باشد، هنگامی که قصد داریم آن را به To یا Bcc یا CC اضافه کنیم یک خطا ایجاد نموده و از برنامه خارج می شود. در نتیجه اگر ما در حال ارسال ایمیل به شکل گروهی بوده باشیم این عمل باعث نا تمام ماندن کار ما می شود.

برای رفع این مشکل معمولا از دو روش استفاده می شود.

1 - در این روش که روش بهتری می باشد، باید قبل از اینکه ایمیل را به To یا Bcc یا CC اضافه کنیم، معتبر بودن آن را کنترل کنیم. این عمل به وسیله یک عبارت منظم انجام می شود.

List<string> lstEmails = GetEmails();

string emailRegEx = @"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$";

foreach (string email in lstEmails)

{

    if (System.Text.RegularExpressions.Regex.IsMatch(email, emailRegEx))

    {

        message.Bcc.Add(email);

    }

}

2 - در روش دوم، قسمت اضافه نمودن ایمیل را در یک try قرار داده و در قسمت catch آن دستور continue را می نویسیم تا در صورتی که خطایی به وجود آمد، به ابتدای حلقه و  سراغ ایمیل برود.

List<string> lstEmails = GetEmails();

foreach (string email in lstEmails)

{

    try

    {

        message.Bcc.Add(email);

    }

    catch

    {

        continue;

    }

}

  • برخی سرور ها جهت ارسال ایمیل های همزمان محدودیت های قائل می شوند. این عمل به این منظور انجام می گیرد که سرور مورد نظر به عنوان SPAMMER شناخته نشود. مثلا اگر تعداد ماکزیمم ایمیل هایی که شما می تواند در یک زمان ارسال کنید 20 عدد باشد، و شما 100 عدد ایمیل را به Bcc اضافه نموده باشید، سرور شما ایمیل ها را بلوکه نموده و ارسال نمی نماید، لذا اهمیت دارد که شما از این امر آگاه باشید.

  • ارسال ایمیل های فروان به سروهای یاهو و جی میل و غیره در فواصل زمانی کم، باعث می شود که سرور شما به عنوان اسپم شناخته شده و ایمیل ها به جای Inbox به قسمت Bulk منتقل شوند. لذا هنگام ارسال ایمیل های انبوه سعی کنید در فواصل زمانی مناسب و به تعداد مناسبی ایمیل ارسال کنید.

  • ارسال ایمیل عملی زمانگیر می باشد و اگر قرار باشد تعداد زیادی ارسال شود، بدیهی است که زمانبر تر خواهد بود. اگر در حال برنامه نویسی تحت وب و با ASP.NET هستید به یاد داشته باشید که به طور پیشفرض اگر زمان اجرای دستورات شما بیش از 90 ثانیه باشد، برنامه یک خطای Timeout می دهد و در نتیجه اگر در حال ارسال ایمیل باشید، ارسال ها پس از 90 ثانیه متوقف می شود. لذا برای ارسال ایمیل های انبود باید مدت زمان Timeout را به اندازه مناسبی تغییر دهید. این عمل به شکل زیر در Web.Config انجام می شود.

<httpRuntime executionTimeout="600"/>

در قطعه کد بالا من زمان Timeout را با استفاده از executionTimeout به 600 ثانیه تغییر داده ام.

خوب، تمام شد. در صورتی که شما دوست گرامی احساس می کنید که نکته مهمی از قلم افتاده است، لطفا یادآوری نمایید تا در بروز رسانی های بعدی اعمال شود.

مقالات مرتبط :

موفق و پیروز باشید.