netglue/laminas-mail-utils

一组用于Laminas邮件消息的直观验证器以及一些用于事务性电子邮件消息的常见行为

0.0.1 2020-03-24 11:53 UTC

This package is auto-updated.

Last update: 2024-09-24 22:45:42 UTC


README

PHPUnit Test Suite codecov

简介

这是一个小巧的包,旨在解决两个主要的问题

  • 根据可配置的约束(例如最大收件人数或非空主题行)验证Laminas\Mail\Message实例。
  • 提供简单的行为和接口,以便通过流行的交易性或营销电子邮件服务提供商发送电子邮件消息;例如,键/值元数据或标签/分类。

安装

composer require netglue/laminas-mail-utils

提供验证器

验证器可以用作您输入过滤器设置的一部分,或者通过创建供应商特定的验证器链。以下是一个具体验证器链的示例,该验证器链对于通过Postmark API验证要发送的消息非常有用,因为Postmark对收件人等施加了某些限制:

<?php
declare(strict_types=1);

namespace App;

use Netglue\Mail\Validator\HasFromAddress;
use Netglue\Mail\Validator\HasSubject;
use Netglue\Mail\Validator\HasToRecipient;
use Netglue\Mail\Validator\TotalFromCount;
use Netglue\Mail\Validator\TotalRecipientCount;
use Netglue\Mail\Validator\TotalReplyToCount;
use Laminas\Validator\ValidatorChain;
use Laminas\Validator\ValidatorPluginManager;

final class PostmarkMessageValidator extends ValidatorChain
{
  	private const MAX_RECIPIENTS = 50;
 		
    public function __construct(?ValidatorPluginManager $pluginManager = null)
    {
        parent::__construct();
        if ($pluginManager) {
            $this->setPluginManager($pluginManager);
        }

        $this->configureDefaults();
    }

    private function configureDefaults() : void
    {
        $this->attachByName(HasFromAddress::class);
        $this->attachByName(TotalFromCount::class, ['max' => 1]);
        $this->attachByName(HasSubject::class);
        $this->attachByName(HasToRecipient::class);
        $this->attachByName(TotalRecipientCount::class, ['max' => self::MAX_RECIPIENTS]);
        $this->attachByName(TotalReplyToCount::class, ['max' => 1]);
    }
}

提供特性和接口

您将发现一组接口非常简单,但希望封装了许多交易性电子邮件服务提供商在发送邮件时提供的附加功能——例如,为单个消息分配标签或类别,或开启/关闭点击跟踪或打开跟踪。

通常,您会创建一个Laminas\Mail\Message的具体子类,并实现最适合提供商的接口,以便在与任何特定消息实例的功能一起工作时具有类型安全性。再次以Postmark为例,可能如下所示:

<?php
declare(strict_types=1);

namespace App\Postmark\Message;

use Netglue\Mail\Message\KeyValueMetadata;
use Netglue\Mail\Message\KeyValueMetadataBehaviour;
use Netglue\Mail\Message\OpenTracking;
use Netglue\Mail\Message\OpenTrackingBehaviour;
use Netglue\Mail\Message\TaggableMessage;
use Netglue\Mail\Message\TaggableMessageBehaviour;
use Laminas\Mail\Message;

class MyPostmarkMessage extends Message implements TaggableMessage, KeyValueMetadata, OpenTracking
{
    use OpenTrackingBehaviour;
    use TaggableMessageBehaviour;
    use KeyValueMetadataBehaviour {
        addMetaData as parentAddMetaData;
    }
}
// $message is given to us from some factory or service somewhere
if ($message instanceof TaggableMessage) {
  $someVendorApi->setMessageTag($message->getTag());
}

计划...

...是实现利用这些工具的供应商特定包的计划,如您所猜测的,目前Postmark位居榜首...

该包目前尚不成熟,可能存在BC中断的可能性,如果您对此有任何需求,欢迎贡献力量👍