can';t使用phpmailer从php签署DKIM电子邮件
can';t使用phpmailer从php签署DKIM电子邮件,php,email,smtp,phpmailer,dkim,Php,Email,Smtp,Phpmailer,Dkim,我在使用PHPMailer(V5.2.9)发送签名电子邮件时遇到问题 我使用的SMTP服务器(realssender.com)应该对我发送的每封电子邮件进行签名。 当我从Delphi程序发送电子邮件时,它可以工作,但是它不适用于PHP 我已经用 Delphi的结果为10/10,PHP的结果为6.8/10。 这是使用PHPMailer发送电子邮件的文件的一部分: $mail = new PHPMailer(); $mail->CharSet = 'UTF-8'; $mail->setL
我在使用PHPMailer(V5.2.9)发送签名电子邮件时遇到问题 我使用的SMTP服务器(realssender.com)应该对我发送的每封电子邮件进行签名。
当我从Delphi程序发送电子邮件时,它可以工作,但是它不适用于PHP 我已经用
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_uuu属性的情况下发送电子邮件,然后我尝试使用它们发送电子邮件。
在这两种情况下,结果都是无效的DKIM标志,得分为6.8
我向SMTP支持人员询问了他们是否了解这方面的情况,但他们说这可能是PHPMailer本身的问题
如何创建一个有效的DKIM
提前谢谢
更新:
我发现问题出在电子邮件的正文中。
我也停止使用DKIM_uuvars,因为我的SMTP服务器会自动签署所有电子邮件。
发送空邮件、无标签或有标签但无文本都可以(9.9),否则分数为6.8。
还有一点html电子邮件(带有链接和div)也可以。
可能是什么?我知道了
我不得不将邮件正文分成小块(每块最多990个字符),原因(解释如下:)是:
造成中断的一个可能原因是发送应用程序生成的电子邮件在某些方面与RFC 5322或RFC 5321不兼容
超过990行
Postfix SMTP客户端将行长度保持在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));
函数从字符串($str)创建html电子邮件{
如果(!is_字符串($str)){
返回false;
}
返回“”
.html_long_line_split($str)。“”;
}
/**
*此函数用于在
、和标记的结尾之后插入行尾(\r\n),因为如果仅使用chunk\u split\u unicode,则可以断开链接和任何其他标记和css。
*/
函数html\u long\u line\u split($str){
$str=str_ireplace(['
'、'
'、'
']、“
\r\n”、$str);
$str=str\u-ireplace(“”、“\r\n”、$str);
$str=str\u ireplace(“”,“\r\n”,$str);
//检查是否有超过990字节的行
$chunks=explode(“\r\n”,$str);
foreach($k=>c的块){
if(strlen($chunks[$k])>990){
$chunks[$k]=chunk\u split\u unicode($chunks[$k],500);
}
}
返回内爆(“\r\n”,$chunks);
}
/**
*@linkhttp://php.net/manual/en/function.chunk-split.php#107711
*/
函数块分割unicode($str,$l=76,$e=“\r\n”){
$tmp=array\u块(
preg_split(“//u”,$str,-1,preg_split_NO_EMPTY),$l);
$str=”“;
foreach(tmp为$t){
$str.=join(“,$t)。$e;
}
返回$str;
}
//$mail是PHPMailer的一个实例
$mail->msgHTML(从字符串($body)创建html\u电子邮件);
您是否使用var\u dump
验证了DKIM.*
常量?请查看。此外,您还可以通过启用异常获得更多错误报告:$mail=new PHPMailer(true)代码>。最新的PHPMailer是5.2.10,尽管它没有与DKIM相关的更改。