حسین احمدی
بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

آموزش برنامه نویسی شبکه و ارسال ایمیل در سی شارپ

در آموزش سی شارپ و یادگیری زبان برنامه نویسی سی شارپ این روزها برنامه نویسی شبکه یکی از مواردی است که نمی توانید آن را نادیده بگیرید. در این مقاله من قصد دارم به شما آموزش برنامه نویسی شبکه یا Network Programming در سی شارپ را بصورت رایگان در قالب متن آموزش بدهم .

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

امیدوارم که از این آموزش بتوانید نهایت استفاده را ببرید اما اگر می خواهید واقعا یک برنامه نویس سی شارپ حرفه ای بشوید پیشنهاد می کنم ضمن مراجعه به مطالب زیر ، حتما کاملترین دوره آموزش سی شارپ مقدماتی تا پیشرفته که نتیجه تجربیات 20 ساله برنامه نویسی بنده است را تهیه کنید و از برنامه نویسی شبکه ای که در این دوره تدریس شده نیز نهایت بهره را ببرید ، مطالب زیر مکمل این مقاله هستند :

  1. آموزش برنامه نویسی شی گرا در سی شارپ
  2. آموزش برنامه نویسی موازی در سی شارپ
  3. آموزش LINQ در سی شارپ

معرفی کلاس HttpClient

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

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

کلاس های فضای نام System.Net به دو دسته تقسیم می شوند، فضای نام System.Net.Sockets که دسترسی سطح پایین را به عملیات های تحت شبکه در اختیار برنامه نویسی می گذارد و خود فضای نام System.Net که کلاس های سطح بالاتری را در اختیار ما قرار می دهند.

در این مطلب قصد داریم با کلاس HttpClient که در فضای نام System.Net.Http قرار گرفته و برای ارسال درخواست های HTTP و دریافت پاسخ های مبتنی بر آن استفاده می شود آشنا شویم. کلاس HttpClient از کلاس HttpMessageInvoker مشتق شده است که این اجازه را به می دهد تا درخواست ها را به صورت Async ارسال کنیم. به عنوان اولین مثال، در نمونه کد زیر درخواستی به وب سایت ITPro ارسال شده و نتیجه آن را خوانده و در خروجی نمایش می دهیم:

static void Main(string[] args)
{
    GetITProData();
}

public static async void GetITProData()
{
    var httpClient = new System.Net.Http.HttpClient();
    var response = await httpClient.GetAsync("https://tosinso.com");
    var result = await response.Content.ReadAsStringAsync();
    Console.WriteLine(result);
}

همانطور که در کد بالا مشاهده می کنید ابتدا یک شئ از کلاس HttpClient ایجاد کردیم و سپس بوسیله دستور GetAsync درخواستی به سمت آدرس وب سایت ITPro ارسال کردیم، خروجی متد GetAsync شئ ای از نوع HttpResponseMessage است که این شئ خصوصیتی دارد به نام Content، خصوصیت Content از نوع HttpContent است

که می توان بوسیله آن نتیجه ای که برای برگردانده شده را بخوانیم که در مثال بالا بوسیله متد ReadAsStringAsync جواب درخواست ارسال شده به سایت ITPro را در قالب رشته خوانده و در خروجی نمایش می دهیم.دقت کنید که GetAsync با توجه به نوع Reponse ای که سرور به سمت شما برمی گرداند خروجی متفاوتی ایجاد می کند.

برای مثال خروجی کد بالا کدهای HTML خواهد بود، ممکن است شما درخواست را به سمت یک آدرس که نتیجه را در قالب json برمیگرداند ارسال کنید و نتیجه خروجی شما یک عبارت json باشد. ممکن است Reponse ای که برای شما ارسال می شود موفقیت آمیز نباشد، برای بررسی موفق بودن درخواست می توان از خصوصیت IsSuccessStatusCode در کلاس HttpResponseMessage استفاده کنید:

var httpClient = new System.Net.Http.HttpClient();
var response = await httpClient.GetAsync("https://tosinso.com");
if (response.IsSuccessStatusCode)
{
    var result = await response.Content.ReadAsStringAsync();
    Console.WriteLine(result);
}

