2014-12-15 5 views
3

У меня есть сервер, на котором выполняется почтовое программное обеспечение. Это программное обеспечение использует phpmailer. Если я отправлю электронное письмо с помощью этого программного обеспечения, у меня нет проблем, я получаю SPF=PASS, а также DKIM=PASS.dkim = softfail с почтой(), но не с phpmailer?

Однако, когда я пытаюсь использовать обычный PHP-файл, который просто использует mail(), я получаю письмо с ошибкой dkim=softfail (fail, body has been altered) [email protected]. Ниже приведены особенности.

Я проверил онлайн в течение нескольких часов, но все, что я нашел, было ссылкой на спецификации 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 <[email protected]>"; 

// 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("[email protected]","=?UTF-8?B?".base64_encode($subject)."?=",$body, implode("\n", $header)); 

EDIT: чтобы помочь решить эту проблему, вот образец заголовок электронной почты, который я получаю с вышеприведенным сценарием:

Return-Path: <[email protected]> 
Delivered-To: [email protected] 
Received: from localhost (mx1.example.com [127.0.0.1]) 
    by mx1.example.com (Postfix) with ESMTP id 4E50FBF31F 
    for <[email protected]>; 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) [email protected] 
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 <[email protected]>; 
    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 <[email protected]>; 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 <[email protected]>; 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 <[email protected]>; 
    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: [email protected] 
Subject: =?UTF-8?B?dGVzdA==?= 
MIME-Version: 1.0 
Content-Type: multipart/alternative; boundary = 47eacbbcbff31a13d0894e4f9ac0450b 
From: Me <[email protected]> 
Message-Id: <[email protected]> 
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-- 
+0

Этот код, очевидно, не выполняет подпись DKIM - так что это? – Synchro

+0

Вы не должны создавать mime-сообщения вручную в любом случае. Используйте PHPMailer или Swiftmailer, который сделает большую часть вашего кода избыточным. –

+0

@MarcB Да, может быть, правда. Однако здесь возникает вопрос, почему мой сценарий вызывает 'dkim = softfail'. Я просто протестировал простую «почту» («[email protected]», «test», «test»); 'и письмо приходит с помощью PASS. Поэтому в приведенном выше сценарии должно быть что-то, что-то вызывает softfail, поскольку функция PHP 'mail()' сама не создает проблему. Я предполагаю, что это имеет какое-то отношение к формату, точно так же, как указано в разных онлайн-ответах, за исключением того, что я не могу понять, что, следуя тем правилам RFC, которые были указаны (как упоминалось в моем сообщении). – koljanep

ответ

0

Что ваш сервер? какой тип почтового сервера вы используете?

Тот, кто еще работает DKIM-Milter может поменять к OpenDKIM в считанные минуты - сохраняя существующие ключи, настройки DNS, и т.д.

Если вы работаете CentOS 6, например, если у вас есть EPEL, позволяющий вам может просто сделать "yum install opendkim", и он установит последнюю версию OpenDKIM с наиболее распространенной конфигурацией по умолчанию , включая набор стандартных ключей для вашего сервера. Пакет opendkim доступен в стабильных репозиториях для Fedora 14-17 и EL 5-6.

Второй метод устранения неполадок: , если вы используете \ n для новой строки (например, конец строки заголовка). Но вы должны использовать \ r \ n. Это решило это для меня!

+0

Повторный метод: если я пытаюсь отправить сообщение с помощью '\ r \ n', я получаю сообщение об ошибке, когда символ CR не разрешен в заголовке. – koljanep