PDA

View Full Version : سوال: چک SmtpClient برای کانکت شدن به سرور



Hamishebahar
دوشنبه 09 فروردین 1389, 17:46 عصر
سلام دوستان خسته نباشید.

من چطوری میتونم چک کنم که SmtpClient با یوزر و پسوردی که دادم میتونه کانکت بشه یا نه..


SmtpClient MyS = new SmtpClient("barnamenevis.org", 25);
MyS.Credentials = new NetworkCredential("salam", "ir");

ممنون و موفق باشید.

Hamishebahar
سه شنبه 10 فروردین 1389, 16:12 عصر
سلام..کسی نیست که مشکل ما رسیدگی کنه؟

Amir Oveisi
سه شنبه 10 فروردین 1389, 16:21 عصر
سلام
شما میتونین از SMTP Command ها استفاده کنید. مثلا برای بررسی connection به سرور از دستور HELO، برای بررسی وجود داشتن یک username از دستور VRFY استفاده کنید.

لیست کامل دستورات پروتوکل SMTP رو در لینک زیر ببینید:
http://the-welters.com/professional/smtp.html

موفق باشید

Hamishebahar
سه شنبه 10 فروردین 1389, 18:21 عصر
ممنونم از راهنماییت اگه یه نمونه کد بزاری ممنون میشم تو MSDN هم نتونستم مثال پیدا کنم.

Hamishebahar
چهارشنبه 11 فروردین 1389, 17:48 عصر
سلام کسی نمیتونه کمکی کنه؟

Hamishebahar
پنج شنبه 12 فروردین 1389, 14:13 عصر
ما همچنان منتظر یاری بنفشتان هستیم.

__H2__
شنبه 14 فروردین 1389, 00:08 صبح
سلام
شاید ساده ترین راه همان ارسال یک ایمیل به آدرس از پیش تعریف شده ای باشد.
من که این راه را ترجیه میدهم!

ولی همانطور که کاربر 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

=====

موفق باشید.