مشخص کردن Header ها برای ارسال درخواست

گاهی وقت ها برای ارسال درخواست به سمت سرور باید برای درخواست مورد نظر Header هایی را مشخص کرد، برای مثال، فرض کنید که قصد دارید به یک آدرس Api که توسط یک وب سایت ارائه شده یک درخواست ارسال کنید و می بایست به همراه درخواست در قالب Header ها Api Key ای که در اختیار شما قرار گرفته را مشخص کنید. برای مشخص کردن Header برای درخواست ارسالی می توانید از DefaultRequestHeaders استفاده کنید:
var httpClient = new System.Net.Http.HttpClient();
httpClient.DefaultRequestHeaders.Add("ApiKey","{your-api-key}");
var response = await httpClient.GetAsync("https://api.tosinso.com/users/getall");
if (response.IsSuccessStatusCode)
{
    var result = await response.Content.ReadAsStringAsync();
    Console.WriteLine(result);
}

در نمونه کد بالا، فرض شده درخواست به آدرس انتخابی ارسال می شود و در Header درخواست ارسالی یک Header با نام ApiKey اضافه شده. (آدرس نوشته شده فرضیست)برای کلاس HttpClient متدهای دیگری نیز وجود دارد مانند PostAsync که امکان ارسال درخواست ها را در قالب POST امکان پذیر می کند که در یک مطلب جدگانه در مورد ارسال درخواست های POST صحبت خواهیم کرد.

ارسال درخواست Post

در قسمت قبلی یک آشنایی اولیه با کلاس HttpClient پیدا کردیم و یاد گرفتیم که چگونه بوسیله متد GetAsync می توان در خواست هایی را در قالب GET به سمت سرور ارسال کرد و پاسخ آن را دریافت کرد. در کنار درخواست های GET در سی شارپ امکان ارسال در خواست های POST را نیز داریم.

درخواست های POST بیشتر در مواقعی استفاده می شوند که شما قصد دارید یکسری اطلاعات را به سمت سرور ارسال کنید و در سمت سرور عملیاتی بر روی این اطلاعات انجام می شود، مثلاً عملیات ثبت نام در یک وب سایت بوسیله عملیات POST انجام می شود

و کاربر اطلاعاتی را به سمت سرور ارسال کرده و اطلاعات او در بانک اطلاعاتی ذخیره می شود. برای ارسال درخواست های POST در زبان سی شارپ از متد PostAsync در کلاس HttpClient استفاده می کنیم. دقت کنید که این روش از نسخه 4.5 به بعد در دات نت قابل استفاده است. ابتدا یک شئ از کلاس HttpClient ایجاد می کنیم:

var httpClient = new System.Net.Http.HttpClient();

در قدم بعدی یک Dictionary برای اطلاعاتی که باید ارسال شوند ایجاد می کنیم. همانطور که اطلاع دارید برای ارسال درخواست های POST در صفحات وب می بایست یک Form ایجاد شود که این فرم در زمان ارسال به سمت سرور حاوی یک سری مقادیر به صورت Key Value Pair است

که Key یا کلید نام مقدار ورودی و Value مقداری است که کاربر وارد کرده. برای مثال، در فرم ثبت نام که کاربر اطلاعاتی مانند نام کاربری، کلمه عبور و پست الکترونیکی را ارسال می کند این اطلاعات در قالب یک فرم که حاوی اطلاعات به صورت زیر است ارسال می شود:

Username=ITPro;Password=123;Email=test@tosinso.com

برای مشخص کردن مقادیر Form برای ارسال درخواست پست یک Dictionary حاوی مقادیر مورد نظر ایجاد می کنیم:

var httpClient = new System.Net.Http.HttpClient();
var formValues = new Dictionary<string, string>()
{
    ["Username"] = "ITPro",
    ["Password"] = "123",
    ["Email"] = "test@tosinso.com"
};

در قدم بعدی با ایجاد یک شئ از روی FormUrlEncodedContent دیکشنری ایجاد شده را به سازنده آن ارسال کرده و بوسیله متد PostAsync و به صورت زیر درخواست POST را ارسال می کنیم:

