2011-04-07 171 views
0

如何驗證訪問者在我的網站上註冊時,他/她使用的電子郵件是否有效。我想通過電子郵件向他們發送一個鏈接,他們可以點擊來證明他們的會員資格,這怎麼辦?使用PHP驗證電子郵件

+0

你想驗證電子郵件ID還是要檢查電子郵件ID是否存在? – Sourav 2011-04-07 03:04:38

+0

這主要取決於你的託管解決方案什麼是最好的答案在這裏,但你可以先看看PHPMailer – therealsix 2011-04-07 03:07:09

+0

可能重複的[簡單的方法爲PHP電子郵件驗證鏈接。](http://stackoverflow.com/questions/3794959/ – 2011-04-07 06:53:10

回答

5

在較高的水平,你想要做的是大致有以下幾種:

  • 當用戶註冊,創建一個祕密代碼,用戶無法弄清楚自己
    • 這可是隨機分配的,像一個隨機字符串
    • 這也可以是你可以用程序計算(但用戶不能)像用戶電子郵件地址的MD5連接到一個祕密字符串;這樣做可以節省您的數據庫列,因爲你就不必存儲它
  • 保存的密碼,並將其發送給用戶一個鏈接的形式在電子郵件
  • 設置在收聽該鏈接,如果代碼匹配,「激活用戶」

至於如何做到這一步一步,tutorials abound

1

如果你使用PHP 5.2或更高版本,一種選擇是filter_var功能...

if (filter_var('[email protected]', FILTER_VALIDATE_EMAIL) !== FALSE) 
+0

儘管關於FILTER_VAL – kylex 2011-04-07 03:07:10

+0

的蹩腳部分,我不認爲他只是想驗證電子郵件的格式。他想驗證電子郵件是屬於用戶的真實電子郵件地址。所以,他想發送帶有用戶必須點擊的鏈接的確認電子郵件。如果用戶輸入一個虛假的電子郵件,他不能驗證他的帳戶並登錄。 – squawknull 2011-04-07 03:08:05

2

創建一個獨特的隨機數,並將其存儲在他們旁邊的用戶ID的表。向他們發送帶有指向接受隨機數的頁面鏈接的消息作爲輸入。如果他們有正確的隨機數字,那麼標記他們的帳戶活躍。

-2

我在某個時間點做了類似的事情,但是我不必驗證用戶是否存在,我確實需要驗證格式以及它是否爲真實域(scrub [email protected] )。你可以看看我的功能,並從那裏開始。

//Verify formatting 
function verify_email($email){ 

    if(!preg_match('/^[_A-z0-9-]+((\.|\+)[_A-z0-9-]+)*@[A-z0-9-]+(\.[A-z0-9-]+)*(\.[A-z]{2,4})$/',$email)){ 
     return false; 
    } else { 
     return $email; 
    } 
} 

//Verify MX records exist 
function verify_email_dns($email){ 

    // This will split the email into its front 
    // and back (the domain) portions 
    list($name, $domain) = split('@',$email); 

    if(!(checkdnsrr($domain,'MX') || checkdnsrr($domain, 'A'))){ 

     // No MX record found 
     return false; 

    } else { 

     // MX record found, return email 
     return true; 

    } 
} 

您還可以檢查此stack question

+1

另外,none.com的傢伙將不高興,這是一個真正的域名(即使人們繼續使用它,就好像它不是)。你的意思是'example.com'? – Piskvor 2011-04-07 13:27:06

+0

和我對@Sourav說的。至少你包括.info和.mobi,但是嘿,「.travel不存在(2001!),.museum不存在(2001!),.рф不存在(2010),la la la」 。 – Piskvor 2011-04-07 13:37:14

+1

請**請**不要這樣做。這是一個可怕的想法。接受用戶輸入的任何電子郵件地址,只要它包含@和句點,並通過**向他們發送電子郵件**進行驗證。我對過分熱心/破壞的電子郵件地址驗證感到厭倦。 – meagar 2011-04-07 13:48:26

1

要去下列方法處理。

用戶註冊。 數據庫更新了其詳細信息並添加了一個用於激活/未激活的標誌。 電子郵件發送到帶鏈接的註冊電子郵件地址。 鏈接轉到可確認電子郵件地址有效的頁面並更新數據庫。

不知道你的工作環境和做出一些假設,這大致是你如何去做的。

我假設您已經堅持用戶註冊? 您提供以下將要產生某種形式的散列和與用戶/成員細節一起插入此...

$hash = substr(md5(uniqid()), 0, 5); 

你在構建郵件視圖與PHPMailer的或類似的發送它有信心? 如果是這樣,這樣做,與一個鏈接,當它的命中,將抓住member_id和member_hash,如下所示... 我在這裏再次使用PDO,這麼多方式來做你想要的...什麼最適合你。

// PDO Instance 
$pdo = $this->actionServer->getDataSource('PDO'); 

$findMember = $pdo->prepare('SELECT * FROM member WHERE member.member_id = :memberId AND member.member_hash = :memberHash AND hidden = 1'); 
$findMember->bindParam(':memberId', $memberId); 
$findMember->bindParam(':memberHash', $memberHash); 
$findMember->execute(); 
$findMemberResult = $findMember->fetch(PDO::FETCH_ASSOC); 

if (empty($findMemberResult)) { 
    $this->log->error('Could not find member based on ID and Hash combination'); 
    throw new HTTPException(404); 
} 

/** 
* Could use a method like below to approve 
*/ 

protected function approveMember($memberId, $pdo) { 
    $sql = 'UPDATE member SET member.hidden = 0 WHERE member.member_id = :memberId'; 
    $updateMember = $pdo->prepare($sql); 
    $updateMember->bindParam(':memberId', $memberId); 
    $updateMember->execute(); 
} 

希望有幫助!

Cheerio