academe / laraveldkim
一个 Laravel 插件,用于在应用程序内部使用 DKIM 签名所有发出的电子邮件。
Requires
- php: >=5.3.0
This package is auto-updated.
Last update: 2024-08-23 03:54:37 UTC
README
使用 DKIM 签名在 Laravel 4 中签名所有发出的电子邮件。
此包不适用于 Laravel 5,我可能找不到时间或没有动力将其推进到 Laravel 5。尽管如此,如果您有任何修复方案,我将很高兴接受拉取请求。Laravel 5 仍然使用 SwiftMailer 进行邮件传输,因此应该可以修复它。
然而,如果您能够通过其他服务器发送邮件并添加 DKIM,那么这将是迄今为止最简单的解决方案。
待办事项
- 测试
为什么你会使用这个?
大多数应用程序都需要发送邮件。为了尽量减少看起来像垃圾邮件,应该对发送的邮件应用一些技术。其中之一被称为 DomainKeys Identified Mail (DKIM)。
DKIM 使用公钥/私钥对。公钥存储在发送电子邮件的域的 TEXT 记录中,因此所有收件人(邮件服务器)都可以看到。私钥是保密的,并用于签名发出的消息。签名是消息内容和一些标题的散列,并将散列添加到标题顶部。只有拥有私钥的人才能以可以通过公钥验证的方式进行签名。Google、Yahoo、Hotmail 都会进行此检查。任何在途中篡改的消息都将破坏签名,因此可以在目的地被拒绝。
现在,许多应用程序将由操作系统或邮件发送服务(例如 Sendgrid 或他们的 ISP 的 SMTP 服务器)处理 DKIM。在某些情况下,这可能不是一个选择,因此创建了这个包来进行应用程序级别的签名。
Laravel 使用 Swift Mailer 处理其发出的电子邮件,Swift Mailer 具有内置的 DKIM 签名支持。此包在每次实例化 Swift 消息时注入签名组件。
有关 DKIM 的详细信息,请参阅 Coding Horror
限制
此包是为了满足特定需求而编写的,因此可能不如您希望的那样灵活。如果您有任何改进,请随时提交拉取请求。
该包假设您正在使用内置的 Laravel 邮件提供程序。如果您正在使用其他邮件包,例如 laravel-mailgun,则不知道这是否有效(我不知道其他邮件包是否位于 Laravel 的邮件提供程序之上或替换它)。尝试一下,并告诉我结果。
它还假设所有电子邮件都将来自单个域名。我尝试给Swift Mailer多个域名证书,看看它是否会选择与发送地址匹配的证书,但它只是不加疑问地添加了所有证书。也许可以更新SwiftMailer,使其在处理过程中较晚选择并使用签名组件,这样它就有更多关于要发送的内容和对象的信息,从而在签名时做出更好的决策。例如,直到它知道发送域名,它实际上并不知道在潜在的证书列表中选择哪个用于签名。所以现在只有一个域名和一个证书,我们将看看它在野外的表现。
所有电子邮件都将使用相同的证书进行签名。
版本1.0.4为SwiftMailer DKIM签名器的问题提供了一个解决方案。一些电子邮件头信息不应该被包含在签名中。SwiftMailer不会自动排除这些头信息,所以现在在这个包中明确地将它们设置为“忽略”。您可以通过以下链接检查SwiftMailer是否已修复此问题:[swiftmailer/swiftmailer#442](https://github.com/swiftmailer/swiftmailer/issues/442)
如何使用
步骤如下
- 将包包含到您的应用程序中。
- 添加您的私钥设置。
- 使用新的邮件器。
将包包含到您的应用程序中
在项目的composer.json中添加一个依赖项
"require": {
"academe/laraveldkim": "1.*"
},
添加您的私钥设置
您的签名密钥详情需要添加到Laravel应用程序配置中。将以下内容添加到您的mail.php
配置文件中
'dkim' => array(
'private_key' => <<<ENDDKIMKEY
-----BEGIN RSA PRIVATE KEY-----
...your key goes in here...
-----END RSA PRIVATE KEY-----
ENDDKIMKEY
,
'domain_name' => 'example.com',
'selector' => 'dkim',
),
请注意,在两个ENDDKIMKEY
实例之间的所有内容都必须正确,直到行的开始。您可能能够更容易地将RSA密钥放入点文件中(例如.mail.prod.php
),以提高安全性。有关点文件支持的更多详细信息,请参阅[保护敏感配置](https://laravel.net.cn/docs/configuration#protecting-sensitive-configuration)。另一种方法可能是在配置文件中从文本文件中读取密钥并返回它。需要确保“mail.dkim.private_key”是一个包含完整私钥的字符串,每行以换行符终止。如果存储为PHP字符串,建议使用双引号将密钥的每一行连接起来,并明确嵌入换行符,如下所示:"-----BEGIN RSA PRIVATE KEY-----\n" . "line 1\n" . "line 2\n" 等。
虽然假设源文件的换行终止符是\n从未是一个好主意,但[PSR-2](http://www.php-fig.org/psr/psr-2/)(第2.2节)清楚地指出,行必须以\n终止。
domain_name是发送电子邮件的域名。selector是在DNS中存储您的公钥时选择的selector。在上面的示例中,公钥将存储在dkim._domainkey.example.com
的TEXT条目中
使用新的邮件器
现在我们需要告诉Laravel使用自定义邮件器而不是标准内置邮件器。这是在app.php配置文件中完成的。请注意,“新邮件器”只是默认Laravel邮件器的包装器,并不是完全功能性的替代品,因此您不需要修改应用程序中邮件器的使用。
providers
数组将包含以下条目
'Illuminate\Mail\MailServiceProvider',
取消注释并替换为以下条目
'Academe\LaravelDkim\MailServiceProvider',
就这样。您的电子邮件现在应该已经使用DKIM进行了签名。您可以通过检查您应用程序发送的电子邮件的源代码来检查头信息,您应该在那里看到DKIM签名。它看起来像这样
DKIM-Signature: v=1; a=rsa-sha1; bh=Gwuoen3CG+KClMvlMKjUh1ZJmzg=;
d=example.com; h=Message-ID: Date: From: MIME-Version: Content-Type;
i=@example.com; s=dkim; t=1391259163;
b=cIkL/FZ6/v/XUdcYvhvmSo9abedf0DLlM/LYkOX4GoW4EUzPxN10hOHQpWlqjeDa2YdsI7GH
dGCc16Xgb2kpZbPEom0RMv62G4SYf8763abb7380ebMRP2tv0/Mq+CaOmQejk34vlBnzcj0JE
6PGOPxEEe9dgdoOMx4uEhhlkd=