PDA

View Full Version : تعیین صحت آدرس های ایمیل



mahmood3d
یک شنبه 18 مرداد 1388, 19: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);
خطا می گیره.

لطفا هر کی می تونه جواب بده ممنون

Sociant
دوشنبه 19 مرداد 1388, 03:04 صبح
برای اعتبار سنجی آدرس ایمیل میتونی از روشی که اغلب تو طراحی وب استفاده میشه یعنی Regular Expression استفاده کنی

اینم مثال :


using System.Text.RegularExpressions;

namespace RegularExpression
{
class Program
{
static void Main(string[] args)
{
Regex emailRegex = new Regex("(?<user>[^@]+)@(?<host>.+)");
string email = Console.ReadLine();
Match match = emailRegex.Match(email);
if (match.Success)
Console.WriteLine("Ok. You have enterd a valid email!");
else
Console.WriteLine("Sorry. You have enter an invalid email!");

Console.Read();

}
}
}

mahmood3d
دوشنبه 19 مرداد 1388, 11:31 صبح
سلام شما توضیحات منو خوب نخوندین. من از Regular Expression استفاده کردم و ایمیل رو از لحاظ Syntax چک کردم که درسته. حالا می خوام ببینم که این آدرسی که تأیید شده وجود داره یا نه. برای همین نیاز هست که اینو از طریق وصل شدن به خود میل سرور بررسی کنم. حالا توی وصل شدن به سرور خطا می ده و نمی تونه بهش کانکت بشه.

mahmood3d
دوشنبه 19 مرداد 1388, 11:40 صبح
خطایی که برنامه تولید می کنه رو توی تصویر زیر می تونید ببینید.

mahmood3d
دوشنبه 19 مرداد 1388, 17:54 عصر
از اساتید محترم کسی نبود جواب بده؟

debugger
سه شنبه 20 مرداد 1388, 11:02 صبح
من فكر مي كنم كه شما نمي توني به سرور لاگين بشي

براي چك كردن وجود يا عدم وجود يك ايميل ابتدا بايد به smtp هاست متصل بشي كه نياز به يوزر و پسورد داره

سپس چك كني

((نرم افزار مشابه اينگونه عمل مي كنند. من چند نمونه ديدم))

ارور شما احتمالا بخاطر اينه كه شما بدون هيچ اكانتي ميخواي از smtp استفاده كنيد

البته ابن يه نظر شخصي هست

mahmood3d
چهارشنبه 21 مرداد 1388, 14:54 عصر
اگه اینطور باشه باید در تمامی میل سرور ها دارای اکانت باشی که این معقول نیست و علاوه بر اون لیستی از اکانت هایی که باز کردی رو به برنامه بدی تا اکانت مورد نظر رو انتخاب کنه که فکر نکنم چنین چیزی باشه.
من یک وب سرویس پیدا کردم که با متصل شدن به اون می تونی ایمیل رو اعتبار سنجی کنی ولی این کار برای هر ایمیل 5-6 ثانیه زمان می بره و اگه بخواد یک تعداد زیادی از ایمیل ها رو ارسال کنه زمان خیلی زیادی رو باید صرف کنه.
با این حال این وب سرویس ها هم در تمامی میل سرور ها اکانت ندارن (چون هر روز سایت های زیادی ایجاد میشن) اما می تونن این عمل رو بررسی کنن.

debugger
پنج شنبه 22 مرداد 1388, 15:52 عصر
اگر مشكلت رفع نشد بگو يه نمونه سورس واست بزارم ببين

mahmood3d
پنج شنبه 28 آبان 1388, 18:04 عصر
سلام
داشتم دنبال موضوع دیگه ای می گشتم که دیدم به این تاپیکم جواب داده شده.
من برای این مشکل از یک راه دیگه ای رفتم ولی فقط الان می تونم جیمیل ها رو چک کنم. اگه میشه شما یک سورس دیگه اینجا بزارین

irlogo
پنج شنبه 28 آبان 1388, 19:27 عصر
من تست کردم ولی به نتیجه ای نرسیدم

somayeh89
دوشنبه 17 اسفند 1388, 10:53 صبح
سلام دوستان مهندس
اگه ممکنه سورس برنامه را بذارین چون من هم به همچین مشکلی برخوردم .

ahrimaneahurai
دوشنبه 17 اسفند 1388, 18:13 عصر
سلام دوست عزیز این کد رو امتحان کن ببین به دردت میخو ره ؟


<script language="c#" runat="server">
private void btnSend_Click(object sender, System.EventArgs e)
{

MailMessage msg = new MailMessage();


msg.To = txtTo.Text;

msg.From = txtFrom.Text;

msg.Subject = txtSubject.Text;

msg.Body = txtContent.Value;
lblStatus.Text = "Sending...";


SmtpMail.Send(msg);

lblStatus.Text = "Sent email (" + txtSubject.Text + ") to " +txtTo.Text;

}
</script>
البته این فقط برای فرستادن هست شاید با تغغییرات بشه کاری روش کرد