dotkernel/dot-mail

基于 laminas-mail 的 DotKernel 邮件组件

4.2.2 2024-06-28 09:19 UTC

README

重要

dot-mail 是在 laminas-mail 之上的封装

Dynamic JSON Badge

dot-mail 徽章

OSS Lifecycle PHP from Packagist (specify version)

GitHub issues GitHub forks GitHub stars GitHub license

Build Static codecov

SymfonyInsight

配置

邮件 - Sendmail

如果您的服务器已安装 Sendmail,请通过以下设置更新 config/autoload/mail.local.php.dist 文件中的 transport

<?php
return [
    'dot_mail' => [
        'default' => [
            //...
            'transport' => Laminas\Mail\Transport\Sendmail::class,
            //...
        ]
    ]
]

邮件 - SMTP

如果您想让您的应用程序在例如注册、联系时发送邮件,请编辑 config/autoload/mail.local.php 文件。设置以下 transportmessage_optionssmtp_options 键。

message_options 键下

  • from - 用户将收到的电子邮件的地址

smtp_options 键下

  • host - 邮件服务器的主机名或 IP 地址
  • port - 邮件服务器的端口号
  • connection_config - 用上述 from 中使用的电子邮件的登录详情填写 usernamepasswordssl

注意:其他所有键可以保持不变。

<?php
return [
    'dot_mail' => [
        'default' => [
            //...
            'transport' => Laminas\Mail\Transport\Smtp::class,
            'message_options' => [
                'from' => '',
                //...
            ],
            'smtp_options' => [
                'host' => '',
                'port' => 25,
                'connection_config' => [
                    'username' => '',
                    'password' => '',
                    'ssl' => '',
                ]
            ]
            //...
        ]
    ]
]

config/autoload/local.php 中,在 contact => message_receivers => to 键下添加 字符串 值,这些值是应接收联系信息的电子邮件

注意:请至少添加 1 个电子邮件地址,以便联系信息能够送达某人

您还可以在 contact => message_receivers => cc 键下添加任意数量的抄送地址

发送电子邮件

以下是如何以最基本的方式使用电子邮件的示例。您可以在其中添加自己的代码,例如从 User 对象或配置文件中获取用户数据,使用模板作为正文。

注意,addTo 是由 getMessage() 返回的 Message 类的可用的方法之一。其他有用的方法未包含在示例中,包括 addCc()addBcc()addReplyTo()

返回的类型是布尔值,但如果移除 isValid() 方法,返回的类型变为 MailResult,这允许使用 getMessage() 获取更详细的错误消息。请参阅下面的 测试电子邮件消息是否有效 部分。

public function sendBasicMail()
{
    $this->mailService->setBody('Email body');
    $this->mailService->setSubject('Email subject');
    $this->mailService->getMessage()->addTo('email@example.com', 'User name');
    $this->mailService->getMessage()->setEncoding('utf-8');
    return $this->mailService->send()->isValid();
}

虽然这不是必须的,但建议在 try-catch 块中调用上述函数以显示有用的错误消息。下面的示例在 UserController 中调用 sendBasicMail 函数,但您可以在其他控制器中实现它,只需确保控制器构造函数中也包含 FlashMessenger 参数 $messenger 即可。

try {
    $this->userService->sendBasicMail();
    $this->messenger->addSuccess('The mail was sent successfully', 'user-login');
    //more code...
} catch (Exception $exception) {
    $this->messenger->addError($exception->getMessage(), 'user-login');
    //more code...
}

测试电子邮件消息是否有效

发送电子邮件后,您可以检查消息是否有效。调用 $this->mailService->send()->isValid() 方法将返回一个布尔值。如果返回的结果是 true,则电子邮件有效,否则电子邮件无效。如果您的电子邮件无效,您可以使用 $this->mailService->send()->getMessage() 检查任何错误。

使用以下逻辑可以确定消息是否有效并记录下来。您可以实现自己的自定义错误记录逻辑。

$result = $this->mailService->send();
if (! $result->isValid()) {
    //log the error
    error_log($result->getMessage());
}

注意:无效的电子邮件消息不会发送。

记录发出的电子邮件

可选地,您可以记录每个成功发送的电子邮件。这可能有助于您知道是否以及何时将特定电子邮件发送给收件人。

日志以以下格式存储:[YYYY-MM-DD HH:MM:SS]: {"subject":"测试主题","to":["Test Account <test@dotkernel.com>"],"cc":[],"bcc":[]}

要启用此功能,请确保您的 config/autoload/mail.local.php 文件中存在 dot_mail 键下的以下 log 配置。

<?php

return [
    'dot_mail' => [
        ...
        'log' => [
            'sent' => getcwd() . '/log/mail/sent.log'
        ]
    ]
];

要禁用此功能,请将 sent 的值设置为 null

将发出的邮件保存到文件夹中

仅适用于 SMTP 传输

首先,请确保在配置文件 mail.local.php 中的 dot_mail.default 下存在 save_sent_message_folder 键。以下是其位置和默认值。

<?php

return [
    'dot_mail' => [
        'default' => [
        ...
            'save_sent_message_folder' => ['INBOX.Sent']
        ],
    ],
];

常见的文件夹名称有 INBOXINBOX.ArchiveINBOX.DraftsINBOX.SentINBOX.SpamINBOX.Trash。如果您的类中提供了 MailService,您可以调用 $this->mailService->getFolderGlobalNames() 来列出您所使用邮箱的文件夹全局名称。

可以将多个文件夹添加到 save_sent_message_folder 键中,以在每个文件夹中保存发出的电子邮件的副本。