var httpClient = new System.Net.Http.HttpClient();
var formValues = new Dictionary<string, string>()
{
    ["Username"] = "ITPro",
    ["Password"] = "123",
    ["Email"] = "test@tosinso.com"
};
var formCollection = new FormUrlEncodedContent(formValues);
var response = await httpClient.PostAsync("https://domain.com/register", formCollection);
if (response.IsSuccessStatusCode)
{
    // write your code here
}

همانطور که مشاهده می کنید بوسیله کد بالا به راحتی می توان در خواست های POST را به راحتی به سمت یک سرور ارسال کرد، به همین خاطر فراموش نکنید که حتماً در فرم هایی که حساس هستند و امکان حمله به سمت آن ها وجود دارد حتماً از Captcha استفاده کنید.

کلاس Uri و UriBuilder

در دات نت و البته زبان سی شارپ دو کلاس برای کار با URI وجود دارد. کلاس های Uri و UriBuilder. کلاس اول، یعنی کلاس Uri این امکان را به شما می دهد تا یک آدرس را به آن بدهید و بخش های مختلف آن را به صورت جداگانه استخراج کنید (دقت کنید که این کلاس ها در فضای نام System قرار دارند). به عنوان مثال، در کد زیر آدرسی استفاده شده و بخش های مختلف این آدرس استخراج شده است:

Uri uri = new Uri("https://programming.tosinso.com:1120/articles?page=2&sort=nto");

Console.WriteLine(uri.Scheme); // https
Console.WriteLine(uri.Host); // programming.tosinso.com
Console.WriteLine(uri.Port); // 11120
Console.WriteLine(uri.Query); // ?page=2&sort=nto
Console.WriteLine(uri.AbsolutePath); // /articles

خروجی هر بخش به صورت Comment در مقابل همان خط نوشته شده است. پس متوجه شدیم که بوسیله کلاس Uri می توان یک آدرس URI را به بخش های مختلف تجزیه کرد و اطلاعات مورد نظر را از آن به دست آورد. کلاس دیگری که در این بخش با آن آشنا می شویم، کلاس UriBuilder است که برای ایجاد کردن آدرس های URI از آن استفاده می شود:

UriBuilder uriBuilder = new UriBuilder();

uriBuilder.Scheme = "https";
uriBuilder.Host = "programming.tosinso.com";
uriBuilder.Port = 1120;
uriBuilder.Path = "/articles";
uriBuilder.Query = "page=20";

Console.WriteLine(uriBuilder.Uri); // https://programming.tosinso.com:1120/articles?page=20

همانطور که مشاهده می کنید برعکس کلاس Uri که ما یک آدرس کامل را میدادیم و بخش های مختلف آن را استخراج می کردیم، بوسیله کلاس UriBuilder و مشخص کردن بخش های مختلف، می توانیم آدرس کامل را ایجاد کنیم.

کار با IP و DNS

در محیط اینترنت و شبکه تمامی سرور ها و همچنین کلاینت به وسیله آدرسی به نام IP شناخته می شوند. در کنار IP یک نام دیگر نیز استفاده می شود که به آن Host Name یا Domain Name گفته می شود و هر Host Name به یک آدرس IP اشاره می کند.

ارتباط HostName یا Domain Name را با IP مثل یک دفترچه تلفن می توان در نظر گرفت که نام هر شخص یک شماره تلفن مختص به خود را دارد و از روی نام شخص می توان شماره تماس آن شخص را پیدا کرد، Domain Name هم به همین صورت است و بوسیله نام Domain می توان آدرس IP یک سرور یا کلاینت را در محیط اینترنت یا شبکه پیدا کرد.

مکانیزمی که بوسیله آن بر اساس نام Domain یا Host آدرس IP یک سیستم را مشخص می کنند DNS یا Domain Name System نام دارد. در این مطلب قصد داریم تا با کلاس هایی آشنا شویم که در زبان سی شارپ برای کار با آدرس های IP و DNS ها استفاده می شوند.

آدرس IP در حال حاضر بر دو نسخه ارائه شده، نسخه 4 یا IPv4 و نسخه 6 یا IPv6. نسخه 4 یک مقدار 32 بیتی است و نسخه 6 یک مقدار 64 بیتی و مشخص است که بوسیله نسخه 6 می توان تعداد بیشتری سرور و کلاینت را در محیط اینترنت و شبکه آدرس دهی کرد.

