dotkernel / dot-mail
基于 laminas-mail 的 DotKernel 邮件组件
Requires
- php: ~8.1.0 || ~8.2.0 || ~8.3.0
- ext-fileinfo: *
- ext-json: *
- dotkernel/dot-event: ^3.4
- laminas/laminas-mail: ^2.25
- laminas/laminas-servicemanager: ^3.22
Requires (Dev)
- laminas/laminas-coding-standard: ^2.5
- mikey179/vfsstream: ^v1.6.11
- phpunit/phpunit: ^10.5
- vimeo/psalm: ^5.23
This package is auto-updated.
Last update: 2024-09-19 11:03:43 UTC
README
重要
dot-mail 是在 laminas-mail 之上的封装
dot-mail 徽章
配置
邮件 - 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
文件。设置以下 transport
、message_options
和 smtp_options
键。
在 message_options
键下
from
- 用户将收到的电子邮件的地址
在 smtp_options
键下
host
- 邮件服务器的主机名或 IP 地址port
- 邮件服务器的端口号connection_config
- 用上述from
中使用的电子邮件的登录详情填写username
、password
和ssl
键
注意:其他所有键可以保持不变。
<?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'] ], ], ];
常见的文件夹名称有 INBOX
、INBOX.Archive
、INBOX.Drafts
、INBOX.Sent
、INBOX.Spam
、INBOX.Trash
。如果您的类中提供了 MailService
,您可以调用 $this->mailService->getFolderGlobalNames()
来列出您所使用邮箱的文件夹全局名称。
可以将多个文件夹添加到 save_sent_message_folder
键中,以在每个文件夹中保存发出的电子邮件的副本。