سلام
شاید ساده ترین راه همان ارسال یک ایمیل به آدرس از پیش تعریف شده ای باشد.
من که این راه را ترجیه میدهم!
ولی همانطور که کاربر bermooda هم گفتند SMTP حاوی یک سری فرامین است که پس از باز کردن سوکت، شما میتوانید فرامین را به فرمت ASCII ارسال کنید و یک کد سه رقمی حاوی جواب سرور پس بگیرید.
ولی روشهای اعتبار سنجی user و pass متنوعی وجود دارد و نوشتن کد کامل و پیشبینی شده برای این استانداردها و شرایط مختلف میتواند بسیار وقت گیر باشد.
مثلاً با در نظر گیری ساده ترین شرایط ممکن کدی مثل این را برایتان نوشتم:
private const string COMMAND_EHELLO = "EHLO {0}\r\n";
private const string COMMAND_HELLO = "HELO {0}\r\n";
private const string COMMAND_MAIL = "MAIL FROM: {0}\r\n";
private const string COMMAND_AUTH = "AUTH LOGIN \r\n";
//__________________________________________________ ______________________
public static bool MailTest(string server, int port, string user, string pass, string from)
{
try
{
var ips = System.Net.Dns.GetHostEntry(server);
if ((ips == null) || (ips.AddressList == null) || (ips.AddressList.Length <= 0)) return false;
var add = new System.Net.IPEndPoint(ips.AddressList[0], port);
using (var socket = new System.Net.Sockets.Socket(add.AddressFamily, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp))
{
socket.Connect(add);
if (!socket.Connected) return false;
if (ReadStatusCode(socket, 45) != System.Net.Mail.SmtpStatusCode.ServiceReady) return false;
SendMessage(socket, string.Format(COMMAND_EHELLO, System.Net.Dns.GetHostName()));
if (ReadStatusCode(socket, 45) != System.Net.Mail.SmtpStatusCode.Ok) return false;
SendMessage(socket, COMMAND_AUTH);
if (ReadStatusCode(socket, 45) != (System.Net.Mail.SmtpStatusCode)334) return false;
SendMessage(socket, System.Convert.ToBase64String(System.Text.Encoding .ASCII.GetBytes(user)) + "\r\n");
if (ReadStatusCode(socket, 45) != (System.Net.Mail.SmtpStatusCode)334) return false;
SendMessage(socket, System.Convert.ToBase64String(System.Text.Encoding .ASCII.GetBytes(pass)) + "\r\n");
if (ReadStatusCode(socket, 45) != (System.Net.Mail.SmtpStatusCode)235) return false;
SendMessage(socket, string.Format(COMMAND_MAIL, from));
if (ReadStatusCode(socket, 45) != System.Net.Mail.SmtpStatusCode.Ok) return false;
}
return true;
}
catch
{
return false;
}
}
//__________________________________________________ ______________________
private static void SendMessage(System.Net.Sockets.Socket socket, string value)
{
byte[] buffer = System.Text.Encoding.ASCII.GetBytes(value);
socket.Send(buffer, 0, buffer.Length, System.Net.Sockets.SocketFlags.None);
}
//__________________________________________________ ______________________
private static System.Net.Mail.SmtpStatusCode ReadStatusCode(System.Net.Sockets.Socket socket, int SecondsTimeout)
{
var endtimeout = DateTime.UtcNow.AddSeconds(SecondsTimeout);
while ((socket.Available <= 0) && (DateTime.UtcNow < endtimeout))
{
System.Threading.Thread.Sleep(100);
}
int iread = socket.Available;
if (iread <= 0) return System.Net.Mail.SmtpStatusCode.GeneralFailure;
var buffer = new byte[iread];
iread = socket.Receive(buffer, 0, iread, System.Net.Sockets.SocketFlags.None);
if (iread < 3) return System.Net.Mail.SmtpStatusCode.GeneralFailure;
return (System.Net.Mail.SmtpStatusCode)int.Parse(System.T ext.Encoding.ASCII.GetString(buffer, 0, 3));
}
//__________________________________________________ ______________________
ولی همین کد ساده هم اگر سرور نیاز به SSL داشته باشد از مرحله HELLO فراتر نخواهد رفت!
=====
پیشنهاد میکنم از کلاسهای خود دات نت استفاده کنید و عملاً ایمیلی به یک آدرس مشخص ارسال کنید.
البته کلاسهای خود دات نت هم بر اساس همین فرامین نوشته شده اند ولی این کلاسها حجم کد قابل توجهی دارد و وقت گذاشته شده و حداکثر سازگاری با استاندارها و نسخه های مختلف موجود در ان ها پیاده سازی شده.
لینک مرتبط:
http://www.networksorcery.com/enp/protocol/smtp.htm
=====
موفق باشید.