در دات نت چندین کلاس وجود دارد که بوسیله آن ها می توان با آدرس های IP و Dns کار کرد. یکی از این کلاس ها IPAddress است که در فضای نام System.Net قرار دارد و نشان دهنده یک آدرس IP است. بوسیله این کلاس امکان Parse کردن یک آدرس IP از یک رشته، گرفتن IP در قالب آرایه ای از Byte و همچنین نمایش IP به صورت رشته را خواهیم داشت. در مثال زیر نحوه کار با این کلاس را میبینیم:

var ipAddress = IPAddress.Parse("192.168.1.120");
var ipBytes = ipAddress.GetAddressBytes();
Console.WriteLine(ipAddress.ToString()); // 192.168.1.120

کلاس IPAddress یکسری اعضای static دارد که می توان از آن ها برای برخی کارها استفاده کرد، برای مثال، فیلد Loopback آدرسی که بوسیله آن می توان به سیستمی برنامه بر روی آن در حال اجرا است پیامی ارسال کرد و فیلد Broadcast امکان ارسال پیام ها را به صورت گروهی در محیط شبکه می دهد:

Console.WriteLine(IPAddress.Loopback); // 127.0.0.1
Console.WriteLine(IPAddress.Broadcast); // 255.255.255.255

کلاس دیگری در فضای نام System.Net وجود دارد به نام IPHostEntry که اطلاعات یک Host را برای ما نگهداری می کند. اما قبل از اینکه از این کلاس استفاده کنیم با کلاسی آشنا می شویم به نام Dns، این کلاس یک متد استاتیک با نام GetHostEntry دارد که آدرس یک Host را گرفته و اطلاعات مربوط به به آن Host را در قالب IPHostEntry برای ما بر میگرداند (متد قدیمی برای اینکار Resolve بود که در نسخه های جدید با متد GetHostEntry جایگزین شده است):

IPHostEntry entry = Dns.GetHostEntry("tosinso.com");
Console.WriteLine(entry.HostName);
foreach(var ipAddress in entry.AddressList)
{
    Console.WriteLine(ipAddress);
}

با اجرای کد بالا خروجی زیر را دریافت خواهیم کرد:

tosinso.com
185.8.173.236

کلاس IPHostEntry خصوصیتی دارد با نام AddressList که لیستی از Address های IP مربوط به Host مشخص شده را برای ما بر میگرداند که در نمونه کد بالا بوسیله دستور foreach آدرس های مورد نظر را در خروجی چاپ کردیم.اگر بخواهیم اطلاعات یک Host را بر اساس آدرس IP به دست بیاوریم کافیست به جای نام Host آدرس IP را به صورت زیر مشخص کنیم:

var entry = Dns.GetHostEntry(IPAddress.Parse("185.8.173.236"));
Console.WriteLine(entry.HostName);

کلاس IPAddress زمانی که قصد استفاده از Socket ها در سی شارپ را داشته باشیم کاربرد دارد.

Client و Listener

در مطالب قبلی که Network Programming را در زبان سی شارپ بررسی کردیم با برخی کلاس های اولیه آشنا شدیم. همانطور که گفتیم کلاس های فضای نام System.Net به دو دسته تقسیم می شوند. کلاس های High Level که برخی از آن ها را بررسی کردیم و کلاس های Low Level که به صورت مستقیم این اجازه را به ما می دهند تا با Protocol هایی مانند Tcp یا Udp و Stream ها کار کنیم.

در این مطلب با دو کلاس TcpClient و TcpListener آشنا خواهیم شد که بوسیله آن ها می توان مبتنی بر TCP پیام ها را بر بستر شبکه منتقل کرد. TCP که مخفف Transmission Control Protocol است روش هایی را در اختیار ما قرار می دهد تا بتوانیم به سادگی بین دو نقطه (که به آن End-Point گفته می شود) در محیط شبکه پیام های مورد نظر را منتقل کنیم.

