使用phpmailer通过SMTP发送邮件,经由Postfix传递并使用DKIM。

3

我正在使用phpmailer通过SMTP发送电子邮件,它经过postfix发送。当我从我的邮箱发送电子邮件时,使用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';

我也不确定是否需要使用第二组代码。在我的dns上,我可以使用2个不同选择器的公钥,这会影响发出的电子邮件吗? - willis
1个回答

2
有几种方法可以实现DKIM签名:
  1. 使用PHPMailer中的这些属性,其中您的客户端脚本需要直接访问您的私钥。当您无法控制发送环境时很好 - 例如在共享主机上,但这意味着每个单独的发送脚本都负责签名,这并不理想。
  2. 让您的邮件服务器为您签名。当您拥有自己的邮件服务器并且能够对其进行配置时很好 - 所有通过它发送的邮件都可以自动签名,您不必在客户端端做任何事情。
  3. 使用与现有邮件服务器相连的签名SMTP中继/代理服务器,例如Hmailserver for Windows。当您拥有自己的邮件服务器,但无法对其进行管理或无法进行DKIM时,这很好。
选择器需要与您正在签名的密钥匹配,因此如果您有一个名为s1的选择器,则期望在您域的DNS中的名为s1._domainkey的TXT记录中提供公钥。匹配的私钥只需要在服务器上某个安全且无法通过网络访问的地方即可。
DNS和密钥安排不管您使用哪种签名机制都是相同的。如果您使用PHPMailer的DKIM,则不需要OpenDKIM,但如果您想使用OpenDKIM,则需要在其配置中告诉它要使用哪个选择器。一些邮件服务器(如我使用的GreenArrow)允许通过自定义消息头动态控制选择器,但我认为OpenDKIM不支持此功能。您可以在postfix中设置虚拟MTA,从而允许类似的操作。

有关PHPMailer的参考,请查看提供的DKIM签名示例以及测试套件中的DKIM测试


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接