mahmood3d
یک شنبه 18 مرداد 1388, 20:34 عصر
سلام دوستان
من دارم روی پروژه ای کار می کنم که توی اون پروژه نیاز به ارسال آدرس ایمیل هست.
این پروژه تحت ویندوز هست (وین فرم یا همون ویندوز اپلیکیشن) و می خوام قبل از ارسال ایمیل از صحیح بودن اون اطمینان حاصل کنم. البته این کار رو برای سینتکسش انجام دادم و می خوام از صحت اون در میل سرور هم مطمئن بشم. برای این کار با راهنمایی دوستان یک سری کد پیدا کردم که در این آدرس می تونید ببینید:
http://www.codeproject.com/KB/validation/Valid_Email_Addresses.aspx
و این کد رو توی برنامم نوشتم:
private static void Senddata(Socket s, string msg)
{
byte[] _msg = Encoding.ASCII.GetBytes(msg);
s.Send(_msg, 0, _msg.Length, SocketFlags.None);
}
private static bool Check_Response(Socket s, SMTPResponse response_expected)
{
string sResponse;
int response;
byte[] bytes = new byte[1024];
while (s.Available == 0)
{
System.Threading.Thread.Sleep(100);
}
s.Receive(bytes, 0, s.Available, SocketFlags.None);
sResponse = Encoding.ASCII.GetString(bytes);
response = Convert.ToInt32(sResponse.Substring(0, 3));
if (response != (int)response_expected)
return false;
return true;
}
public bool VerificationEmail(string address)
{
string[] host = (address.Split('@'));
string hostname = host[1];
IPHostEntry IPhst = Dns.GetHostEntry(hostname);
IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25);
Socket s = new Socket(endPt.AddressFamily,
SocketType.Stream, ProtocolType.Tcp);
s.Connect(endPt);
//Attempting to connect
if (!Check_Response(s, SMTPResponse.CONNECT_SUCCESS))
{
s.Close();
return false;
}
//HELO server
Senddata(s, string.Format("HELO {0}\r\n", Dns.GetHostName()));
if (!Check_Response(s, SMTPResponse.GENERIC_SUCCESS))
{
s.Close();
return false;
}
//Identify yourself
//Servers may resolve your domain and check whether
//you are listed in BlackLists etc.
Senddata(s, string.Format("MAIL From: {0}\r\n",
"testexample@deepak.portland.co.uk"));
if (!Check_Response(s, SMTPResponse.GENERIC_SUCCESS))
{
s.Close();
return false;
}
//Attempt Delivery (I can use VRFY, but most
//SMTP servers only disable it for security reasons)
Senddata(s, address);
if (!Check_Response(s, SMTPResponse.GENERIC_SUCCESS))
{
s.Close();
return false;
}
return (true);
}
البته طبق خود کد این بخش رو هم باید خارج از کلاس قرار بدین:
private enum SMTPResponse : int
{
CONNECT_SUCCESS = 220,
GENERIC_SUCCESS = 250,
DATA_SUCCESS = 354,
QUIT_SUCCESS = 221
}
حالا وقتی که من از تابع VerificationEmail استفاده می کنم از
s.Connect(endPt);
خطا می گیره.
لطفا هر کی می تونه جواب بده ممنون
من دارم روی پروژه ای کار می کنم که توی اون پروژه نیاز به ارسال آدرس ایمیل هست.
این پروژه تحت ویندوز هست (وین فرم یا همون ویندوز اپلیکیشن) و می خوام قبل از ارسال ایمیل از صحیح بودن اون اطمینان حاصل کنم. البته این کار رو برای سینتکسش انجام دادم و می خوام از صحت اون در میل سرور هم مطمئن بشم. برای این کار با راهنمایی دوستان یک سری کد پیدا کردم که در این آدرس می تونید ببینید:
http://www.codeproject.com/KB/validation/Valid_Email_Addresses.aspx
و این کد رو توی برنامم نوشتم:
private static void Senddata(Socket s, string msg)
{
byte[] _msg = Encoding.ASCII.GetBytes(msg);
s.Send(_msg, 0, _msg.Length, SocketFlags.None);
}
private static bool Check_Response(Socket s, SMTPResponse response_expected)
{
string sResponse;
int response;
byte[] bytes = new byte[1024];
while (s.Available == 0)
{
System.Threading.Thread.Sleep(100);
}
s.Receive(bytes, 0, s.Available, SocketFlags.None);
sResponse = Encoding.ASCII.GetString(bytes);
response = Convert.ToInt32(sResponse.Substring(0, 3));
if (response != (int)response_expected)
return false;
return true;
}
public bool VerificationEmail(string address)
{
string[] host = (address.Split('@'));
string hostname = host[1];
IPHostEntry IPhst = Dns.GetHostEntry(hostname);
IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25);
Socket s = new Socket(endPt.AddressFamily,
SocketType.Stream, ProtocolType.Tcp);
s.Connect(endPt);
//Attempting to connect
if (!Check_Response(s, SMTPResponse.CONNECT_SUCCESS))
{
s.Close();
return false;
}
//HELO server
Senddata(s, string.Format("HELO {0}\r\n", Dns.GetHostName()));
if (!Check_Response(s, SMTPResponse.GENERIC_SUCCESS))
{
s.Close();
return false;
}
//Identify yourself
//Servers may resolve your domain and check whether
//you are listed in BlackLists etc.
Senddata(s, string.Format("MAIL From: {0}\r\n",
"testexample@deepak.portland.co.uk"));
if (!Check_Response(s, SMTPResponse.GENERIC_SUCCESS))
{
s.Close();
return false;
}
//Attempt Delivery (I can use VRFY, but most
//SMTP servers only disable it for security reasons)
Senddata(s, address);
if (!Check_Response(s, SMTPResponse.GENERIC_SUCCESS))
{
s.Close();
return false;
}
return (true);
}
البته طبق خود کد این بخش رو هم باید خارج از کلاس قرار بدین:
private enum SMTPResponse : int
{
CONNECT_SUCCESS = 220,
GENERIC_SUCCESS = 250,
DATA_SUCCESS = 354,
QUIT_SUCCESS = 221
}
حالا وقتی که من از تابع VerificationEmail استفاده می کنم از
s.Connect(endPt);
خطا می گیره.
لطفا هر کی می تونه جواب بده ممنون