End-Point ها معمولاً بوسیله یک آدرس IP و یک Port مشخص می شوند. برخی Port ها هستند که به صورت پیش فرض استفاده می شوند مانند 80 که توسط HTTP استفاده می شود یا 25 که توسط SMTP برای ارسال ایمیل استفاده می شود. قبل از اینکه شروع به ذکر مثال ها کنیم، بهتر است که بررسی کوتاهی بر روی دو کلاس TcpClient و TcpListener داشته باشیم.

زمانی که قصد داریم در محیط شبکه پیامی را ارسال کنیم، یک سیستم نقش ارسال کننده را داشته و سیستم دیگر پیام ما را دریافت می کند که در اینجا به سیستمی که پیام را ارسال می کند Client و سیستمی که پیام را گرفته و عملیاتی را انجام می دهد اصطلاحاً نقش Listener را بازی می کند که دائماً منتظر دریافت ارتباطی از طریق یکی از Client ها است.

کلاس TcpClient برای ایجاد Client که ارسال پیام را انجام می دهد استفاده می شود و کلاس TcpListener برای دریافت Connection استفاده می شود.همانطور که متوجه شدید ما برای دریافت ارتباط باید ابتدا یک Listener ایجاد کنیم. کد زیر برای ما اینکار را انجام می دهد (در این کد یک TextBox با نام LogTextBox و یک Button با نام ListenButton ایجاد کردیم)

private void ListenButton_Click(object sender, EventArgs e)
{
    var thread = new Thread(new ThreadStart(StartListen));
    thread.Start();
}

private void StartListen()
{
    TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.25"), 2222);
    listener.Start();

    var client = listener.AcceptTcpClient();
    var stream = client.GetStream();
    StreamReader reader = new StreamReader(stream);
    var result = reader.ReadToEnd();
    Invoke(new Action(() => LogTextBox.Text = result));
    stream.Close();
    client.Close();
    listener.Stop();
}

در کد بالا برای اینکه از Freeze شدن فرم جلوگیری کنیم از Thread استفاده کردیم. در متد StartListen ابتدا یک شئ از TcpListener ساختیم و به عنوان پارامتر آدرس IP و Port مورد نظر که Connection مربوطه را بر روی آن دریافت می کنیم مشخص کردیم.

با فراخوانی متد Start عملیات Listen شروع می شود و متد AcceptTcpClient منتظر می شود که یک درخواست TCP برای ما ارسال شود و یک شئ از نوع TcpClient برای ما بر میگرداند (در صورت عدم استفاده از Thread متد AcceptTcpClient باعث Freeze شدن Form می شود).

بعد از اینکه از سمت Client که کد آن را در قسمت بعدی بررسی می کنیم درخواستی دریافت شد، بوسیله متد GetStream استریمی که مبتنی بر آن پیام ارسال می شود را گرفته و در قالب یک StreamReader محتویات Stream را می خوانیم. Stream مربوطه از سمت Client نوشته می شود و ما اینجا پیام را دریافت می کنیم. بعد از دریافت پیام، خروجی را در LogTextBox نمایش داده و سپس استریم ایجاد شده، Client و Listener را می بندیم. به سراغ کد Client برویم:

var client = new TcpClient("127.0.0.25", 2222);

var stream = client.GetStream();
var bytes = System.Text.Encoding.UTF8.GetBytes("Welcome to ITPro.ir");
stream.Write(bytes, 0, bytes.Length);           
stream.Close();
client.Close();

این کد که در سمت کلاینت نوشته می شود، ابتدا یک شئ از نوع TcpClient ایجاد می کند و به عنوان پارامتر ورودی آدرس IP و Port ای که قصد ارتباط با آن را داریم مشخص می کنیم. دقت کنید که این آدرس IP و Port با آدرس IP و Port که در TcpListener استفاده شده یکی است.

بعد از ایجاد client متد AcceptTcpClient که در بخش Listener از آن استفاده کردیم فراخوانی شده و شئ Client در سمت Listener ایجاد می شود. در قدم بعد بوسیله متد GetStream، استریم مربوط به Client را گرفته و بر روی آن بوسیله متد Write پیامی که قصد انتقال آن را داریم را می نویسیم.

