2012-07-02 85 views
0

尝试使用PHP的PEAR Mail扩展发送带附件的电子邮件时,我的页面仍然出错(错误324 - Chrome)。尽管页面错误消失 - 我确实收到了大约800封电子邮件中的一封。这里就是我的工作:使用PEAR发送带附件的邮件时发生错误

function email_statements($type) { 
switch($type) { 
    // Determine the type of statement to be e-mailed 
    case 'monthly': 
     // Array holding all unique AP e-mail addresses 
     $ap_email_addresses = array(); 
     include('../path/to/db/connection/params.php'); 
     // Grab the unique AP e-mail address set to receive statements 
     $stmt = $mysqli->prepare("SELECT email FROM statements GROUP BY email ORDER BY email ASC"); 
     $stmt->execute(); 
     $stmt->bind_result($ap_email_address); 
     // Add unique e-mail address to AP E-mail Addresses array 
     while($row = $stmt->fetch()) $ap_email_addresses[] = $ap_email_address; 
     $stmt->close(); 
     $mysqli->close(); 
     // Verify we grabbed the e-mail addresses 
     if(count($ap_email_addresses) == 0) { 
      // Exit and return error code if unable to grab e-mail addresses 
      $return_message = 1; 
      exit; 
     } 
     // E-mail addresses grabbed - proceed 
     else { 
      // PDF formatted date 
      date_default_timezone_set('America/New_York'); 
      $formatted_date = date('m_d_Y'); 
      // Now we have the unique e-mail addresses - associate those with the account numbers 
      include('../path/to/db/connection/params.php'); 
      foreach($ap_email_addresses as $email_address) { 
       $file_names = array(); 
       $stmt = $mysqli->prepare("SELECT customer_number FROM statements WHERE email = ?"); 
       $stmt->bind_param("s", $email_address); 
       $stmt->execute(); 
       $stmt->bind_result($ap_account_number); 
       // Constructs the name of the statement (PDF) file to be sent 
       while($output = $stmt->fetch()) $file_names[] = $ap_account_number . '_' . $formatted_date . '.pdf'; 
       // Send e-mails 
       include('Mail.php'); 
       include('Mail/mime.php'); 
       // Include SMTP authentication parameters 
       include('../path/to/email/info.php'); 
       // Set the e-mail recipients 
       $recipients = '[email protected]'; 
       // Set the e-mail subject 
       $subject = 'Monthly Account Statement'; 
       // Create the e-mail body 
       $html = 
       '<html> 
        <body> 
         <p>Test E-mail</p> 
        </body> 
       </html>'; 
       // Construct the message headers 
       $headers = array(
        'From'   => $from, 
        'Subject'  => $subject, 
        'Content-Type' => 'text/html; charset=UTF-8', 
        'MIME-Version' => '1.0' 
       ); 
       $mimeparams = array(); 
       $mimeparams['text_encoding'] = '8bit'; 
       $mimeparams['text_charset'] = 'UTF-8'; 
       $mimeparams['html_charset'] = 'UTF-8'; 
       $mimeparams['head_charset'] = 'UTF-8'; 
       // Create a new instance 
       $mime = new Mail_mime(); 
       // Specify the e-mail body 
       $mime->setHTMLBody($html); 
       // Attach the statements (PDF) 
       foreach($file_names as $attached_file) { 
        $file = '../path/to/the/pdf/file/' . $attached_file; 
        $file_name = $attached_file; 
        $content_type = "Application/pdf"; 
        $mime->addAttachment ($file, $content_type, $file_name, 1); 
       } 
       // Create the body 
       $body = $mime->get($mimeparams); 
       // Add the headers 
       $headers = $mime->headers($headers); 
       // Create SMTP connect array to be passed 
       $smtp = Mail::factory('smtp', array ('host' => $host, 'port' => $port, 'auth' => true, 'username' => $username, 'password' => $password)); 
       // Send the message 
       $mail = $smtp->send($recipients, $headers, $body); 
       if(PEAR::isError($mail)) echo 'Error'; 
       else echo 'Sent'; 
       // Close this account and cycle through the rest 
       $stmt->close(); 
      } 
      $mysqli->close(); 
     } 
     break; 
} 

}

现在,我想也许我没有给脚本足够的时间来执行 - 所以我将它高得离谱set_time_limit(99999999),以确保它有足够的时间尽管它通常在10-15秒内超时。所以基本上它是这样工作的,我有一个内部DB存储客户帐号和电子邮件地址。帐户可以具有相同的电子邮件地址(将其发送到其公司的AP部门) - 也就是一个电子邮件地址接收多个分支机构的报表。从它们的每个语句已经构建,格式为ACCOUNTNUMBER_MM_DD_YYYY.pdf。

所以我只是试图在正文中留言,并附上月报表。再次,不知道为什么它失败了,即使脚本停止,我确实收到其中一封电子邮件(我现在将它们全部发给自己,以便测试)。任何人都可以看到我可能有问题吗?

回答

0

我发现了这个问题。从PHP 5.0开始,你不能拥有同一个包含文件的多个实例 - 也就是说Mail.php被包含在循环中。一旦它被移出循环之外,问题就解决了。