-1

我已将站点从一台服务器迁移到另一台服务器。在旧服务器上,联系页面可以正常工作,而在新服务器上则不行。我已经联系了支持人员,他们向我发送了日志,其中没有显示任何内容,形成了一个不相关的未声明变量。我再次联系并发现正在生成另一个错误:

policy-violation_found_in_sent_message_"Contact_Form"

Policy:Bad_MIME:RC:1

有人可以帮忙吗?

大部分代码在下面,我看不到问题,在一台服务器上它工作正常,在另一台服务器上却没有。

谢谢你的帮助。

   if(isset($_POST['name'])){    //may have to change to see if a field was set instead


    $myEmail       = 'me@me.com'; //Email address where queries get sent.
    //errors already defined in init
    $name          = strip_tags(trim($_POST['name']));
    $email         = strip_tags(trim($_POST['email']));

    $subject = "Contact Form";

    $headers = "From: " .$email. "\r\n";
    $headers .= "Reply-To: " .$email. "\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

    //body of message
    $message1 = '<html><body>';
    $message1 .= '<table rules="all" style="border-color: #666;" cellpadding="10">';
    $message1 .= "<tr style='background: #eee;'><td><strong>Name:</strong> </td><td>" .$name. "</td></tr>";
    $message1 .= "<tr><td><strong>Email:</strong> </td><td>" .$email. "</td></tr>";
    $message1 .= "<tr><td><strong>Message:</strong> </td><td>" .$message. "</td></tr>";
    $message1 .= "</table>";
    $message1 .= "</body></html>";

if (mail($myEmail, $subject, $message1, $headers)) {

 //Whoop!
    } else {
        echo 'There was a problem sending the email.';
    }
}

我已经删除了字段和一些验证等,但这就是其中的大部分。

4

2 回答 2

1

Policy:Bad_MIME:RC:1是您的托管服务提供商设置的qmail_scanner的错误消息。它与 PHP 没有直接关系。

从它的源代码

  if (!$quarantine_event && $illegal_mime && $headers{'mime-version'} && $BAD_MIME_CHECKS) {
    $destring="problem";
    $quarantine_description="Disallowed  characters found in MIME headers" if (!$quarantine_description);
    $quarantine_event="Policy:Bad_MIME";
    $description .= "\n---perlscanner results ---\n$destring '$quarantine_description'\n found in message";
  }

所以基本上它不喜欢你的 MIME 标头中的某些字符。

我的猜测是它不喜欢这个\r角色,因为你似乎有这些,它会做这个检查

  if ($BAD_MIME_CHECKS && !$IGNORE_EOL_CHECK && /\r|\0/) {
    $illegal_mime=1;
    &debug("w_c: found CRL/NULL in header - invalid if this is a MIME message");
    &minidebug("w_c: found CRL/NULL in header - invalid if this is a MIME message");
  }

所以使用 just\n而不是\r\n可能会解决问题。

如果没有,您可以要求您的托管服务提供商至少提供调试消息,以便您能够调试问题所在。

或者放弃调试,使用另一个邮件服务器/邮件协议/发送类。


补充:似乎实际上甚至记录了 qmail 不接受\r\n,仅\n. PHP 手册还指出

如果未收到消息,请尝试仅使用 LF (\n)。一些 Unix 邮件传输代理(尤其是 qmail)会自动将 LF 替换为 CRLF(如果使用 CRLF,则会导致 CR 加倍)。这应该是最后的手段,因为它不符合 RFC 2822。

于 2013-08-27T14:48:22.193 回答
0

开始使用Swiftmailer,你的生活会更轻松。

使用示例:

require_once('swift/lib/swift_required.php');

$transport = Swift_MailTransport::newInstance();
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance()
    ->setFrom(array($from))
    ->setTo(array($to))
    ->setEncoder(Swift_Encoding::get7BitEncoding())
    ->setSubject($subject)
    ->setBody($body, 'text/html')
    ->addPart(strip_tags($body), 'text/plain')
    ->attach(Swift_Attachment::fromPath($filename))
;
$mailer->send($message);
于 2013-08-27T14:44:06.477 回答