ddrv/mailer

PHP 发送电子邮件库

资助包维护!
其他

v5.0.4 2022-03-26 17:50 UTC

README

Latest Stable Version Total Downloads License PHP

Mailer

PHP 发送电子邮件库。

安装

  1. 在控制台运行

    composer require ddrv/mailer:^5
  2. 包含自动加载文件

    require_once('vendor/autoload.php');

使用方法

创建传输实例

Sendmail

<?php

$transport = new Ddrv\Mailer\Transport\SendmailTransport(
    '-f' // sendmail options
);

SMTP

<?php

$transport = new Ddrv\Mailer\Transport\SmtpTransport(
    'smtp.fight.club',  // host (REQUIRED)
    25,                 // port (REQUIRED)
    'info',             // login (REQUIRED)
    'super-secret',     // password (REQUIRED)
    'joe@fight.club',   // sender email (REQUIRED)
    null,               // encryption: 'tls', 'ssl' or null
    'http://fight.club' // domain
);

伪造(模拟发送电子邮件)

<?php

$transport = new Ddrv\Mailer\Transport\FakeTransport();

自定义

您可以实现 Ddrv\Mailer\Contract\Transport 接口

<?php

/** @var Ddrv\Mailer\Contract\Transport $transport */

创建邮件发送实例

<?php

/** @var Ddrv\Mailer\Contract\Transport $transport */
$mailer = new Ddrv\Mailer\Mailer($transport);

创建消息实例

<?php

$message = new Ddrv\Mailer\Message(
    'Subject',     // Subject
    '<p>HTML</p>', // HTML body
    'Simple text.' // Text plain body
);

发送消息

<?php

/**
 * @var Ddrv\Mailer\Contract\Message $message
 * @var Ddrv\Mailer\Mailer $mailer
 */
$mailer->send($message);

消息方法

<?php

/** @var Ddrv\Mailer\Message $message */
$message->setSubject('Welcome to Fight Club!');
$message->setText('Welcome to Fight Club!' . PHP_EOL . 'Please, read our rules in attachments.');
$html = '<h1>Welcome to Fight Club!</h1><p>Please, read our rules in attachments.</p>';
$html .= '<img src="cid:poster" alt="Poster"/><img src="cid:ticket" alt="Your ticket"/>';
$message->setHtml($html);

$message->setSender('support@fight.club', 'Support od Fight Club'); // The SMTP transport will set its value.

$message->addRecipient('tyler@fight.club', 'Tyler Durden', Ddrv\Mailer\Message::RECIPIENT_TO);
$message->addRecipient('bob@fight.club', 'Robert Paulson', Ddrv\Mailer\Message::RECIPIENT_CC);
$message->addRecipient('angel@fight.club', 'Angel Face', Ddrv\Mailer\Message::RECIPIENT_BCC);
$message->addRecipient('r.chesler@car-vendor.com', 'Richard Chesler', Ddrv\Mailer\Message::RECIPIENT_TO);

$message->getRecipientName('bob@fight.club'); // Returns 'Robert Paulson'.
$message->getRecipientName('unknown@fight.club'); // Returns null.

$message->removeRecipient('r.chesler@car-vendor.com'); // If you change your mind.

// You may remove recipients by type
$message->removeRecipients(Ddrv\Mailer\Message::RECIPIENT_TO);
$message->removeRecipients(Ddrv\Mailer\Message::RECIPIENT_CC);
$message->removeRecipients(Ddrv\Mailer\Message::RECIPIENT_BCC);
// Or all
$message->removeRecipients();

$message->addRecipient('tyler@fight.club', 'Tyler Durden', Ddrv\Mailer\Message::RECIPIENT_TO);
$message->addRecipient('bob@fight.club', 'Robert Paulson', Ddrv\Mailer\Message::RECIPIENT_CC);
$message->addRecipient('angel@fight.club', 'Angel Face', Ddrv\Mailer\Message::RECIPIENT_BCC);



