kynx / laminas-dkim
Laminas Mail 的 DKIM 签名器
Requires
- php: ^7.4 || ~8.0.0 || ~8.1.0
- ext-openssl: *
- laminas/laminas-mail: ^2.16
Requires (Dev)
- laminas/laminas-coding-standard: ^2.0
- laminas/laminas-servicemanager: ^3.4
- phpmailer/dkimvalidator: dev-master as 0.4.0
- phpunit/phpunit: ^9.5
- vimeo/psalm: ^4.27
This package is auto-updated.
Last update: 2024-09-05 06:29:04 UTC
README
将 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
中设置您的 domain
、selector
以及您想要签名的 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 规范化部分的详细讨论。
头部
这指定了哪些头部将包含在签名中。通常您想要包含影响电子邮件传输或显示的头部 - 例如 To
、CC
、Subject
- 但不要包含可能会在传输过程中被修改的头部,如 Return-Path
。无论什么情况,都包含 From
。
默认情况下,此库会对CC
、Content-Type
、Date
、From
、MIME-Version
、Reply-To
、Subject
和To
进行签名。有关更多指导,请参阅规范中的5.4.1 推荐签名内容
部分。[链接]
升级
自1.x版本以来,API经历了一些变化。
- 所有类现在都在
Kynx\Laminas\Dkim
命名空间下。占用顶级Dkim
命名空间似乎有点无礼,可能会与其他DKIM相关包发生冲突。 - 所有类现在都是
final
。 Signer
现在是无状态的。这解决了签名多个消息的问题,并允许在mezzio-swoole等长运行过程中使用。Signer
现在消费一个Params
实例和一个PrivateKeyInterface
。这为DKIM的选项提供了一个更友好的接口,并将允许未来使用其他签名算法(参见RFC8463)。Signer::signMessage()
现在返回签名后的消息,而原始消息保持不变。- 配置文件现在使用人类可读的键来表示参数,而不是使用
d
、s
和h
。私钥现在位于包含selector
的keys
部分。这同样是为了与多个签名算法的前向兼容性。
要升级
- 搜索
use Dkim\
并将其替换为use Kynx\Laminas\Dkim\
- 更新您的配置文件中的参数以使用
domain
、selector
和headers
而不是d
、s
和h
。有关新格式,请参阅dkim.global.php.dist和dkim.local.php.dist。 - 修改您的代码以使用从
Signer::signMessage()
返回的签名消息。
(1.x版本之前)
<?php $signer->signMessage($message);
(2.x版本之后)
<?php $message = $signer->signMessage($message);
如果您正在手动构建Signer
实例,请参阅上述手动实例化部分,以了解如何将新的Params
和PrivateKeyInterface
传递给构造函数。
历史
这是对metalinspired/laminas-dkim的演进,其中包含了改进、错误修复、测试和现代化的代码。该包是从joepsyko/zf-dkim分叉而来,而joepsyko/zf-dkim又是从fastnloud/zf-dkim分叉而来。