PDA

View Full Version : فرستادن رمز عبور ونام کاربری به ایمیل کاربر



jalaladdin
شنبه 19 تیر 1389, 13:04 عصر
برای فرستادن رمز عبور به ایمیل کاربراین کد رانوشتم اما در وقتی در لوکال هاست امتحان میکنم این کد این پیغام را میدهد مشکل کجاست

Warning: mail() [function.mail (http://www.barnamenevis.org/forum/function.mail)]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\wamp\www\4\forgetpassword.php on line 136
پسورد به ایمیلتان فرستاده شد لطفا ایمیل خود راچک کنید!







<?php
$email = $_POST['email'];
if (!isset($_POST['email'])) {
?>
<h2>باز گرداندن رمز عبور!</h2>
<form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
<p class="style3"><label for="email">ایمیل:</label>
<input type="text" title="Please enter your email address" name="email" size="30"/></p>
<p class="style3"><label title="Reset Password">&nbsp</label>
<input type="submit" value="ارسال" class="submit-button"/></p>
</form>
<?php
}
elseif (empty($email)) {
echo $empty_fields_message;
}
else {
$email_address=mysql_real_escape_string($email);
$status = "OK";
$msg="";
//error_reporting(E_ERROR | E_PARSE | E_CORE_ERROR);
if (!stristr($email,"@") OR !stristr($email,".")) {
echo"<script>alert('شما باید یک ایمیل معتبر را وارد نمایید')</script>";
echo "<meta http-equiv='refresh' content='0; URL=forgetpassword.php'>";
$status= "NOTOK";}
echo "<br><br>";
if($status=="OK"){ $query="SELECT email,username FROM users WHERE email = '$email'";
$st=mysql_query($query);
$recs=mysql_num_rows($st);
$row=mysql_fetch_object($st);
$em=$row->email;// email is stored to a variable
if ($recs == 0) { echo "<center><font face='Verdana' size='2' color=red><br> متاسفانه این آدرس در دیتابیس یافت نشد . شما میتوانید در سایت عضو شوید. <BR><BR><a href='register.html'>عضویت در سایت</a> </center>";


exit;}
function makeRandomPassword() {
$salt = "abchefghjkmnpqrstuvwxyz0123456789";
srand((double)microtime()*1000000);
$i = 0;
while ($i <= 7) {
$num = rand() % 33;
$tmp = substr($salt, $num, 1);
$pass = $pass . $tmp;
$i++;
}
return $pass;
}
$password = makeRandomPassword();
$password = md5($password);

$sql = mysql_query("UPDATE users SET password='$password'
WHERE email='$email'");

$subject = "Your password at www.yoursite.com";
$message = "Hi, we have reset your password.

New Password: $password

http://www.yoursite.com/login
Once logged in you can change your password

Thanks!
Site admin

This is an automated response, please do not reply!";

mail($email, $subject, $message, "From: yoursite.com Webmaster<admin@admin.com>\n
X-Mailer: PHP/" . phpversion());
echo "پسورد به ایمیلتان فرستاده شد لطفا ایمیل خود راچک کنید!<br />";
echo "<br> <a href='index.php'>ورود به سایت</a> ";
}

}
?>

LORD AELX
شنبه 19 تیر 1389, 13:28 عصر
برای فعال کردن ایمیل باید این بخش را در فایل php.ini اصلاح کنید:



[mail function]
; For Win32 only.
SMTP = localhost
; For Win32 only.
sendmail_from = me@localhost.com
; For Unix only. You may supply argumants as well (default: "sendmail -t -i").
; sendmail_path =

صابر طهماسبی
شنبه 19 تیر 1389, 13:31 عصر
سلام
مشکل خاصی نیست
این خطا برای این است که روی سیستم شما SMTP SERVER که برای ارسال ایمیل استفاده می شود راه اندازی نشده است
فقط اشکالی در کد شماست اینکه باید مقدار بازگشتی تابع mail را چک کنید و در صورت true بودن پیغام ارسال اطلاعات را به کاربر نمایش دهید به صورت زیر :



$result=@mail($email, $subject, $message, "From: yoursite.com Webmaster<admin@admin.com>\n
X-Mailer: PHP/" . phpversion());
if($result)
echo "پسورد به ایمیلتان فرستاده شد لطفا ایمیل خود راچک کنید!<br />";
else
echo "خطایی در ارسال اطلاعات رخ داده است با مدیر سایت تماس بگیرید.";

LORD AELX
شنبه 19 تیر 1389, 13:40 عصر
من یه سوال در این مورد دارم... معمولا دو شیوه برای Recovery کردن رمز عبور استفاده می شود، حالتی که مثل همین کدی که دوستمون ارایه دادند، که میاد پسورد اصلی رو با یک پسورد random جایگزین می کنه و رمز جدید رو برای کاربر ایمیل می کنه، و حالتی که یک لینک خاص و random به ایمیل کاربر فرستاده می شود تا از طریق آن اقدام به reset کردن پسورد خود بکند.

من میخواستم بدونم شیوه دوم به چه صورت انجام می گیرد و نیز اقدامات امنیتی آن چیست. ممنون میشم کامل و دقیق توضیح بدهید.

متشکر :قلب:

rapidpich
شنبه 19 تیر 1389, 13:55 عصر
یه فیلد میزاری تو دیتابیست مثلا secret
بعد هر دفعه که کاربری درخواست رمز کرد یک عدد رندوم بش اختصاص میدی
اینو ایمیل میکنی به کاربر. هر وقت کاربر رفت به آدرسی که میل کردی اجازه میدی رمزشو عوض کنه یا رمز جدید بش میدی

aliramazani
شنبه 19 تیر 1389, 14:11 عصر
اگه رمز به صورت md5‎ ‎‏ توی دیتابیس ذخیره شده باشه چه روشی برای مشاهده رمز فراموش شده هست؟

صابر طهماسبی
شنبه 19 تیر 1389, 14:15 عصر
نکته ای را که در این مورد باید به یاد داشت این است که فرض کنیم یکنفر در بخش یادآوری رمز عبور ایمیل شخص دیگری را وارد می کند اگر ما رمز اصلی را تغییر داده و به ایمیل کاربر ارسال کنیم ممکن است کاربر بدون اطلاع از اینکه رمز او تغییر یافته برای ورود به سایت اقدام کند و دچار دردسر شود برای همین رو راه داریم:


از روش دوم استفاده کنیم
رمز اصلی را تغییر ندهیم و رمز تغییر یافته را در جایی ذخیره کنیم و اینطور تعریف کنیم که اگر کاربر با رمز تغییر یافته وارد سایت شد رمز اصلی آن به رمز تغییر یافته تبدیل شود

البته نکات ریز و روشهای زیادی برای بازیابی رمز عبور هست که اینجا مجال شرح آنها نمی باشد

صابر طهماسبی
شنبه 19 تیر 1389, 14:17 عصر
اگه رمز به صورت md5‎ ‎‏ توی دیتابیس ذخیره شده باشه چه روشی برای مشاهده رمز فراموش شده هست؟
رمز باید دوباره reset شود و امکان بازیابی در حالت عادی نیست
جواب قبلی بنده را ببینید

LORD AELX
شنبه 19 تیر 1389, 14:19 عصر
اگه رمز به صورت md5‎ ‎‏ توی دیتابیس ذخیره شده باشه چه روشی برای مشاهده رمز فراموش شده هست؟

هیچی... تنها راهش اینه که پسورد رو عوض کنی و پسورد جدید رو برای طرف ایمیل کنی. در واقع همون روش اول که قبلا گفتم. :چشمک: البته این کار برای security هم مهم است. مثلا اگر یک هکر ایمیل کاربر را هک کرده باشد و سپس درخواست reset پسورد را بدهد، فقط می تواند با وبسایت مورد نظر کار کند و پسورد را به دست نمی آورد و با نداشتن پسورد امکان سوء استفاده های بعدی را نخواهد داشت.

jalaladdin
شنبه 19 تیر 1389, 17:42 عصر
آقای طهماسبی ممنون از راهنماییتان
این شرط if که گفتید در کدم نوشتم امامرورگر این پیغام را میدهد
خطایی در ارسال اطلاعات رخ داده است با مدیر سایت تماس بگیرید.



$result=@mail($email, $subject, $message, "From: yoursite.com Webmaster<admin@admin.com>\n
X-Mailer: PHP/" . phpversion());
if($result)
echo "پسورد به ایمیلتان فرستاده شد لطفا ایمیل خود راچک کنید!<br />";
else
echo "خطایی در ارسال اطلاعات رخ داده است با مدیر سایت تماس بگیرید.";

jalaladdin
شنبه 19 تیر 1389, 17:48 عصر
پس این خطا ربطی به لوکال هاست دارد یا نه؟

Warning: mail() [function.mail (http://www.barnamenevis.org/forum/function.mail)]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\wamp\www\4\forgetpassword.php on line 136

rapidpich
یک شنبه 20 تیر 1389, 19:51 عصر
این یعنی اینکه شما سرور Smtp رو کامپیوترت نداری

صابر طهماسبی
یک شنبه 20 تیر 1389, 20:16 عصر
آقای طهماسبی ممنون از راهنماییتان
این شرط if که گفتید در کدم نوشتم امامرورگر این پیغام را میدهد
خطایی در ارسال اطلاعات رخ داده است با مدیر سایت تماس بگیرید.



$result=@mail($email, $subject, $message, "From: yoursite.com Webmaster<admin@admin.com>\n
X-Mailer: PHP/" . phpversion());
if($result)
echo "پسورد به ایمیلتان فرستاده شد لطفا ایمیل خود راچک کنید!<br />";
else
echo "خطایی در ارسال اطلاعات رخ داده است با مدیر سایت تماس بگیرید.";

خواهش می کنم
اگر کد را روی سرور لوکال تست می کنید ممکن است SMTP شما غیرفعال باشد.
با استفاده از دستور زیر در CMD تست کنید آیا SMTP SERVER فعال است :

netstat -na

اگر پورت 25 فعال بود به معنای فعال بودن است
بنده خودم SMTP SERVER روی سیستم نصب نمی کنم بخشهایی را که با ایمیل سروکار دارند روی هاست تست می کنم
@ قبل از تابع mail از نمایش خطا توسط php جلوگیری می کند برای اینکه پیغام دلخواه خودمان را نمایش دهیم و پیغام "..با مدیر تماس بگیرید" هنگامی رخ می دهد که تابع mail نتواند بدرستی عمل کند(می توانید آن را بردارید تا ببینید php چه خطایی را نمایش می دهد).
موفق باشید

jalaladdin
سه شنبه 22 تیر 1389, 10:24 صبح
باز هم این خطا را میدهد پورت 25 کار نمیکنه این کد روی لوکال هاست تست کردم برای رفع خطا راهنمای کنید
Warning: mail() [function.mail (http://www.barnamenevis.org/forum/function.mail)]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\wamp\www\4\forgetpassword.php on line 140
خطایی در ارسال اطلاعات رخ داده است با مدیر سایت تماس بگیرید.

Reza1607
سه شنبه 22 تیر 1389, 10:40 صبح
برای این که روی لوکال تست کنی باید smtp رو توی فایل php.ini تغییر بدی و جلوی smtp باید یک سرور که سرویس ارسال ایمیل رو در اختیارتون می ذاره قرار بدین مثلا یاهو چند تا سرور داره که به می تونی به صورت رایگان ازش استفاده کنی این آدرس سرورها


mx1.mail.yahoo.com
mx2.mail.yahoo.com
mx3.mail.yahoo.com
mx4.mail.yahoo.com

که باید در فایل php.ini باید جلوی خط SMTP یکی از سرورهای بالا رو قرار بدین
نکته ) این سرورهایی که گفتم فقط قابلیت ارسال ایمیل به اکانتهای یاهو رو داره یعنی نمی تونید به یک اکانت جی میل ایمیل بفرستید
راه دوم که بهتره می تونی از یک نرم افزار smtp server استفاده کنی که من بهتون توصیه می کنم تا از argosoft mail server استفاده کنی
این هم آدرس سایتش

http://www.argosoft.com/rootpages/Default.aspx

jalaladdin
سه شنبه 22 تیر 1389, 12:45 عصر
من جلوی smtp یکی از این سرویسها نوشتمmx1.mail.yahoo.com وهمچنینsmtp server را نصب کردم بازهم مشکل وجود دارد این خطا را میدهد
Warning: mail() [function.mail (http://www.barnamenevis.org/forum/function.mail)]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\wamp\www\4\forgetpassword.php on line 140
خطایی در ارسال اطلاعات رخ داده است با مدیر سایت تماس بگیرید.

LORD AELX
سه شنبه 22 تیر 1389, 13:40 عصر
من جلوی smtp یکی از این سرویسها نوشتمmx1.mail.yahoo.com وهمچنینsmtp server را نصب کردم بازهم مشکل وجود دارد این خطا را میدهد
Warning: mail() [function.mail (http://www.barnamenevis.org/forum/function.mail)]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\wamp\www\4\forgetpassword.php on line 140
خطایی در ارسال اطلاعات رخ داده است با مدیر سایت تماس بگیرید.

عزیز من، خوب هاست رایگان که زیاده، برو رو یک وب سرور واقعی تست کن...

jalaladdin
چهارشنبه 23 تیر 1389, 08:20 صبح
این کد را در دریم ویور نوشتم این خطاها را میدهد مشکل کجاست
Untitled DocumentWarning: filter_var() expects parameter 2 to be long, string given in C:\wamp\www\mail.php on line 12

Warning: filter_var() expects parameter 2 to be long, string given in C:\wamp\www\mail.php on line 13
invalid input



<?php
function spamcheck($field)
{
$field=filter_var($field,filter_sanitize_email);
if(filter_var($field,filter_validate_email))
{
return true;
}else
{return false;}
}
if(isset($_REQUEST['email']))
{$mailcheck=spamcheck($_REQUEST['email']);
if($mailcheck==false)
{echo"invalid input";}
else
{
$email=$_REQUEST['email'];
$subject=$_REQUEST['subject'];
$message=$_REQUEST['message'];
mail("aboonajmi22@yahoo.com","subject:$subject",$message,"from:$email");
echo"thanks";
}}
else{
echo"<form method='post' action='mail.php'>
email:<input name='email' type='text'/><br/>
subject:<input name='subject' type='text'/><br/>
message:<br/>
<text area name='message' rows='15' cols='40'>
</textarea><br/>
<input type='submit'/>
</form>";

}
?>

jalaladdin
یک شنبه 23 آبان 1389, 20:17 عصر
لطفا این کد را برایم تحلیل کنید

$email = $_POST['email'];
if (!isset($_POST['email'])) {
?>
<div align="center"><h2>باز گرداندن رمز عبور!</h2>
<form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>" >
<label for="email">ایمیل:</label>
<input type="text" name="email" size="30"/></p></div>
<label >&nbsp</label>
<div align="center"> <input type="submit" value="ارسال" class="button"/></p></div>
</form>
<?php
}
elseif (empty($email)) {
printf('<br/><form method="post" action="" >
<div align="center"> <label for="email">ایمیل:</label>
<input type="text" name="email" size="30"/></div>
<div align="center" class=" bg-text1 " >لطفا آدرس ایمیل خودرا وارد نمایید</div>
<label >&nbsp</label>
<div align="center"> <input type="submit" value="ارسال" class="button"/></p></div>
</form>');

}
else {
$email_address=mysql_real_escape_string($email);
$status = "OK";
$msg="";
//error_reporting(E_ERROR | E_PARSE | E_CORE_ERROR);
if (!stristr($email,"@") OR !stristr($email,".")) {
printf('<br/><form method="post" action="" >
<div align="center"><label for="email">ایمیل:</label>
<input type="text" name="email" size="30"/></div>

<div align="center" class=" bg-text1" >شما باید یک ایمیل معتبر را وارد نمایید</div>
<label >&nbsp</label>
<div align="center"> <input type="submit" value="ارسال" class="button"/></p></div>
</form>');

$status= "NOTOK";}

echo "<br><br>";
if($status=="OK"){ $query="SELECT email,username FROM users WHERE email = '$email'";
$st=mysql_query($query);
$recs=mysql_num_rows($st);
$row=mysql_fetch_object($st);
$em=$row->email;// email is stored to a variable
if ($recs == 0) { echo "<center><font face='Verdana' size='3' color=red><br> <b>متاسفانه این آدرس در دیتابیس یافت نشد . شما میتوانید در سایت عضو شوید. <b/><BR><BR><a href='register.html'>عضویت در سایت</a> </center>";


exit;}
function makeRandomPassword() {
$salt = "abchefghjkmnpqrstuvwxyz0123456789";
srand((double)microtime()*1000000);
$i = 0;
while ($i <= 7) {
$num = rand() % 33;
$tmp = substr($salt, $num, 1);
$pass = $pass . $tmp;
$i++;
}
return $pass;
}
$password = makeRandomPassword();
$password = md5($password);

$sql = mysql_query("UPDATE users SET password='$password'
WHERE email='$email'");

$subject = "پسورد شما";
$message = "Hi, we have reset your password.

New Password: $password


Thanks!
Site admin

";




$result=mail($email, $subject, $message, "From: yoursite.com Webmaster<admin@admin.com>\n
X-Mailer: PHP/" . phpversion());
if($result){
echo "پسورد به ایمیلتان فرستاده شد لطفا ایمیل خود راچک کنید!<br />"; }
else{
echo "خطایی در ارسال پسورد به ایمیلتان رخ داده است "; }
}

}
?>

funpatogh
یک شنبه 23 آبان 1389, 21:10 عصر
اول چک میکنه که کلید ایمیل ارسال شده یا نه اگر ارسال نشده بود یعنی صفحه تازه باز شده پس فرم رو نمایش میدهد باز گرداندن رمز عبور!

اگر کلید ایمیل ارسال شده بود اما مقدار ایمیل موجود نبود فرم رو دوباره نشان میدهد با یک پیغام خطا که ایمیل را وارد کنید

اگر هیچ کدام از موارد بالا نبود پس هم فرم ارسال شده هم اینکه مقدار ایمیل وجود داشته است
پس ایمیل رو escape میکند و یک متغییر به نام $status با مقدار ok هم ایجاد میکنیم

بعد ایمیل رو بررسی میکنیم که @ دارد یا نه اگر نداشت فرم رو همراه با پیغام آدرس معتبر وارد کنید نمایش میدهیم و متغییر $status برابر با NOTOK میکنیم

بعد بررسی میکنیم که اگر متغییر status برابر با ok بود یعنی همه چیز درست هست و توی دیتابیس بررسی میکنیم که وجود دارد یا نه
اگر ایمیل وجود نداشت پیغام میدهیم که ایمیل نیست و باید عضو بشود و برنامه متوقف میشود

اگر هم ایمیل موجود بود یک رمز تصادفی ایجاد میکنیم و رمز این کاربر با همین آدرس ایمیل رو آپدیت میکنیم و براش رمز جدید رو ایمیل میکنیم در آخر هم میگیم که
پسورد به ایمیلتان فرستاده شد لطفا ایمیل خود راچک کنید!

jalaladdin
دوشنبه 24 آبان 1389, 17:07 عصر
لطفا بگید این متغیر کارش چی هست
$msg="";و همچنین این دستور چکار میکند

$email_address=mysql_real_escape_string($email);


$st=mysql_query($query);
$recs=mysql_num_rows($st);
$row=mysql_fetch_object($st);
$em=$row->email;// email is stored to a variable
if ($recs == 0)

masato
دوشنبه 24 آبان 1389, 18:08 عصر
سلام دوستان من php .mysql,html,بلدم حالا میخوام یک سایت که انواع فایل را برای دانلود رایگان میزار را طراحی کنم .حالا نمی دونم از کجا شروع کنم یعنی تا حالا اصلا طراحی نکردم .خواهشن کمکم کنید دارم کلافه میشم ممنون از شما دوستان عزیز
:گریه::گریه:

masato
دوشنبه 24 آبان 1389, 18:20 عصر
سوال اول: یه متغیر خالی
سوال دوم: نمی دونم
سوال سوم: اول پرسش اجرا میکنه.بعد تعداد ردیف می گیره .بعد ستون ها رو در میاره . و بعد اشاره میکنه به ستون ایمیل .وآخر میاد نگاه میکنه تعداد ردیف ها برابر صفر است یانه

funpatogh
دوشنبه 24 آبان 1389, 19:39 عصر
سلام دوستان من php .mysql,html,بلدم حالا میخوام یک سایت که انواع فایل را برای دانلود رایگان میزار را طراحی کنم .حالا نمی دونم از کجا شروع کنم یعنی تا حالا اصلا طراحی نکردم .خواهشن کمکم کنید دارم کلافه میشم ممنون از شما دوستان عزیز
:گریه::گریه:
توی همین بخش php یک نمونه خودم نوشتم میتونید جستجو کنید

funpatogh
دوشنبه 24 آبان 1389, 19:45 عصر
لطفا بگید این متغیر کارش چی هست
$msg="";و همچنین این دستور چکار میکند

$email_address=mysql_real_escape_string($email);
$st=mysql_query($query);
$recs=mysql_num_rows($st);
$row=mysql_fetch_object($st);
$em=$row->email;// email is stored to a variable
if ($recs == 0)
سوال اول یک متغییر با رشته به طول 0 درست میکنه
سوال دوم
مقدار ایمیل رو escape میکنه یعنی توی ایمیل هر کجا که ' باشه قبلش یک \ lمیگزاره
سوال سوم چک میکنه که ایمیل در دیتابیس وجود دارد یا خیر

jalaladdin
دوشنبه 24 آبان 1389, 20:02 عصر
ممنونم از توضیحاتتان
حالا این تابع به چه معناست

mysql_num_rows

mysql_fetch_subject

funpatogh
دوشنبه 24 آبان 1389, 20:19 عصر
اولی تعداد سطر هایی که مطابق query ما هست رو میشماره
دومی هم خروجی رو به صورت object در میاره