شاید برای شما به عنوان برنامه نویس، پیش آمده باشد که بخواهید از برنامه خود یک یا چند ایمیل به کابران ارسال کنید. آیا تا به حال نیاز داشتهاید بدانید آیا ایمیل ارسالی، توسط کاربر باز شدهاست یا خیر؟ چند نفر ایمیل شما را خواندهاند؟ چه زمانی ایمیل را باز کردهاند؟ و ...
برای این کار روش استاندارد و مستقیمی وجود ندارد؛ اما با استفاده از بعضی از روشها مانند ارسال عکس مخفی، برخی تگهایی که یک آدرس را فراخوانی میکنند (مانند bgsound)، کلیک روی لینک و یا ترکیبی از چند روش میتوان تا حدود زیادی به اهداف فوق رسید.
روشی که بررسی خواهیم کرد، مبتنی بر ارسال عکس بوده و برای شروع، به یک عکس بسیار کوچک (1X1) با حجم کم و غیرقابل دید (Transparent) نیاز داریم که میتوانید یکی از آنها را از این آدرس انتخاب کنید. در این روش به همراه ایمیل، این عکس را ارسال خواهیم کرد (در تگ img). عکس باید بگونهای باشد که ظاهر ایمیل را تحت تأثیر قرار ندهد و آدرس عکس باید طوری تنظیم شود که به برنامه ما یک درخواست را ارسال کند و برنامه با توجه به درخواست ارسال شده، عملیات لازم را انجام دهد.
مثالی از عکسی که باید ارسال شود:
<img src='http://www.example.com/1x1.gif' style='width:1px;height:1px;'>
برای شروع یک برنامهی ASP.NET Core را ایجاد کرده و مراحل ارسال ایمیل را طی نمایید:
private bool SendEmail(string mail_to, string mail_subject, string mail_body) { bool result = false; try { SmtpClient client = new SmtpClient("smtp.gmail.com"); client.UseDefaultCredentials = false; client.EnableSsl = true; client.Port = 587; client.Credentials = new NetworkCredential("from@mail.com", "your_gmail_password");
MailMessage mailMessage = new MailMessage(); mailMessage.From = new MailAddress("from@mail.com"); mailMessage.To.Add(mail_to); mailMessage.Body = mail_body; mailMessage.Subject = mail_subject; client.Send(mailMessage); result = true; } catch (Exception ex) { result = false; } return result; }
public IActionResult SendEmailWithTransparentImage() { var email_body = "your_email_body"; var imageUrl = Url.Action("ImageRequestFromEmail", "Home", new {user_id=12345}, protocol: Url.ActionContext.HttpContext.Request.Scheme); var imageTag = $"<img src='{imageUrl}' style='width:1px;height:1px;'>"; email_body += imageTag; var result = SendEmail("to@email.com", "test image", email_body); return View(result); }
سپس اکشن متد پاسخ به درخواست عکس از طرف سرویس دهنده ایمیل را ایجاد نمایید:
[Route("1x1.gif")] public IActionResult ImageResponse() { //درخواست عکس ارسال شده و اینجا باید عملیات دلخواه را انجام دهیم var emailOpenDate = DateTime.Now; //سپس عکس را در جواب درخواست ارسال میکنیم byte[] imagegBytes = Convert.FromBase64String("R0lGODlhAQABAAAAACH5BAEAAAAALAAAAAABAAEAAAI="); return File(imagegBytes, "image/gif"); }
بدیهی است میتوان یک سری کوئری استرینگ را برای بهتر شدن فرآیند، به آدرس عکس مورد نظر اضافه کرد:
<img src='http://www.example.com/1x1.gif?user_id=12345' style='width:1px;height:1px;'>
در این صورت باید تغییراتی را در کدها لحاظ کنیم:
در اکشن SendEmailWithTransparentImage :
var imageUrl = Url.Action("ImageResponse, "Home", new {user_id=12345},protocol: Url.ActionContext.HttpContext.Request.Scheme);
و امضای اکشن ImageResponseرا بهصورت زیر تغییر میدهیم:
public IActionResult ImageResponse(int user_id)
استفاده از عکسهای کوچک به علت سربار کم و پشتیبانی مرورگرها، بسیار مرسوم بوده و بسیاری از آنالیزورهای سایت مانند google analytics، سایتهای ارسال انبوه ایمیل و ... برای رهگیری رفتار کاربران از این روش استفاده میکنند.
برای مثال اگر در همین سایت Developer Tools مرورگر را باز کنید و صفحه را رفرش کنید در تب Network، با کمی دقت عکسی با کوئری استرینگ پیچیده خواهید یافت که مربوط به google analyticsاست و تقریبا تمام اطلاعات مورد نیاز خود در رابطه با رفتار کاربران در سایت جاری را با استفاده از این روش جمع آوری میکند.