2016-05-24 50 views
0

我想在用戶註冊時在PHP中實現簡單的電子郵件驗證。我擁有大部分工作,但在使用郵件功能時遇到問題。調用郵件後永久刷新PHP頁面()

我有一個通過POST發送數據到同一個php頁面(index.php)的窗體。表單正確提交信息,頁面正確接收信息。當我包含對mail()的調用時,電子郵件發送正確並最終放入我的收件箱中,但它會在重新加載之前使頁面掛起(chrome的開發工具表示其掛起)1分鐘。

下面是相關代碼:

if (!empty($_POST['reguser']) && !empty($_POST['regpass'])) { 

    $username = $userConn->real_escape_string($_POST['reguser']); 
    $password = password_hash($userConn->real_escape_string($_POST['regpass']), PASSWORD_DEFAULT); 
    $email = $userConn->real_escape_string($_POST['email']); 
    $hash = md5(rand(0,1000)); 


    $sql = "SELECT * FROM users WHERE Username = '".$username."'"; 
    $uniqueResult = $userConn->query($sql); 

    if ($uniqueResult->num_rows == 1) { 
    echo "Name already taken"; 
    } else { 
    $registerSQL = "INSERT INTO users (Username, Password, EmailAddress, ActivationHash) VALUES('".$username."', '".$password."', '".$email."', '".$hash."')"; 
    $registerResult = $userConn->query($registerSQL); 

    if ($registerResult) { 

     $to = $email; 
     $subject = 'Website| Verification'; 
     $message = ' 
     You have successfully signed up for Website!<br /><br /> 

     To activate your account please <a href="http://Website.com/verify.php?email='.$email.'&hash='.$hash.'">click here</a> or paste the following link into your browser bar:<br /><br /> 

     http://Website.com/verify.php?email='.$email.'&hash='.$hash.' 
     <br /><br /> 
     Thanks! 
     '; 

     $headers = 'From: [email protected]' . "\r\n" . "MIME-Version: 1.0\r\n" . "Content-Type: text/html; charset=ISO-8859-1\r\n"; 
     mail($to, $subject, $message, $headers); 
     echo "<meta http-equiv='refresh' content='=2;index.php' />"; 

    } else { 
     echo "Registration failed"; 
    } 
    } 
} 

當我使用的開發工具,它告訴我,網頁到底需要一分鐘的時間重新加載,所以我的猜測是其超時檢查頁面。但是,郵件仍然能夠成功地到達所需的地址。

任何想法可能會出錯?

+0

建議查看PHP [Gearman](http://php.net/manual/en/gearmanclient.addtaskbackground.php)或將請求傳遞給Curl以發送電子郵件。或者,查看您使用的電子郵件服務器的配置(如果可以的話)。我猜測有一些反垃圾郵件設置會造成延遲或缺少返回信息(因此超時)。 – Tigger

+0

首先,請避免使用PHP的內置'mail()'函數。能力嚴重受限。只要您在代碼中手動構建郵件標題,您應該考慮使用預先構建的庫,如phpMailer或Swiftmailer。其次,我建議使用第三方郵件提供商實際提供郵件,而不是您的Web服務器;這會將任何處理延遲從您的前端移開。 (注意,'mail()'函數不能做到這一點,但phpMailer/Swiftmailer可以,使用它們的另一個很好的理由)。對於郵件投遞,您可以使用Gmail或其他許多應用程序。 – Simba

回答

1

我的建議是使用郵件隊列,而不是立即發送電子郵件。一旦新用戶創建了添加記錄到郵件隊列表。使用單獨的cron PHP腳本使用郵件隊列表中的記錄發送電子郵件。