چه تکنولوژی می‌خواهید یاد بگیرید؟

نظرات و انتقادات خود را با ما در میان بگذارید

آپدیت روزانه

بیش از 1500 مطلب آموزشی

نیازهای روز

استفاده از سرویس Zender جهت ارسال ایمیل نامحدود

در این مقاله با نحوه ارسال ایمیل نامحدود بدون پیکربندی SMTP با استفاده از سرویس Zender آشنا خواهید شد. سرویس رایگان Zender جهت ارسال ایمیل، پیاده سازی شده با Web API برای برنامه‌نویسان و استفاده از این سرویس به صورت رایگان امکان پذیر است.

آموزش استفاده از سرویس:

در اولین گام لازم است بسته مربوطه را با استفاده از Nuget نصب کنید.

PM> install-package Zender.Mail

سپس ثبت ایمیل و دریافت API Key، برای ثبت نام و دریافت API Key اینجا کلیک کنید.

کد ارسال ایمیل:

using System.Net.Mail;
using Zender.Mail;

namespace Zender
{
    class Program
    {
        static void Main(string[] args)
        {
            ZenderMessage message = new ZenderMessage("d2e73be1-02b1-47b5-9f18-8795daae7b60");
            MailAddress from = new MailAddress("omid.nasri@outlook.com");
            MailAddress to = new MailAddress("omid8nasri@gmail.com");
            message.From = from;
            message.To.Add(to);
            message.Subject = "Welcome!";
            message.Body = "For Test.";
            message.IsBodyHtml = true;
            message.SendMailAsync();
        }
    }
}

همچنین برای اعمال تغییرات در کلاس ZenderMessage می‌توانید از کد زیر برای ارسال ایمیل استفاده کنید:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Mail;
using System.Threading.Tasks;

namespace Zender.Mail
{
  public class ZenderMessage
  {
    private Dictionary<string, MemoryStream> _streamedAttachments = new Dictionary<string, MemoryStream>();
    private string _apiKey;

    public string Subject { get; set; }

    public string Body { get; set; }

    public MailAddress From { get; set; }

    public List<MailAddress> To { get; set; }

    public List<MailAddress> Bcc { get; set; }

    public List<MailAddress> CC { get; set; }

    public bool IsBodyHtml { get; set; }

    public List<byte[]> Attachments { get; set; }

    public Dictionary<string, MemoryStream> StreamedAttachments
    {
      get
      {
        return this._streamedAttachments;
      }
      set
      {
        this._streamedAttachments = value;
      }
    }

    public ZenderMessage(string apiKey)
    {
      if (string.IsNullOrEmpty(apiKey))
        throw new Exception("API Key cannot be null or empty");
      this._apiKey = apiKey;
      this.To = new List<MailAddress>();
      this.Bcc = new List<MailAddress>();
      this.CC = new List<MailAddress>();
      this.Attachments = new List<byte[]>();
    }

    public void SendMailAsync()
    {
      this.SendMailTaskAsync().Wait();
    }

    public void AddAttachment(Stream stream, string name)
    {
      MemoryStream memoryStream = new MemoryStream();
      stream.CopyTo((Stream) memoryStream);
      memoryStream.Seek(0L, SeekOrigin.Begin);
      this.StreamedAttachments[name] = memoryStream;
    }

    private async Task SendMailTaskAsync()
    {
      using (HttpClient httpClient = new HttpClient())
      {
        httpClient.BaseAddress = new Uri("http://zender.sharptag.com");
        MultipartFormDataContent content = new MultipartFormDataContent();
        this.AttachFormParams(this, content);
        this.AttachFiles(this, content);
        HttpResponseMessage response = httpClient.PostAsync("/api/mail/post", (HttpContent) content).Result;
        if (response.IsSuccessStatusCode)
        {
          string resultContent = await response.Content.ReadAsStringAsync();
        }
      }
    }

    private void AttachFormParams(ZenderMessage message, MultipartFormDataContent content)
    {
      foreach (KeyValuePair<string, string> keyValuePair in this.FetchFormParams(message))
        content.Add((HttpContent) new StringContent(keyValuePair.Value), keyValuePair.Key);
    }

    private void AttachFiles(ZenderMessage message, MultipartFormDataContent content)
    {
      foreach (KeyValuePair<string, MemoryStream> keyValuePair in this.FetchStreamingFileBodies(message))
      {
        StreamContent streamContent = new StreamContent((Stream) keyValuePair.Value);
        streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
        {
          Name = "files[" + Path.GetFileName(keyValuePair.Key) + "]",
          FileName = Path.GetFileName(keyValuePair.Key)
        };
        streamContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");
        content.Add((HttpContent) streamContent);
      }
    }

    private IEnumerable<KeyValuePair<string, MemoryStream>> FetchStreamingFileBodies(ZenderMessage message)
    {
      return (IEnumerable<KeyValuePair<string, MemoryStream>>) Enumerable.ToList<KeyValuePair<string, MemoryStream>>(Enumerable.Select<KeyValuePair<string, MemoryStream>, KeyValuePair<string, MemoryStream>>((IEnumerable<KeyValuePair<string, MemoryStream>>) message.StreamedAttachments, (Func<KeyValuePair<string, MemoryStream>, KeyValuePair<string, MemoryStream>>) (kvp => kvp)));
    }

    private List<KeyValuePair<string, string>> FetchFormParams(ZenderMessage message)
    {
      return new List<KeyValuePair<string, string>>()
      {
        new KeyValuePair<string, string>("APIKey", this._apiKey),
        new KeyValuePair<string, string>("To", string.Join(",", Enumerable.Select<MailAddress, string>((IEnumerable<MailAddress>) message.To, (Func<MailAddress, string>) (x => x.Address)))),
        new KeyValuePair<string, string>("Bcc", string.Join(",", Enumerable.Select<MailAddress, string>((IEnumerable<MailAddress>) message.Bcc, (Func<MailAddress, string>) (x => x.Address)))),
        new KeyValuePair<string, string>("CC", string.Join(",", Enumerable.Select<MailAddress, string>((IEnumerable<MailAddress>) message.CC, (Func<MailAddress, string>) (x => x.Address)))),
        new KeyValuePair<string, string>("From", message.From.Address),
        new KeyValuePair<string, string>("FromName", message.From.DisplayName),
        new KeyValuePair<string, string>("Subject", message.Subject),
        new KeyValuePair<string, string>("Body", message.Body),
        new KeyValuePair<string, string>("IsBodyHtml", message.IsBodyHtml.ToString())
      };
    }
  }
}

مآخذ:

امید نصری