提供面向对象的方式来发送和排队电子邮件。
几乎所有项目都需要发送电子邮件,例如用于用户注册或密码重置功能。大多数电子邮件发送都非常简单。不需要 PGP 加密等复杂功能。该库提供了一种无需设置 PHPMailer(底层库)即可创建此类电子邮件的方法,可以发送多封电子邮件,甚至可以通过使用数据库支持的队列来推迟发送电子邮件 - 所有这些都在一个面向对象的方式。
特点是:
EmailQueue
对象中。该项目已获得 GNU LGPL 3.0 许可。
composer install technicalguru/email
您可以从GitHub Release Page下载源码包
配置的中心类是EmailConfig
。它包含所有必要的信息。让我们从基本框架开始:
use TgEmailEmailConfig;
$config = new EmailConfig();
$config->setTimezone('Europe/Berlin');
$config->setDefaultSender('John Doe <[email protected]>');
$config->setSubjectPrefix('[MyAppName] ');
$config->setDebugAddress('[email protected]');
上面的行创建配置并告诉它在需要创建时间戳时使用Europe/Berlin
时区。这主要是在电子邮件排队并且需要记录时间戳时需要的。该值是可选的,默认为UTC
。
接下来,配置默认发件人地址。当要发送的特定电子邮件未定义发件人地址时,将使用默认发件人。下面进一步解释创建电子邮件地址。
主题前缀用于稍后发送的每封电子邮件。主题将以此字符串作为前缀。默认为NULL
,不会修改主题。
仅当您需要发送测试邮件时才需要调试地址。
我们仍然需要知道 SMTP 服务器所在的位置。这就是设置这些值的方法:
use TgEmailConfigSmtpConfig;
$host = 'smtp.example.com;
$port = 587;
$auth = TRUE;
$username = 'mySmtpUser';
$password = 'mySmtpPassword';
$secureOption = 'starttls';
$smtpConfig = new SmtpConfig($host, $port, $auth, $username, $password, $secureOption);
$config->setSmtpConfig($smtpConfig);
大多数选项都是不言自明的。 $auth
告诉底层 PHPMailer 是否使用给定的用户凭据进行身份验证。 $secureOption
由PHPMailer
定义,并且应具有值smtps
或starttls
。请参阅 PHPMailer 文档以获取更多信息。
所有属性都可以使用 setter 来设置:
use TgEmailConfigSmtpConfig;
$smtpConfig = new SmtpConfig();
$smtpConfig->setHost('smtp.example.com');
$smtpConfig->setPort(587);
// continue setup...
还可以使用technicalguru/utils
包中的TgUtilsAuthCredentialsProvider
接口来设置身份验证凭据:
// Define here your provider
$provider = ...;
// Tell SMTP config
$smtpConfig->setCredentialsProvider($provider);
现在是时候创建我们的中央MailQueue
对象了:
use TgEmailEmailQueue;
$mailer = new EmailQueue($config);
您已准备好发送您的第一封电子邮件。
有一种快速简便的方法可以检查您的设置是否正常工作:
$email = $mailer->createTestMail();
$rc = $mailer->send($email);
我们设置了发送电子邮件的最低要求:
use TgEmailEmail;
$email = new Email();
$email
->setSubject('Hello World')
->addTo('[email protected]', 'John Doe')
->addBcc('[email protected]')
->setReplyTo('[email protected]')
->setBody(Email::TEXT, 'The text e-mail body')
->setBody(Email::HTML, '<p>The HTML e-mail body</p>');
// Will return FALSE when sending fails
$rc = $mailer->send($email);
就是这样。上面的代码片段是您在应用程序代码中发送电子邮件所需的全部代码。配置和设置应隐藏在基础设施设置中的某个位置。
附加文件或嵌入图像很简单。您需要使该文件在文件系统上可用且可读:
use TgEmailAttachment;
$myFile = new Attachment(Attachment::ATTACHED, 'file.pdf', NULL, '/local/path/to/file.pdf', 'application/pdf');
$myImage = new Attachment(Attachment::EMBEDDED, 'img.png', 'img1', '/local/path/to/img.png', 'image/png');
$email
->addAttachment($myFile)
->addAttachment($myImage);
注意嵌入图像的第三个参数。它在您的 HTML 电子邮件中定义了一个唯一的 ID,您可以通过以下方式引用
// Using the embedded image
$myHTML = '<img src="cid:img1">';
MailQueue
将使您的文件系统上的所有附件保持不变。但是,有时您可能希望在发送电子邮件后删除该文件。构造函数需要两个附加参数:
$myFile = new Attachment(Attachment::ATTACHED, $filename, $cid, $path, $mimeType, TRUE, TRUE);
第一个布尔值将在电子邮件发送成功后触发文件被删除。第二个布尔值告诉发送失败时是否可以删除文件。使用这些参数,您无需再关心临时文件。尤其是在排队和延迟发送方面。
MailQueue
支持所谓的邮件模式。它们告诉邮件发送者对象一般如何处理电子邮件。当您测试设置、处于具有真实电子邮件地址的环境(例如用户验收测试环境)或实际发送电子邮件没有多大意义时,这会很方便。
这些模式可用:
EmailQueue::DEFAULT
- 这是正常操作。所有电子邮件均按定义发送。EmailQueue::BLOCK
- 这将阻止任何邮件发送或排队。返回码始终为 TRUE。EmailQueue::REROUTE
- 所有电子邮件都将发送到另一个地址,通常是管理员或开发人员地址,并且定义的电子邮件收件人将被忽略。EmailQueue::BCC
- 电子邮件将发送给其预期收件人,但在 BCC 上设置其他地址。阻止所有要发送或排队的电子邮件非常简单:
$mailer->setMailMode(EmailQueue::BLOCK);
可以在中央EmailConfig
对象上使用相同的方法。
您需要在主配置中设置RerouteConfig
配置。您可以在创建配置对象时预先设置它,或者在设置邮件模式时一起设置:
use TgEmailConfigRerouteConfig;
// Create the config
$subjectPrefix = '[Rerouted]';
$recipients = array('[email protected]');
$rerouteConfig = new RerouteConfig($subjectPrefix, $recipients);
// And set the mail mode
$mailer->setMailMode(EmailQueue::REROUTE, $rerouteConfig);
您需要在主配置中设置BccConfig
配置。您可以在创建配置对象时预先设置它,或者在设置邮件模式时一起设置:
use TgEmailConfigBccConfig;
// Create the config
$recipients = array('[email protected]');
$bccConfig = new BccConfig($recipients);
// And set the mail mode
$mailer->setMailMode(EmailQueue::BCC, $bccConfig);
直接从应用程序代码发送电子邮件的缺点之一是非常耗时。您的用户需要等待发送完成,然后才能看到您的应用程序的任何响应。对电子邮件进行排队是一种解决方案,因为发送会被推迟(优于 cron 作业),并且用户可以快速收到她/他的应用程序响应。
您将需要一个TgDatabaseDatabase
对象来对电子邮件进行排队。否则,当您尝试对电子邮件进行排队时, EmailQueue
将引发异常。有关如何创建Database
对象的信息,请参阅TgDatabaseDatabase
文档。设置相应的EmailsDAO
和EmailQueue
如下:
use TgEmailEmailsDAO;
$dao = new EmailsDAO($database);
$mailer = new EmailQueue($config, $dao);
如果队列表不存在,邮件程序将自动创建队列表。
一旦EmailsDAO
可用,您就可以轻松地对电子邮件进行排队:
// Create your email object here
$email = ...
// Queue it. Will return FALSE when sending fails
$rc = $mailer->queue($email);
您可以在另一个调用中或在 cronjob 期间处理队列:
$mailer->processQueue($maxSeconds);
参数$maxSeconds
将确保在达到时间限制时停止处理。该参数是可选的,默认为 60 秒。
创建电子邮件地址的方法有多种。所有邮件组件都使用EmailAddress
对象。无论何时需要电子邮件地址,您都可以使用此对象作为参数。存在多种创建此类对象的方法。
// From a string
$address = EmailAddress::from('[email protected]');
$address = EmailAddress::from('<[email protected]>');
$address = EmailAddress::from('John Doe <[email protected]>');
// From email string and name
$address = EmailAddress::from('[email protected]', 'John Doe');
// From another object
$obj = new stdClass;
$obj->name = 'John Doe';
$obj->email = '[email protected]';
$address = EmailAddress::from($obj);
// From another EmailAddress
$address = EmailAddress::from($anotherEmailAddressObject);
这意味着您在创建电子邮件时可以使用这些风格:
$email->addTo('John Doe <[email protected]>');
$email->addTo('[email protected]', 'John Doe');
$email->addTo(array('John Doe <[email protected]>', $anotherEmailAddressObject, $obj);
上面介绍的配置对象也可以使用 JSON 字符串、对象或关联数组来创建。以下片段以简短表示法描述了 JSON 对象。
SmtpConfig:
-----------
{
"host": "www.example.com",
"port": 587,
"debugLevel": 0,
"auth": true,
"secureOption": "starttls",
"charset": "utf8",
"credentials": {
"user": "username",
"pass": "password"
}
},
RerouteConfig:
--------------
{
"recipients": "[email protected]",
"subjectPrefix": "[Rerouted]"
},
BccConfig:
----------
{
"recipients": "[email protected]"
},
EmailConfig:
------------
{
"timezone": "Europe/Berlin",
"mailMode": "default",
"smtpConfig": {... see above ...},
"rerouteConfig": {... see above ...},
"bccConfig": {... see above ...},
"debugAddress": "[email protected]",
"defaultSender": "[email protected]",
"subjectPrefix": "[PHPUnitTest] "
}
每个配置类都提供一个静态from()
方法,该方法将这些类型作为参数并返回配置对象本身:
$smtpConfig = SmtpConfig::from($jsonStringOrObjectOrAssocArray);
$rerouteConfig = RerouteConfig::from($jsonStringOrObjectOrAssocArray);
$bccConfig = BccConfig::from($jsonStringOrObjectOrAssocArray);
$emailConfig = EmailConfig::from($jsonStringOrObjectOrAssocArray);
可以将Email
对象数组传递给send()
和queue()
函数。但是,特别是对于立即发送电子邮件,您应该意识到这可能需要一些时间。更好的策略是对群发邮件进行排队。
当没有可用的 SMTP 服务器或数据库时,大多数 PHPUnit 测试将不会执行。单元测试将检查环境变量EMAIL_TEST_SMTP
和EMAIL_DATABASE
。有一个可用的 bash 脚本set-test-env.sh
可以为您创建这些变量。将其复制到例如set-local-test-env.sh
并按照文件中的说明进行操作。
在 GitHub 问题跟踪器上报告错误、请求增强或拉取请求。