PEAR Mail、Mail_Mime 和 headers() 覆盖

Posted

技术标签:

【中文标题】PEAR Mail、Mail_Mime 和 headers() 覆盖【英文标题】:PEAR Mail, Mail_Mime and headers() overwrite 【发布时间】:2011-06-24 04:01:25 【问题描述】:

我目前正在编写一个提醒 php 脚本,该脚本将通过 Cronjob 每天调用一次,以便通知客户有关某事的信息。

因此我使用 PEAR Mail 功能,并结合Mail_Mime。首先,该脚本在 mysql 数据库中搜索用户。如果$num_rows > 0,它正在创建一个新的Mail 对象和一个新的Mail_mime 对象(本文中包含的代码从这里开始)。问题现在出现在 while 循环中。

确切地说:问题是

$mime->headers($headers, true);

作为医生。状态,第二个参数应该覆盖旧的标题。但是,所有外发邮件都带有来自第一个用户的标头 ($header['To'])。

我真的为这件事快疯了……有什么建议吗?

(注意:但是,在为每个用户调用 $mime = new Mail_mime() 时它会发送正确的标头 - 但它应该只调用一次然后覆盖旧标头)

代码:

// sql query and if num_rows > 0 ....

require_once('/usr/local/lib/php/Mail.php');
require_once('/usr/local/lib/php/Mail/mime.php');

ob_start();
require_once($inclPath.'/email/head.php');
$head = ob_get_clean();

ob_start();
require_once($inclPath.'/email/foot.php');
$foot = ob_get_clean();

$XY['mail']['params']['driver'] = 'smtp';
$XY['mail']['params']['host'] = 'smtp.XY.at';
$XY['mail']['params']['port'] = 25;

$mail =& Mail::factory('smtp', $XY['mail']['params']);

$headers = array();
$headers['From'] = 'XY <service@XY.at>';
$headers['Subject'] = '=?UTF-8?B?'.base64_encode('Subject').'?=';
$headers['Reply-To'] = 'XY <service@XY.at>';

ob_start();
require_once($inclPath.'/email/templates/files.mail.require-review.php');
$template = ob_get_clean();

$crfl = "\n";
$mime = new Mail_mime($crfl);
while($row = $r->fetch_assoc())
    $html = $head . $template . $foot;

    $mime->setHTMLBody($html);

    #$to = '=?UTF-8?B?'.base64_encode($row['firstname'].' '.$row['lastname']).'?= <'.$row['email'].'>'; // for testing purpose i'm sending all mails to webmaster@XY.at
    $to = '=?UTF-8?B?'.base64_encode($row['firstname'].' '.$row['lastname']).'?= <webmaster@XY.at>';
    $headers['To'] = $to; // Sets to in headers to a new

    $body = $mime->get(array('head_charset' => 'UTF-8', 'text_charset' => 'UTF-8', 'html_charset' => 'UTF-8'));
    $hdrs = $mime->headers($headers, true); // although the second parameters says true, the second, thrid, ... mail still includes the To-header form the first user

    $sent = $mail->send($to, $hdrs, $body);
    if (PEAR::isError($sent)) 
        errlog('error while sending to user_id: '.$row['id']); // personal error function
     else 
        // Write log file
    
   

【问题讨论】:

【参考方案1】:

没有理由保留旧对象而不创建新对象。 正确使用 OOP 并创建新对象 - 您不知道它们在内部是如何工作的。

【讨论】:

问题是服务器上的旧版本,由于一些 - 非常奇怪 - 配置问题,$overwrite 参数被忽略了。

以上是关于PEAR Mail、Mail_Mime 和 headers() 覆盖的主要内容,如果未能解决你的问题,请参考以下文章

使用 PEAR 的 Mail_Mime 时,附加 HTML 图像时文本部分不起作用

带有附件的梨邮件在 $mime = new Mail_mime 处失败

使用 PEAR 邮件发送测试消息时出现错误消息

PHP Pear Mail 无法发送带有 Unicode 字符的名称

使用 Mail_Mime 将附件发送到 GMail,接收“无名”附件

PHP Mail_Mime:如何在电子邮件正文中正确使用 encodeHeader()