hell-sh/mail-transfer

此包的最新版本(dev-senpai)没有提供许可证信息。

一个库,让您可以轻松地用PHP编写自定义的电子邮件服务器和客户端。

dev-senpai 2021-10-07 00:22 UTC

This package is auto-updated.

Last update: 2024-09-07 07:09:31 UTC


README

一个库,让您可以轻松地用PHP编写自定义的电子邮件服务器和客户端。

composer require hell-sh/mail-transfer:dev-senpai

工作中!

我之所以这么早发布,唯一的原因是我想使用“dev-senpai”构建一个自定义服务器。

尚未完成的一些事情

  • 多部分内容
    • 附件
  • DKIM 子域考虑事项
  • 服务器:动态 & 静态 SIZE

示例

服务器

<?php
require "vendor/autoload.php";
(new Email\Server(
    __DIR__."/fullchain.pem", __DIR__."/privkey.pem",
    Email\Server::BIND_ADDR_ALL, [25],
    Email\Session::DEFAULT_READ_TIMEOUT, Email\Connection::LOGFUNC_ECHO
))->onEmailReceived(function(Email\Email $email, Email\Session $sender)
    {
        $subject = ($email->getSubject() ?: "(no subject)");
        $classification = $email->getFirstHeaderValue("X-Classification");
        echo "Received \"$subject\" from {$email->getSender()} ($classification)".PHP_EOL;
    })
  ->loop();

反垃圾邮件

虽然SPF、DKIM和DMARC都擅长防止欺骗,但真正的问题是垃圾邮件,在服务器上没有100%有效的解决方法,但黑名单迄今为止最有希望。

  • 如果您想全力以赴,不仅阻止垃圾邮件,还要教训那些视而不见的服务提供商,请使用UCEPROTECT$server->setBlocklists(["dnsbl-1.uceprotect.net", "dnsbl-2.uceprotect.net", "dnsbl-3.uceprotect.net"]);
    • 如果您觉得这太过极端,可以考虑只使用他们的1级或2级列表。
  • 如果您想更实际一些,JustSpam.org 似乎适合仅阻止垃圾邮件:$server->setBlocklists(["dnsbl.justspam.org"]);

客户端

<?php
require "vendor/autoload.php";
Email\Email::basic(
    new Email\Address("Sender <sender@localhost>"),
    new Email\Address("recipient@localhost"),
    /* Subject: */ "Saying hello to the world",
    new Email\ContentTextPlain("Hello, world!")
)->sign(new Email\DkimKey("php", "file://".__DIR__."/dkim-private.pem"))
 ->sendToRecipient(
     Email\Client::DEFAULT_CONNECT_TIMEOUT,
     Email\Client::DEFAULT_READ_TIMEOUT,
     Email\Connection::LOGFUNC_ECHO
   );
Asyncore\Asyncore::loop();

设置

这样您就可以正确地发送电子邮件。

首先,请确保您在一个公共机器上,具有IPv4 & IPv6的已确认反向DNS记录(或者更普遍地说,您的机器可能用于出站连接的任何IP)。如果不是这种情况,可能会有各种微妙的问题。

接下来,通过终端使用openssl生成DKIM的RSA密钥对

openssl genrsa -out dkim-private.pem 2048
openssl rsa -in dkim-private.pem -out dkim-public.pem -pubout -outform PEM

最后,设置DNS记录

  • selector 也是 new Email\DkimKey 的第一个参数,基本上是DKIM密钥的名称。
  • base64-encoded public key 表示单行中 dkim-public.pem 的实际内容,没有BEGIN & END KEY包装。
  • policy 是当使用此域名发送未经认证的电子邮件时要执行的操作
    • reject: 拒绝它
    • quarantine: 将其放入垃圾邮件
    • none: 允许它

在开发此软件过程中引用的一些RFC

SPF由 mlocati/spf-lib 实现,在MIT许可下发布。