0

PHPのPEARMail拡張機能を使用して添付ファイル付きの電子メールを送信しようとすると、私のページでエラーが発生し続けます(エラー324-Chrome)。ページエラーは出ていますが、私は約800通の電子メールの1つを受け取ります。これが私が取り組んでいるものです:

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 = 'example@example.com';
                // 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部門に送信されます)-別名、1つの電子メールアドレスが複数の支店のステートメントを受信します。それらの各ステートメントから、ACCOUNTNUMBER_MM_DD_YYYY.pdfの形式ですでに作成されています。

だから私は単に本文に短いメッセージを入れて、毎月のステートメントを添付しようとしています。繰り返しになりますが、なぜ失敗するのかわかりません。スクリプトが停止しても、私は1通の電子メールを受信します(テストのために、現時点ではすべてを自分宛に送信しています)。誰かが私が問題を抱えている可能性がある場所を見ることができますか?

4

1 に答える 1

0

問題を発見しました。PHP 5.0以降では、同じインクルードファイルの複数のインスタンスを持つことはできません。別名Mail.phpは、ループしたときにインクルードされていました。ループの外に移動すると、問題は解決しました。

于 2012-07-02T18:38:03.103 に答える