使用phpmailer使用smpt发送邮件,dkim通过postfix



所以我使用的是使用smpt的phpmailer,它正在通过后缀发送电子邮件。当我通过电子邮件发送电子邮件时,在使用DKIM和DMARC时,它会顺利通过。但是当我使用phpmailer发送时,我没有收到DKIM。

<?php

function send_email($to, $from_email, $from_name, $subject, $body, 
$is_html=false, $attachments=null) {
global $smtp_host, $smtp_port, $smtp_user, $smtp_password;
try {
$email = new PHPMailer(true);
if ($from_email === $smtp_user) {
$email->isSMTP();
$email->Host = $smtp_host;
$email->Port = $smtp_port;
$email->SMTPAuth = true;
$email->Username = $smtp_user;
$email->Password = $smtp_password;
$email->SMTPSecure = 'tls';
}
$email->CharSet = 'UTF-8';
$email->From      = $from_email;
$email->FromName  = $from_email;
$email->Subject   = $subject;
$email->Body      = $body;
$email->AddAddress($to);
if ($is_html == true) {
$email->IsHTML(true);
$email->Encoding = 'base64';
}
if ($attachments != null) {
foreach ($attachments as $attachment) {
$apath = $attachment["path"];
$aname = $attachment["name"];
$email->AddAttachment($apath , $aname);
}
}
$email->Send();
$status = "success";
}
catch (phpmailerException $e) {
$status = $e->errorMessage();
}
catch (Exception $e) {
$status = $e->getMessage();
}
return $status;
}

所以我想我需要把这个添加到我的代码中,但我不确定是否必须把它添加到代码中。我在想opendkim会把DKIM添加到标题中。但事实并非如此。

$email->DKIM_domain = 'mydomain.com';
$email->DKIM_private = '/path/to/private_key';
$email->DKIM_selector = 'default'; 
$email->DKIM_passphrase = '1234567';

有几种方法可以实现DKIM签名。

  1. 使用PHPMailer中的这些属性,您的客户端脚本需要直接访问您的私钥。当您无法控制发送环境时(例如在共享主机上),这很好,但这意味着每个单独的发送脚本都要负责签名,这并不理想
  2. 让您的邮件服务器为您进行签名。当你有自己的邮件服务器并能够配置它时,这很好——所有通过它的邮件都可以自动签名,而且你不必在客户端做任何事情
  3. 在行中使用签名SMTP中继/代理服务器使用您现有的邮件服务器,例如适用于Windows的Hmailserver。当你有自己的邮件服务器,但没有管理员访问权限,或者它不能执行DKIM时,这很好

选择器需要与您签名时使用的密钥相匹配,因此,如果您有一个名为s1的选择器,则您希望该公钥在域的DNS中名为s1._domainkey的TXT记录中可用。匹配的私钥只需要在安全的地方,并且在服务器上无法访问网络。

DNS和密钥安排与您使用的任何签名机制相同。如果你使用PHPMailer的DKIM,你不需要openDKIM,但如果你想使用openDKIM,需要告诉它你想在它的配置中使用哪个选择器。一些邮件服务器(比如我使用的GreenArrow)允许通过自定义消息头动态控制选择器,但我认为OpenDKIM不支持这一点。您可以在后缀中设置允许类似操作的虚拟MTA。

对于PHPMailer参考,请查看所提供的DKIM签名示例以及测试套件中的DKIM测试。

最新更新