Отправка DKIM подписанной электронной почты в Outlook.COM через PHP
У меня есть почтовый сервер, хорошо работающий с настройками SPF, DKIM и обратным DNS. Я могу отправить электронную почту на Outlook.com, используя что-то вроде:
echo "This is only a test" | mail [email protected]
Проблема возникает, когда я пытаюсь отправить электронную почту через PHP с использованием того же сервера:
$header .= "Return-Path: Some User <[email protected]>\r\n";
$header .= "From: Some User <[email protected]>\r\n";
$header .= "Content-Type: text/plain; charset=iso-8859-1\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "User-Agent: Some User Mail Sender\r\n";
$header .= "Content-Transfer-Encoding: 7bit\r\n";
mail("[email protected]","My title", "Message body", $header);
Я попытался проверить свое сообщение с помощью appmaildev.com, и в отчете говорится:
DKIM result: fail (wrong body hash: <*** body hash ***>)
Даже с этой ошибкой Outlook.com говорит, что он прошел проверку DKIM, но все сообщения, отправленные почтовой программой PHP, отправляются в папку нежелательной почты. Вот примеры сообщений, отправленных непосредственно через Bash и через PHP: http://pastebin.com/ndXJszic
Кто-нибудь может мне помочь?
Спасибо.
ИЗМЕНИТЬ
После удаления \r из заголовков ошибка хеша тела DKIM исчезла. Но я по-прежнему не могу отправлять электронные письма в Outlook...
Ответы
Ответ 1
Это может быть проблема с разрешением.
Ваш веб-сервер обычно работает как другой пользователь, чем когда вы используете mail
в командной строке, поэтому настройка заголовка From:
приведет к созданию дополнительных предупреждающих заголовков в исходящем письме.
Там файл, который вы можете изменить на своем сервере, называется /etc/mail/trusted-users
. Убедитесь, что пользователь apache
(или любой другой пользователь, с которым работает PHP скрипт работает как), появляется в этом файле; если нет, добавьте имя пользователя, а затем перезагрузите sendmail
.
Пример содержимого /etc/mail/trusted-users
:
# trusted-users - users that can send mail as others without a warning
# apache, mailman, majordomo, uucp, are good candidates
apache
Ответ 2
Во-первых, невозможно быть уверенным, что письмо не будет помечено как спам, единственный способ заключается в том, что человек, который получает электронное письмо, добавляет адрес отправителя в белый список.
SPF и DKIM предназначены только для того, чтобы гарантировать, что письмо поступает из этого домена или электронной почты, но не для того, чтобы гарантировать, что это не спам.
Система антиспама в outlook.com, как и многие другие, проверяет много вещей, например ip-адрес отправителя, количество сообщений электронной почты из этого ip в час, содержание электронной почты (текст, ссылки), репутацию и т.д..
В вашем примере вы не показываете содержимое тела, возможно, оно другое, и по этой причине одно письмо помечено как спам, а другое - нет.
Ответ 3
Попробуйте использовать "Грушевая почта" и создайте вокруг этого класс-оболочку. Я использую это с DKIM, и у меня нет проблем. Я должен упомянуть, что я также использую SpamAssassin (как упоминалось ранее) и ClamAV.
<?php
// Include the Pear Mail header
require_once '/usr/share/php/Mail.php';
class MailWrapper {
public static function Send($to, $subject, $body) {
// Email details
$from = 'No Reply <[email protected]>';
$server = 'mail.yourdomain.com';
$port = 25;
$username = '[email protected]';
$password = 'yourp4ssw0rd';
// Formalize mail server connection info
$headers = array('From' => $from,
'To' => $to,
'Subject' => $subject,
'Date' => date('r'),
'Return-Path' => $from,
'Content-Type' => 'text/html; charset=UTF-8',
'Content-Transfer-Encoding' => '7bit',
'Mime-Version' => '1.0',
'X-Mailer' => 'Your Company (https://yourdomain.com)',
'X-Accept-Language' => 'en',
'Message-ID' => sha1($body).'@yourdomain.com'
);
$connection = array('host' => $server,
'auth' => true,
'username' => $username,
'password' => $password
);
// Create the mail server connection
$smtp = Mail::factory('smtp', $connection);
// Send the message
$mail = $smtp->send($to, $headers, $body);
// Check for errors
if (PEAR::isError($mail)) {
echo '! [email] ['.time().'] Failed sending mail to "'.$to.'"'.PHP_EOL;
$result = false;
} else {
echo ' [email] ['.time().'] Mail sent to "'.$to.'"'.PHP_EOL;
$result = true;
}
return $result;
}
}
?>
Ответ 4
При устранении неполадок, связанных с доставкой почты, я использую проверку почты по адресу 25.
Он расскажет вам, что проходит/не проходит и как SpamAssasin оценивает ваше сообщение.
URL-адрес:
http://www.port25.com/support/authentication-center/email-verification/
Чтобы получать результаты непосредственно по любому адресу, адрес необходимо добавить к адресу check-auth. Например, чтобы отправить результаты: [email protected] образец сообщения должен быть отправлен на [email protected]
С помощью этого вы можете узнать, работает ли ваш DKIM правильно/проверен, и какова ваша оценка SpamAssasin.