kynx/laminas-dkim

Laminas Mail 的 DKIM 签名器

2.0.0 2022-09-11 16:20 UTC

README

Build Status

将 DKIM 签名添加到 laminas-mail 消息中。

DKIM 签名使接收您的邮件的系统可以验证邮件是否确实是由其声称的发件人发送,并且在传输过程中没有被篡改。添加它们可以降低邮件被误放入垃圾邮件文件夹的风险。

如果您通过 SMTP 发送邮件,您可能不需要这个库:大多数信誉良好的提供商已经添加了它们。检查系统发送的邮件的完整头信息中的 DKIM-Signature 头。如果它在那里,那就找其他事情做吧 😉

在开始使用此库之前,请确保您可以为发送邮件的域添加 TXT 记录。您需要为这些域添加特殊格式的 TXT 记录,否则您的签名消息将被拒绝。

安装

composer require kynx/laminas-dkim

如果您要将此库添加到现有的 Laminas 或 Mezzio 项目中,您应该会提示将包作为模块或添加到 config/config.php 中。

接下来,将配置复制到您的自动加载目录

cp vendor/kynx/laminas-dkim/config/dkim.global.php.dist config/autoload/dkim.global.php
cp vendor/kynx/laminas-dkim/config/dkim.local.php.dist config/autoload/dkim.local.php

dkim.local.php 文件将包含用于签名消息的私有密钥:请勿 将其存入版本控制!

创建一个私有签名密钥 - 如 dkimcore.org 中所述 - 并将其添加到您上面复制的 dkim.local.php 文件中,无需 包含周围的 -----BEGIN RSA PRIVATE KEY----- / -----END RSA PRIVATE KEY-----

通过在 dkim.global.php 中设置您的 domainselector 以及您想要签名的 headers 来完成配置。

现在您将能够签名消息。但是,在接收邮件服务器能够验证它之前,您仍然需要配置您的 DNS TXT 记录:有关格式的详细信息,请参阅 dkimcore.org

用法

手动实例化

<?php 

require 'vendor/autoload.php';

use Kynx\Laminas\Dkim\PrivateKey\RsaSha256;
use Kynx\Laminas\Dkim\Signer\Params;
use Kynx\Laminas\Dkim\Signer\Signer;
use Laminas\Mail\Message;
use Laminas\Mail\Transport\Sendmail;

$mail = Message();
$mail->setBody("Hello world!")
    ->setFrom('from@example.com')
    ->addTo('to@example.com')
    ->setSubject('subject');

// Create signer
$privateKey = new RsaSha256('sel1', 'your private key');
$params = new Params('example.com', ['From', 'To', 'Subject']);
$signer = new Signer($params, $privateKey);

// Sign message
$signed = $signer->signMessage($mail);

// Send message
$transport = new Sendmail();
$transport->send($signed);

基于工厂的实例化

<?php 

require 'vendor/autoload.php';

use Kynx\Laminas\Dkim\Signer\Signer;
use Laminas\Mail\Message;
use Laminas\Mail\Transport\TransportInterface;

// Get container (Mezzio example)
$container = require 'config/container.php';

$mail = Message();
$mail->setBody("Hello world!")
    ->setFrom('from@example.com')
    ->addTo('to@example.com')
    ->setSubject('subject');

// Get configured Signer
$signer = $container->get(Signer::class);

// Sign message
$signed = $signer->signMessage($mail);

// Send message
$transport = $container->get(TransportInterface::class);
$transport->send($signed);

配置选项

您可以为将包含在 DKIM 签名中的大多数(但不是全部,目前还不是)标签进行配置。最常自定义的标签是

规范化

这控制了在签名头部和正文时如何处理空白。对于两者都有两种选项:“简单”和“宽松”。简单规范化改变很少,宽松规范化会合并空白。规范化格式以由 '/' 分隔的配对形式书写 - 因此 relaxed/simple 指定头部将合并空白,而正文则不会。

一些电子邮件系统会在传输过程中篡改电子邮件的空白,如果使用“简单”,这会导致验证失败。因此,大多数主要提供商使用“relaxed/relaxed”,此库的默认设置也是如此。请参阅规范中3.4 规范化部分的详细讨论。

头部

这指定了哪些头部将包含在签名中。通常您想要包含影响电子邮件传输或显示的头部 - 例如 ToCCSubject - 但不要包含可能会在传输过程中被修改的头部,如 Return-Path。无论什么情况,都包含 From

默认情况下,此库会对CCContent-TypeDateFromMIME-VersionReply-ToSubjectTo进行签名。有关更多指导,请参阅规范中的5.4.1 推荐签名内容部分。[链接]

升级

自1.x版本以来,API经历了一些变化。

  • 所有类现在都在Kynx\Laminas\Dkim命名空间下。占用顶级Dkim命名空间似乎有点无礼,可能会与其他DKIM相关包发生冲突。
  • 所有类现在都是final
  • Signer现在是无状态的。这解决了签名多个消息的问题,并允许在mezzio-swoole等长运行过程中使用。
  • Signer现在消费一个Params实例和一个PrivateKeyInterface。这为DKIM的选项提供了一个更友好的接口,并将允许未来使用其他签名算法(参见RFC8463)。
  • Signer::signMessage()现在返回签名后的消息,而原始消息保持不变。
  • 配置文件现在使用人类可读的键来表示参数,而不是使用dsh。私钥现在位于包含selectorkeys部分。这同样是为了与多个签名算法的前向兼容性。

要升级

  • 搜索use Dkim\并将其替换为use Kynx\Laminas\Dkim\
  • 更新您的配置文件中的参数以使用domainselectorheaders而不是dsh。有关新格式,请参阅dkim.global.php.distdkim.local.php.dist
  • 修改您的代码以使用从Signer::signMessage()返回的签名消息。

(1.x版本之前)

<?php

$signer->signMessage($message);

(2.x版本之后)

<?php

$message = $signer->signMessage($message);

如果您正在手动构建Signer实例,请参阅上述手动实例化部分,以了解如何将新的ParamsPrivateKeyInterface传递给构造函数。

历史

这是对metalinspired/laminas-dkim的演进,其中包含了改进、错误修复、测试和现代化的代码。该包是从joepsyko/zf-dkim分叉而来,而joepsyko/zf-dkim又是从fastnloud/zf-dkim分叉而来。