$rules = <<<TEXT
1. You don't talk about fight club.
2. You don't talk about fight club.
3. When someone says stop, or goes limp, the fight is over.
4. Only two guys to a fight.
5. One fight at a time.
6. They fight without shirts or shoes.
7. The fights go on as long as they have to.
8. If this is your first night at fight club, you have to fight.
TEXT;
$message->attachFromString(
    'rules.txt',                // Attachment name (REQUIRED)
    $rules,                     // Contents (REQUIRED)
    'text/plain; charset=UTF-8' // Mime Type
);


$path = '/home/tyler/docs/projects/mayhem/rules.txt';

$message->attachFromFile(
    'project-mayhem.txt',       // Attachment name (REQUIRED)
     $path,                     // Path to attached file (REQUIRED)
    'text/plain; charset=UTF-8' // Mime Type
);

$message->detach('project-mayhem.txt'); // If you change your mind.

$message->setHtmlContentFromString(
    'ticket',                                            // HTML Content ID
    file_get_contents('/home/tyler/tickets/038994.jpg'), // Contents (REQUIRED)
    'image/jpeg'                                         // Mime Type
);

$message->setHtmlContentFromString(
    'script',                // HTML Content ID
    'alert("ok");',          // Contents (REQUIRED)
    'application/javascript' // Mime Type
);

$message->setHtmlContentFromFile(
    'poster',                            // HTML Content ID
    '/home/tyler/images/fight-club.jpg', // Path to file (REQUIRED)
    'image/jpeg'                         // Mime Type
);

$message->unsetBodyHtmlContent('script'); // If you change your mind.

$message->hasHeader('X-Some-Header');          // Returns false.
$message->setHeader('X-Some-Header', 'Value'); // Header set.
$message->hasHeader('X-Some-Header');          // Returns true.
$message->getHeader('X-Some-Header');          // Returns 'Value'.
$message->removeHeader('X-Some-Header');       // Header removed.
$message->hasHeader('X-Some-Header');          // Returns false.

$message->getRecipients(); // Returns array if recipients emails.
$message->getSubject(); // Returns mail subject.
$message->getHeadersRaw(); // Returns string of mail headers.
$message->getBodyRaw(); // Returns string of mail body.

您可以为自定义消息实现 Ddrv\Mailer\Contract\Message 接口。

邮件队列

此包允许您使用邮件队列。

这需要

  • 创建一个队列对象(Ddrv\Mailer\Contract\Spool 的实例)
  • 创建一个传输对象(Ddrv\Mailer\Contract\Transport 的实例)
  • 将它们包装在特殊的传输 Ddrv\Mailer\Transport\SpoolTransport
<?php

/**
 * @var Ddrv\Mailer\Contract\Transport $transport
 * @var Ddrv\Mailer\Contract\Message $message1
 * @var Ddrv\Mailer\Contract\Message $message2
 */
$spool = new Ddrv\Mailer\Spool\MemorySpool();
// or
$spool = new Ddrv\Mailer\Spool\FileSpool('/path/to/emails');
// Or any implementation of Ddrv\Mailer\Contract\Spool

$wrapper = new Ddrv\Mailer\Transport\SpoolTransport($transport, $spool);
$mailer = new Ddrv\Mailer\Mailer($wrapper);

$mailer->send($message1);
$mailer->send($message2);

// Now the letters will only be added to the queue.
// To send them, you need to execute:

$wrapper->flush(
    100, // Number of emails sent.
    5    // Number of attempts to send emails.
);

个人邮件

如果您有包含许多收件人的消息副本,但您想给每个收件人发送单独的电子邮件(无副本)

<?php

/**
 * @var Ddrv\Mailer\Mailer $mailer
 * @var Ddrv\Mailer\Contract\Message $message
 */
$mailer->personal($message);

传输工厂

如果您使用原生库传输,则可以使用 Ddrv\Mailer\TransportFactory

<?php

use Ddrv\Mailer\TransportFactory;

// smtp
$transport = TransportFactory::make('smtp://user:password@example.com:465/?encryption=tls&domain=example.com&sender=user%40exapmle.com&name=Informer');

// sendmail
$transport = TransportFactory::make('sendmail://localhost/?options=-i+-r+user%40example.com');

// file
$transport = TransportFactory::make('file:////path/to/mail/files');

// fake
$transport = TransportFactory::make('fake://localhost');