دقت کنید که این پیام هر چیزی می تواند باشد، شما می توانید محتویات یک فایل را خوانده و آن را در انتقال دهید یا هر چیز دیگر. بعد از نوشتن پیام بر روی Stream بوسیله متد Close، استریم و Client ایجاد شده را می بندیم. بوسیله این کدها پیام ما در بستر شبکه منتقل شد.

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

SMTP و ارسال ایمیل

فضای نام دیگری که زیر مجموعه فضای نام System.Net است، System.Net.Mail می باشد. از این فضای نام برای ارسال ایمیل استفاده می شود. کافیست شما یک سرور SMTP فعال داشته باشید تا بتوانید عملیات ارسال ایمیل را بوسیله آن انجام دهید. کلاسی که برای ارسال ایمیل استفاده می شود کلاس SmtpClient است و همانطور که گفتیم این کلاس در فضای نام System.Net.Mail قرار دارد. ابتدا باید یک Instance از روی کلاس SmtpClient بسازید:

var smtpClient = new SmtpClient("mail.tosinso.com", 25);

برای ارسال ایمیل، باید تنظیمات مربوط به اعتبار سنجی ایمیل مورد نظر را مشخص کنید. این کار بوسیله خصوصیت Credentials در کلاس SmtpClient انجام می شود:

var smtpClient = new SmtpClient("mail.tosinso.com", 25);
smtpClient.Credentials = new NetworkCredential("{username}", "{password}");

بعد از اینکار باید پیام مورد نظر را تعریف کنید. اینکار بوسیله کلاس MailMessage انجام می شود:

var smtpClient = new SmtpClient("mail.tosinso.com", 25);
smtpClient.Credentials = new NetworkCredential("{username}", "{password}");
var message = new MailMessage("from@host.com", "to@host.com");

پارامتر اول سازنده MailMessage آدرس فرستنده که ایمیل خود شما می باشد و پارامتر دوم آدرس گیرنده است. پس از مشخص کردن این پارامتر ها باید عنوان و متن اصلی را مشخص کنید که این کار بوسیله خصوصیت های Subject و Body انجام می شود:

var smtpClient = new SmtpClient("mail.tosinso.com", 25);
smtpClient.Credentials = new NetworkCredential("{username}", "{password}");
var message = new MailMessage("from@host.com", "to@host.com");
message.Subject = "your email subject";
message.Body = "your email body";

پس از انجام کارهای گفته شده بوسیله متد Send در کلاس SmtpClient پیام ایجاد شده را ارسال می کنیم:

var smtpClient = new SmtpClient("mail.tosinso.com", 25);
smtpClient.Credentials = new NetworkCredential("{username}", "{password}");
var message = new MailMessage("from@host.com", "to@host.com");
message.Subject = "your email subject";
message.Body = "your email body";
smtpClient.Send(message);

کد بالا ساده ترین روش برای ارسال ایمیل می باشد. فرض کنید که قصد داریم تا محتویات اصلی ایمیل ما در قالب HTML ارسال شود، برای اینکار کافیست تو خصوصیت IsBodyHtml را برای MailMessage برابر True قرار داده و Body را در قالب HTML ست کنیم:

message.IsBodyHtml = true;
message.Body = "<html><body><h1>This is email title</h1><p>This is from ITPro.ir</p></body></html>";

اگر بخواهیم پیام را به چندین نفر ارسال کنیم، می توانیم به صورت زیر اینکار را انجام دهیم:

var message = new MailMessage();
message.From = new MailAddress("from@host.com");
message.To.Add("to1@host.com");
message.To.Add("to2@host.com");
message.To.Add("to3@host.com");

دقت کنید که در کد بالا به جای مشخص کردن گیرنده و فرستنده از طریق سازنده از خصوصیت های From و To استفاده کردیم. اگر بخواهیم برای پیام مورد نظر رونوشت مشخص کنیم، از خصوصیت CC استفاده می کنیم:

message.CC.Add("cc1@host.com");
message.CC.Add("cc2@host.com");

همچنین می توان برای پیام ارسالی ضمیمه مشخص کرد که اینکار به صورت زیر انجام می شود:

message.Attachments.Add(new Attachment("file1.zip", MediaTypeNames.Application.Zip));

حسین احمدی
حسین احمدی

بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

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

نظرات