2012-02-14 58 views
0

我對PHP非常陌生,我的第一個項目是開發評論系統。所以現在它很棒,但我想給評論者提供在發表新評論時收到電子郵件的選擇。首先,我決定在我的表格中創建另一行: 'email_notifications'。在評論表單的submit.php中。當有新評論時通過電子郵件發送人

對方的電子郵件大家....我wan't使用方法:

$emails = mysql_query("SELECT * FROM email_notifications"); 
while($row=mysql_fetch_assoc($emails)) { 
mail($row['email'],'New Comment on...','There was a new comment o....',"From: [email protected]"); 
} 

我什至不知道這會工作。但我首先擔心的是,它會不止一次地向人們發送電子郵件。 因爲,如果人們用同一封電子郵件多次發表評論,當它通過所有電子郵件的數據庫時,不會僅僅通過電子郵件發送該電子郵件。這是我最擔心的問題。無論如何,每當發生新評論時,如果有人發送新評論而沒有發送電子郵件的人不止一次,就可以發送電子郵件給他們。

摘要(我想要完成的任務):

有人提出評論。上述
2.每個人都有一個電子郵件

我希望我自己清楚。如果沒有,我很抱歉。提前致謝。請記住,即時通訊依然是初學者:)

回答

0

假設你的表包含了每個人的電子郵件地址,這應該工作:

$emails = mysql_query("SELECT * FROM email_notifications"); 

while($row=mysql_fetch_assoc($emails)) { 

    $subject = "There was a new comment"; 
    $message = "[email protected]"; 

    mail($row['email'],$subject,$message); 
} 

不過,我會嘗試使用準備Statments存儲Proceedures您的數據庫調用。

繼承人使用預處理語句同樣的例子:

$mysqli=new mysqli("server", "username", "password", "database"); 
$stmt = $mysqli->prepare("SELECT email FROM email_notifications"); 
$stmt->execute(); 
$stmt->bind_result($email); 
while($stmt->fetch()){ 

    $subject = "There was a new comment"; 
    $message = "[email protected]"; 

    mail($email,$subject,$message); 
} 
+0

看到編輯,使用準備好的陳述添加了示例 – 2012-02-14 04:18:22

+0

雖然我仍然需要$ email變量,對吧? – Shawn31313 2012-02-14 04:22:15

+0

@ Shawn31313不,我把它清理乾淨。你甚至不必像以前那樣申報$ email – 2012-02-14 04:24:19

0

我不會電子書籍把mail()功能的循環中,有一種可能性,在很短的timestan創造太多的郵件,這可能會導致在你的域名被視爲垃圾郵件發送者。

在你的代碼中創建新的評論,你可以跟蹤所有不同的標識符所生成的一個前所有評論:

$query = mysql_query("SELECT DISTINCT `userId` FROM `comments` WHERE `object` = {$yourObject} AND `userId` != {$currentUser}"); 

這將選擇除了誰發佈的最新評論的用戶的所有用戶標識符。然後,您必須在適當的表格中創建通知,注意重複,以防止出現多個相同的通知。

最後一部分是在您的服務器上創建郵件隊列腳本,它將緩慢發送通知。有很多方法可以做到這一點,我更喜歡通過crontab(如果尚未啓動)啓動的CLI腳本。在那裏,有一個無限循環週期,睡眠時間爲5秒到1分鐘(如果沒有發現通知),並且發送一個簡單的mail()。下面是基於現有CLI腳本即興例如:

#!/usr/bin/php -q 
<?php 

// acquire a process id file or prevent launching a second instance. 
$filename = "/path/to/mailer.pid"; 
$file = fopen($filename, 'w+'); 
if (!flock($file, LOCK_EX + LOCK_NB)) exit(0); 

// force an uninterruptable script 
ignore_user_abort(true); 
set_time_limit(0); 

// mysql connection routines somewhere here 

while (true) { 
    $query = mysql_query("SELECT * FROM `mail_notifications` ORDER BY `timestamp` ASC LIMIT 0, 1"); 
    if (!mysql_num_rows($query)) { 
     // Oh, no notifications pending. Take a little break 
     sleep(60); 
     continue; 
    } 
    $data = mysql_fetch_assoc($query); 
    // your mailing magic here 
    sleep(5); 
} 

?> 

嚴肅的人寫的,可啓動作爲後臺POSIX兼容的腳本,我沒有衝動去嘗試,雖然。無限循環是一件危險的事情,但至少對我來說很有用。

相關問題