shoaibnawaz / laraveldkim

一个用于在应用程序内部使用DKIM签名所有发出的电子邮件的Laravel插件。

1.0.6 2015-12-15 06:28 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:09:46 UTC


README

此包是academe/laraveldkim的分支,并单独维护以紧急发布到Packagist。此包主要修复了Laravel 4.2中Mailer的事件分发支持。

使用DKIM签名在Laravel 4中签名所有发出的电子邮件。

此包在Laravel 5上不工作,而且我可能没有时间或需求将其推进到Laravel 5。如果您有任何修复,我会很高兴接受pull-requests。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上找到。

限制

此包是为了满足特定需求而编写的,因此可能不如你期望的那样灵活。如果你有任何改进,请随时提交pull-requests。

该包假设您正在使用内置的Laravel电子邮件提供者。如果您正在使用其他电子邮件包,如laravel-mailgun,那么我不知道这是否会工作(我不知道其他邮件包是否位于Laravel的邮件提供者之上或替换了它)。试一试,并告诉我进展如何。

它还假设所有电子邮件都将来自单个域名。我确实尝试过给Swift Mailer多个域名证书,看看它是否会选择与发送地址匹配的证书,但它只是不加质疑地添加了所有证书。也许我们可以更新SwiftMailer,使其在处理过程中更晚选择和使用签名组件,这样它就可以获得更多关于它要发送的内容和对象的详细信息,从而在签名时做出更好的决策。例如,在它知道发送域名之前,它真的不知道从潜在证书列表中选择哪个用于签名。所以,现在只使用一个域和证书,我们将看看它在野外表现如何。

所有电子邮件都将使用相同的证书进行签名。

版本1.0.4引入了一个针对SwiftMailer DKIM签名的修复方案。某些电子邮件头信息**永远**不应该包含在签名中。SwiftMailer不会自动排除这些头信息,因此现在在包中明确设置为“忽略”。您可以在以下链接中检查SwiftMailer是否已修复此问题:swiftmailer/swiftmailer#442

如何使用

步骤如下:

  • 将包包含到您的应用程序中。
  • 添加您的私钥设置。
  • 使用新的邮件发送器。

将包包含到您的应用程序

在项目 composer.json 中添加一个依赖项

"require": {
    "shoaibnawaz/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)以获得更高的安全性。有关点文件支持的更多详细信息,请参阅Laravel: Protecting Sensitive Configuration。另一种方法可能是从配置文件中的文本文件中读取密钥并返回。需要“mail.dkim.private_key”的字符串包含完整的私钥,每行以换行符结束。如果作为PHP字符串存储,可以使用双引号将密钥的每一行连接起来,并明确嵌入换行符,如下所示:"-----BEGIN RSA PRIVATE KEY-----\n" . "line 1\n" . "line 2\n" etc.。尽管如此,假设源文件的行终止符是\n从未是一个好主意,尽管PSR-2确实明确指出(第2.2节),行必须以\n结束。

domain_name是发送电子邮件的域名。selector是您选择存储在DNS中的公钥选择器。在上述示例中,公钥将存储在dkim._domainkey.example.com的TEXT条目中

使用新的邮件发送器

现在我们需要告诉Laravel使用自定义邮件发送器而不是标准的内置邮件发送器。这需要在app.php配置文件中完成。请注意,“新邮件发送器”只是默认Laravel邮件发送器的包装器,并不是完全的功能性替换,因此您不需要修改应用程序中邮件的使用。

“providers”数组将包含以下条目

'Illuminate\Mail\MailServiceProvider',

取消注释并替换为以下条目

'Shoaibnawaz\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=