не могу подписать письмо DKIM от php с помощью phpmailer

У меня проблема с отправкой DKIM подписанное письмо с PHPMailer (v 5.2.9).

SMTP-сервер, который я использую (realsender.com), должен подписывать каждое электронное письмо, которое я отправляю.
Это работает, когда я отправляю почту из программы Delphi, но вместо этого не работает с PHP.

Я проверил электронную почту, отправленную PHPMailer и Delphi с https://www.mail-tester.com

Результаты 10/10 для Delphi и 6,8 / 10 для PHP.

Это часть файла, который отправляет письмо с PHPMailer:

$mail = new PHPMailer();
$mail->CharSet = 'UTF-8';
$mail->setLanguage('it');
$mail->isSMTP();

$mail->Host = SMTP_HOST;
$mail->SMTPAuth = SMTP_AUTH;
$mail->Username = SMTP_USERNAME;
$mail->Password = SMTP_PASSWORD;
if (defined('SMTP_PORT')) {
$mail->Port = SMTP_PORT;
}
if (defined('SMTP_SECURE')) {
$mail->SMTPSecure = SMTP_SECURE;
}
if(defined('DKIM_DOMAIN')){
$mail->DKIM_domain=DKIM_DOMAIN;
$mail->DKIM_selector=DKIM_SELECTOR;
$mail->DKIM_private=DKIM_PRIVATE;
}
[...]//setting from, to, subject and body
$mail->send();

Обратите внимание $mail->send(); всегда возвращай истину.

Сначала я попытался отправить электронное письмо без указания свойства DKIM_, а затем попытался отправить их.
в обоих случаях результатом является неверный знак DKIM и оценка 6,8.

Я спросил службу поддержки SMTP, знают ли они что-то об этом, но они сказали, что это может быть проблемой самого PHPMailer.

Что я могу сделать, чтобы создать DKIM, который работает?

Заранее спасибо.

ОБНОВИТЬ:
Я обнаружил, что проблема в теле письма.
Я также перестал использовать DKIM_ vars, потому что мой SMTP-сервер автоматически подписывает все электронные письма.
отправка электронного письма пустая, без тегов или с тегами, но без текста, все в порядке (9,9), в противном случае — 6,8.
Также небольшое html письмо (со ссылками и ссылками) нормально.
Что бы это могло быть?

1

Решение

Я понял!
Мне пришлось разделить тело письма на маленькие куски (максимум 990 символов на кусок), причина (объяснено здесь: http://permalink.gmane.org/gmane.mail.postfix.user/223780) является:

Вероятной причиной сбоя является то, что отправляющее приложение генерирует электронную почту, несовместимую с RFC 5322 или RFC 5321 в некотором отношении.

Линии длиннее 990.

SMTP-клиент Postfix поддерживает длину строки ниже предела протокола SMTP, равного 1000 байт. Поскольку это изменение происходит после подписания, оно определенно нарушит подписи DKIM.

Чтобы избежать проблем с переносом длинных строк, отправляйте почту в кодировке цитируемой-печати или в формате base64 длиной не более 80 символов.

Это код, который я использовал для разделения строки:

function create_html_email_from_string($str){
if(!is_string($str)){
return false;
}
return '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><body>'
.html_long_lines_split($str).'</body></html>';
}

/**
* this function insert line endings (\r\n) after the ending of <br>, <p> and <div> tags because if you only use chunk_split_unicode it can break links and any other tags and css.
*/
function html_long_lines_split($str){
$str = str_ireplace(['<br>','<br/>','<br />'], "<br/>\r\n", $str);
$str = str_ireplace('</p>', "</p>\r\n", $str);
$str = str_ireplace('</div>', "</div>\r\n", $str);
//checks if there are lines longer than 990 bytes
$chunks=explode("\r\n", $str);
foreach ($chunks as $k=>$c) {
if(strlen($chunks[$k])>990){
$chunks[$k]=chunk_split_unicode($chunks[$k], 500);
}
}
return implode("\r\n", $chunks);
}

/**
* @link http://php.net/manual/en/function.chunk-split.php#107711<br>
*/
function chunk_split_unicode($str, $l = 76, $e = "\r\n") {
$tmp = array_chunk(
preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $l);
$str = "";
foreach ($tmp as $t) {
$str .= join("", $t) . $e;
}
return $str;
}

//$mail is an instance of PHPMailer
$mail->msgHTML(create_html_email_from_string($body));
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]