【问题标题】:dkim=softfail with mail() but not with phpmailer?dkim=softfail 与 mail() 但不是与 phpmailer?
【发布时间】:2015-02-14 00:14:39
【问题描述】:

我有一台运行邮件软件的服务器。本软件使用phpmailer。 如果我通过这个软件发送电子邮件没有问题,我会收到SPF=PASS 和DKIM=PASS。

但是,当我尝试使用仅使用 mail() 的常规 PHP 文件时,我收到带有 dkim=softfail (fail, body has been altered) header.i=@example.com 错误的电子邮件。以下是具体内容。

我在网上查了几个小时,但我发现的只是 RFC 规范的链接,说这个问题是由诸如“超过 990 字节的行”或“格式错误的行尾”之类的东西引起的(两者都没有在这里申请,因为我使用chunk_split())。

什么可能导致我的代码中的 DKIM 出现此问题?还有其他我忽略的 RFC 规范吗?

**PHP script I use:**

//build array with headers
$header = array();
$boundary = md5(uniqid(rand()));
$header[] = "MIME-Version: 1.0";
$header[] = "Content-Type: multipart/alternative; boundary = $boundary";
$header[] = "From: Me <me@example.com>";

// get html version
ob_start();
include('html.php');
$Html = ob_get_contents();
ob_end_clean();

// get TXT version
ob_start();
include('txt.php');
$Txt = ob_get_contents();
ob_end_clean();

// Build final message body
// TXT part of message
$body = "--$boundary\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding: base64\r\n";
$body .= chunk_split(base64_encode($Txt));

// HTML part of message
$body .= "--$boundary\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Transfer-Encoding: base64\r\n";
$body .= chunk_split(base64_encode($Html));
$body .= "--$boundary--";

// sent email
$isMailed = mail("me@example.com","=?UTF-8?B?".base64_encode($subject)."?=",$body, implode("\n", $header));

编辑:为了帮助解决这个问题,这是我使用上述脚本获得的示例电子邮件标题:

Return-Path: <apache@example.com>
Delivered-To: me@example.com
Received: from localhost (mx1.example.com [127.0.0.1])
    by mx1.example.com (Postfix) with ESMTP id 4E50FBF31F
    for <me@example.com>; Tue, 16 Dec 2014 16:54:43 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at mx1.example.com
Authentication-Results: mx1.example.com (amavisd-new);
    dkim=softfail (fail, body has been altered) header.i=@example.com
Received: from mx1.example.com ([127.0.0.1])
    by localhost (mx1.example.com [127.0.0.1]) (amavisd-new, port 10024)
    with ESMTP id o8MXZhIlf1tF for <me@example.com>;
    Tue, 16 Dec 2014 16:54:42 +0100 (CET)
Received: from example.com (example.com [123.23.45.67])
    by mx1.example.com (Postfix) with SMTP id 92A21AF218
    for <me@example.com>; Tue, 16 Dec 2014 16:54:41 +0100 (CET)
Received: from localhost (mailsvr [127.0.0.1])
    by example.com (Postfix) with ESMTP id 895B51018227
    for <me@example.com>; Tue, 16 Dec 2014 16:56:23 +0100 (CET)
X-Virus-Scanned: amavisd-new at example.com
Received: from example.com ([127.0.0.1])
    by localhost (mailsvr.example.com [127.0.0.1]) (amavisd-new, port 10024)
    with LMTP id gm+3YJEGgEc7 for <me@example.com>;
    Tue, 16 Dec 2014 16:56:22 +0100 (CET)
Received: by example.com (Postfix, from userid 47)
    id A973B317802E; Tue, 16 Dec 2014 16:56:20 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=example.com;
    s=default; t=1418745380;
    bh=wL3reSbwXm4SPw5A8n9RooRKg+7j0rkM5+iBCFG51XI=;
    h=To:Subject:MIME-Version:Content-Type:From:Message-Id:Date;
    b=BALRnjP3rx8LcYUxvrLBSASiZyFgA5ckTvGHoKF4V+o8JOLtLTmpmPQS91ohHIwOq
     UFRhv6qJl9ObvFWl0c6QyVthGjCz2+2vB6RkMXQxzJgwxPIe6X51iIEDxA4Y3EYs+x
     0DxmjMTt5tNKNBrjvEtZiEolkfbua8cearxA/Q3M=
To: me@example.com
Subject: =?UTF-8?B?dGVzdA==?=
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary = 47eacbbcbff31a13d0894e4f9ac0450b
From: Me <me@example.com>
Message-Id: <20141216155620.A972B387802D@example.com>
Date: Tue, 16 Dec 2014 16:56:20 +0100 (CET)

--47eacbbcbff31a13d0894e4f9ac0450b
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

dGVzdA==
--47eacbbcbff31a13d0894e4f9ac0450b
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64

PGh0bWw+PGhlYWQ+PC9oZWFkPg0KPGJvZHk+DQo8cD50ZXN0PC9wPg0KPC9ib2R5Pg0KPC9odG1s
Pg==
--47eacbbcbff31a13d0894e4f9ac0450b--

【问题讨论】:

  • 这段代码显然没有进行 DKIM 签名 - 那是什么?
  • 无论如何,您都不应该手动构建 mime 电子邮件。使用 PHPMailer 或 Swiftmailer,这将使您的大部分代码变得多余。
  • @MarcB 是的,可能是真的。但是,这里的问题是为什么我的脚本会导致dkim=softfail。我刚刚测试了一个简单的mail("me@example.com","test","test");,电子邮件通过了。所以一定是在上面的脚本中导致了软故障,因为 PHP mail() 函数本身并没有造成问题。我的猜测是它与格式有关,就像在不同的在线答案中指出的那样,除了我无法弄清楚我遵循了那些已经指出的 RFC 规则(如我的帖子中提到的) )。

标签: php email phpmailer dkim


【解决方案1】:

你的服务器是什么?您使用的是什么类型的邮件服务器?

任何仍在运行 dkim-milter 的人都可以切换到 OpenDKIM 在几分钟内 - 保留您现有的密钥、DNS 设置、 等等

例如,如果您运行的是 CentOS 6,如果您启用了 EPEL 可以做"yum install opendkim",它会安装最新的 具有最常见默认值的 OpenDKIM 发行版 配置,包括一组服务器的默认密钥。这 opendkim 包在 Fedora 14-17 和 EL 5-6。

第二种故障排除方法: 如果您使用 \n 作为换行符(例如标题行的结尾)。但是你必须使用\r\n。这为我解决了!

【讨论】:

  • 第二种方法:如果我尝试使用\r\n 发送消息,我会收到一条错误消息,指出标题中不允许使用 CR 字符。
猜你喜欢
  • 2012-09-30
  • 2014-09-27
  • 2020-05-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多