rapideinternet / laraveldkim
一个Laravel插件,可以在应用程序内部使用DKIM对所有发出的电子邮件进行签名。
Requires
- php: >=5.3.0
- laravel/framework: 5.*
This package is not auto-updated.
Last update: 2024-09-26 03:18:28 UTC
README
在Laravel 5中使用DKIM签名对所有发出的电子邮件进行签名。
查看4.0分支以获取Laravel 4的支持。
入门指南
将包包含到您的应用程序中
$ composer require rapideinternet/laraveldkim:dev-master
或将依赖项添加到您的项目composer.json文件中
"require": { "rapideinternet/laraveldkim": "dev-master" },
添加您的私钥设置
您的签名密钥详细信息需要添加到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:保护敏感配置。另一种方法可能是从配置文件中的文本文件中读取密钥,并返回该文件。 "mail.dkim.private_key"需要一个包含完整私钥的字符串,每行以换行符终止。如果存储为PHP字符串,则可以在双引号中连接密钥的每一行,并明确地嵌入换行符,如下所示:"-----BEGIN RSA PRIVATE KEY-----\n" . "line 1\n" . "line 2\n" 等等。
尽管如此,假设源文件中的行终止符为\n从未是一个好主意,尽管PSR-2确实明确指出(第2.2节)行必须以\n终止。
domain_name是发送电子邮件的域名。selector是您在DNS中存储公钥时选择的selector。在上面的示例中,公钥将存储在dkim._domainkey.example.com
的TEXT条目中
使用新的邮件发送器
现在我们需要告诉Laravel使用自定义邮件发送器而不是标准内置邮件发送器。这将在app.php配置文件中完成。请注意,“新邮件发送器”只是默认Laravel邮件发送器的包装器,并不是一个完全功能性的替代品,因此您不需要修改应用程序中邮件的使用方式。
数组中将包含以下条目
'Illuminate\Mail\MailServiceProvider',
取消注释并替换为以下条目
'Lucasvdh\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=
背景
为什么您会使用这个?
大多数应用程序都需要发送邮件。为了尽可能地看起来不像是垃圾邮件,应该应用一些技术来发送邮件。其中之一是称为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