无法使用phpmailer

时间:2015-07-23 14:40:24

标签: php email smtp phpmailer dkim


我在使用 PHPMailer (v 5.2.9)发送 DKIM 签名电子邮件时遇到问题。

我使用的SMTP服务器(realsender.com)应该对我发送的每封电子邮件进行签名 它在我从Delphi程序发送电子邮件时起作用,但它不适用于 PHP

我已经检查了PHPMailer和Delphi发送的电子邮件https://www.mail-tester.com

结果是Delphi的10/10和PHP的6.8 / 10.

这是使用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();始终返回true。

首先,我试图在不设置DKIM_属性的情况下发送电子邮件,然后我尝试与他们一起发送 在这两种情况下,结果都是无效的DKIM标志,得分为6.8。

如果他们对此有所了解,我已经向SMTP支持部门询问过,但他们说这可能是PHPMailer本身的问题。

如何创建有效的DKIM?

提前致谢。

更新
我发现问题出在电子邮件正文中 我也停止使用DKIM_ vars,因为我的SMTP服务器会自动签署所有电子邮件 发送电子邮件为空,没有标签或标签,但没有文字,一切正常(9.9),否则得分为6.8。
还有一个小的HTML电子邮件(带链接和div)是可以的 它可能是什么?

1 个答案:

答案 0 :(得分:2)

我明白了! 我不得不将邮件的主体分成小块(每块最多990个字符),原因(在此解释:http://permalink.gmane.org/gmane.mail.postfix.user/223780)是:

  

可能导致破损的原因是发送应用程序在某些方面生成的电子邮件与RFC 5322或RFC 5321不兼容。

     

超过990的行。

     

Postfix SMTP客户端使行长度低于SMTP协议限制1000字节,包括。由于此更改在签名后发生,因此肯定会破坏DKIM签名。

     

为避免长线存在问题,请使用quoted-printable或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));