2012-09-25 109 views
0

因此,我一直致力於一個項目,並且我有一個將電子郵件發送給選擇僱主的員工的功能。現在這個工作除了郵件功能(我使用WinHost,我們需要包括Mail.php爲了使郵件功能工作)它有時會發送3封電子郵件,而不是2,有時1封電子郵件,而不是2.在php中發送郵件的問題

代碼:

if (isset($_POST['openemailmem'])){ 
    $memberuser = $_POST['openemailmemusername']; 
    $sql = "SELECT email, username, password, status FROM csvdata WHERE memberview =:user "; 
    $getinfo=$DBH->prepare($sql); 
    $getinfo->execute(array(':user' => $memberuser)); 

    while ($row = $getinfo->fetch(PDO::FETCH_ASSOC)) { 
     $check = $row; 
     $newEmployeeEmail = $check['email']; 
     $csvusername = $check['username']; 
     $password = $check['password']; 
     $status = $check['status']; 

     if ($status == "Open"){ 
      echo "tesing"; 
      $from = "the email of where it is coming from is here but i removed"; 
      $to = $newEmployeeEmail; 
      if (!empty($_POST['cc'])){ 
       $cc = $_POST['cc']; 
      } 
      if (!empty($_POST['ccsend'])){ 
       $cc = $_POST['ccsend']; 
       $to .= ", $cc"; 
      } 
      $subject = "removed msg"; 
      $body = "removed msg"; 
      $host = "i removed"; 
      $username = "i removed"; 
      $password = "i removed"; 
      $headers = array ('From' => $from, 'To' => $to,'Cc' => $cc, 'Subject' => $subject); 
      $smtp = Mail::factory('smtp', array ('host' => $host, 'auth' => true, 'username' => $username, 'password' => $password)); 
      $mail = $smtp->send($to, $headers, $body); 
     }  
    } 

    header("Location: I removed this.php?getmsg=12"); 
    exit; 

} 

感謝您所有的時間!

+2

我修正了您的縮進。 – ceejayoz

+0

您是否檢查過您暗示的異常情況下數據庫中的數據? – Thomas

+0

你很好。 –

回答

1

您的解決方案很可能在您的日誌中。如果拋出異常,你可以在那裏找到它們。

另外一個建議:

添加日誌記錄之前和循環之後。所以,你的例子就變成:

if (isset($_POST['openemailmem'])) 
{ 
    $memberuser = $_POST['openemailmemusername']; 
    $sql  = "SELECT email, username, password, status " 
       . "FROM csvdata WHERE memberview =:user "; 
    $getinfo = $DBH->prepare($sql); 
    $getinfo->execute(array(':user' => $memberuser)); 

    $log_file = "/home/my/transaction.log"; 
    $now  = "[" . date("Ymd-His") . "] "; 

    $message = $now . "Starting loop..."; 
    error_log($message, 3, $log_file); 

    while ($row = $getinfo->fetch(PDO::FETCH_ASSOC)) 
    { 

     $check   = $row; 
     $newEmployeeEmail = $check['email']; 
     $csvusername  = $check['username']; 
     $password   = $check['password']; 
     $status   = $check['status']; 

     if ($status == "Open") 
     { 
      echo "tesing"; 
      $from = "the email of where it is coming from is here but i removed"; 
      $to = $newEmployeeEmail; 
      if (!empty($_POST['cc'])) 
      { 
       $cc = $_POST['cc']; 
      } 
      if (!empty($_POST['ccsend'])) 
      { 
       $cc = $_POST['ccsend']; 
       $to .= ", $cc"; 
      } 
      $subject = "removed msg"; 
      $body  = "removed msg"; 
      $host  = "i removed"; 
      $username = "i removed"; 
      $password = "i removed"; 
      $headers = array(
          'From' => $from, 
          'To'  => $to, 
          'Cc'  => $cc, 
          'Subject' => $subject, 
         ); 

      $now  = "[" . date("Ymd-His") . "] "; 
      $message = $now . "Before connecting to server - " . $to; 
      error_log($message, 3, $log_file); 

      $smtp = Mail::factory(
       'smtp', 
       array(
        'host'  => $host, 
        'auth'  => true, 
        'username' => $username, 
        'password' => $password, 
       ) 
      ); 

      $now  = "[" . date("Ymd-His") . "] "; 
      $message = $now . "After connecting to server - " . $to; 
      error_log($message, 3, $log_file); 

      $now  = "[" . date("Ymd-His") . "] "; 
      $message = $now . "Before sending email - " . $to; 
      error_log($message, 3, $log_file); 

      $mail = $smtp->send($to, $headers, $body); 

      $now  = "[" . date("Ymd-His") . "] "; 
      $message = $now . "After sending email - " . $to; 
      error_log($message, 3, $log_file); 
     }  
    } 

    $now  = "[" . date("Ymd-His") . "] "; 
    $message = $now . "End of loop"; 
    error_log($message, 3, $log_file); 

    header("Location: I removed this.php?getmsg=12"); 
    exit; 

} 

你可能會發現你的函數超時,取決於它取郵件多久派遣電子郵件到相關的主機。

從我看到的每個用戶都有一個(可能)唯一連接到郵件服務器,然後發送電子郵件。如果由於某種原因延遲建立連接,那麼你的腳本可能會很快超時。

您可以調整上述錯誤記錄方法以使用microtime,以便您可以看到每次迭代代碼之間的實時 - 當然,您需要在代碼塊之間添加更多日誌記錄。

如果您發現郵件服務器連接等確實存在延遲,您可以(如果您的要求允許)連接一次到一臺服務器並從那裏發送您的電子郵件。

HTH

+0

會讓你發佈謝謝!@ –

+0

好吧,所以我收到這個時,我呼應它 - [20120925-170523]循環結束 –

+0

所以最後一個語句(error_log一)執行,但沒有在兩者之間?它至少應該有第一條語句(啓動循環)。你沒有看到這些嗎?另外,請檢查您的$ memberuser變量是否正確填充。 –