symfony mailer 郵件插件

簡(jiǎn)介
基于 symfony mailer二次開(kāi)發(fā) 支持郵件模板、純文本、附件郵件發(fā)送以及更多郵件功能, 郵件發(fā)送簡(jiǎn)單到只需一行代碼
安裝
composer require yzh52521/webman-mailer
php版本要求在php7.2.5 +
使用
配置
配置文件 config/plugin/yzh52521/mailer/app.php
內(nèi)容如下
return [
'enable' => true,
'mailer' =>[
'scheme' => 'smtp',// "smtps": using TLS, "smtp": without using TLS.
'host' => '', // 服務(wù)器地址
'username' => '', //用戶名
'password' => '', // 密碼
'port' => 25, // SMTP服務(wù)器端口號(hào),一般為25
'options' => [], // See: https://symfony.com/doc/current/mailer.html#tls-peer-verification
],
'from' => [
'address' => 'hello@example.com',
'name' => 'Example',
],
];
or
return [
'enable' => true,
'mailer' =>[
'dsn' => 'smtp://username:password@smtp.example.com:25', //默認(rèn)優(yōu)先使用該配置
],
'from' => [
'address' => 'hello@example.com',
'name' => 'Example',
],
];
優(yōu)雅的發(fā)送郵件
use yzh52521\mailer\Mailer;
Mailer::setFrom('10086@qq.com')
->setTo('your-mail@domain.com')
->setSubject('純文本測(cè)試')
->setTextBody('歡迎您使用webman-mailer')
->send();
創(chuàng)建實(shí)例
不傳遞任何參數(shù)表示使用配置文件里默認(rèn)的配置
$mailer = new yzh52521\mailer\mail\Mailer();
設(shè)置發(fā)件人
發(fā)件人郵箱地址必須和配配置里的 username 一致
$mailer->setFrom('10086@qq.com');
$mailer->setFrom(['10086@qq.com'=>'發(fā)件人']);
or
$mailer->addFrom('10086@qq.com');
$mailer->addFrom(['10086@qq.com'=>'發(fā)件人']);
設(shè)置收件人
以下幾種方式任選一種
$mailer->setTo('10086@qq.com');
$mailer->setTo(['tianpian0805@qq.com', '10086@qq.com']);
or
$mailer->addTo('10086@qq.com');
$mailer->addTo(['tianpian0805@qq.com', '10086@qq.com']);
設(shè)置抄送
以下幾種方式任選一種
$mailer->setCc('10086@qq.com');
$mailer->setCc(['tianpian0805@qq.com', '10086@qq.com']);
or
$mailer->addCc('10086@qq.com');
$mailer->addCc(['tianpian0805@qq.com', '10086@qq.com']);
設(shè)置暗抄送
以下幾種方式任選一種
$mailer->setBcc('10086@qq.com');
$mailer->setBcc(['tianpian0805@qq.com', '10086@qq.com']);
or
$mailer->addBcc('10086@qq.com');
$mailer->addBcc(['tianpian0805@qq.com', '10086@qq.com']);
設(shè)置回復(fù)郵件地址
$mailer->setReplyTo(['10086@qq.com']);
$mailer->setReplyTo('10086@qq.com');
or
$mailer->addReplyTo(['10086@qq.com']);
$mailer->addReplyTo('10086@qq.com');
設(shè)置郵件主題
$mailer->setSubject('郵件主題');
設(shè)置郵件內(nèi)容 - 純文本
$mailer->setTextBody('歡迎使用webman-mailer');
或者使用變量替換純文本內(nèi)容
$mailer->setTextBody('歡迎使用{name}', ['name' => 'webman-mailer']);
設(shè)置富文本郵件內(nèi)容 - HTML
$mailer->setHtmlBody('<p>歡迎使用webman-mailer</p>');
或者使用變量替換HTML內(nèi)容
$mailer->setHtmlBody('<p>歡迎使用{name}</p>', ['name' => 'webman-mailer']);
設(shè)置郵件內(nèi)容 - 模板
自動(dòng)使用webman 使用的模版 相關(guān)配置在 config/view.php
模板的使用, 具體請(qǐng)看webman視圖怎么用, 第二個(gè)參數(shù)是要進(jìn)行模板賦值的數(shù)組
http://www.wtbis.cn/doc/webman/view.html
這里主要介紹thinkphp模版的使用
$mailer->view('mail/register');
$mailer->view('mail/register', ['account' => $account, 'name' => $name]);
將圖片作為元數(shù)據(jù)嵌入到郵件中
郵件內(nèi)容中包含圖片的, 可以直接指定 img
標(biāo)簽的 src
屬性為遠(yuǎn)程圖片地址, 此處圖片地址必須為遠(yuǎn)程圖片地址, 必須為一個(gè)帶域名的完整圖片鏈接, 這似乎很麻煩, 所以你還可以將圖片作為元數(shù)據(jù)嵌入到郵件中,
至于其他文件是否也可以嵌入請(qǐng)自己嘗試
下面介紹一下 webman-mailer
如何快速簡(jiǎn)便的將圖片元數(shù)據(jù)嵌入到郵件中:
配置嵌入標(biāo)簽
嵌入元數(shù)據(jù)需要在模板賦值或者使用 setHtmlBody()
傳遞變量時(shí), 給變量添加特殊的標(biāo)簽, 該嵌入標(biāo)簽?zāi)J(rèn)為 cid:
, 你可以修改配置文件中 embed
項(xiàng), 修改為你想要的形式
模板或HTML中設(shè)置變量
在模板中, 例如 ThinkPHP框架 都是使用 {$var}
的形式傳遞變量, 假設(shè)變量為 image_src
, 那么模板中填寫(xiě) {$image_src}
, 如果是在HTML中, 請(qǐng)使用 {image_src}
,
注意如果修改過(guò)左、右定界符請(qǐng)使用自己定義的左右定界符
傳遞變量參數(shù)和值
在 setHtmlBody()
和 view()
方法的第二個(gè)參數(shù)里, 該數(shù)組必須有一個(gè)變量, 格式為 ['cid:image_src'] => '/path/to/image.jpg']
或者 ['cid:image_src'] => ['file_stream', 'filename','filemime']]
, 即參數(shù)數(shù)組的鍵名是上面配置的 嵌入標(biāo)簽 + 變量名
, 但值有兩種情況:
第一, 如果值為字符串, 則該值為圖片的路徑 (絕對(duì)路徑或相對(duì)路徑) 或者 有效的url地址
第二, 如果值為數(shù)組, 數(shù)組為 ['stream','name','mime']
的形式, 其中 stream
表示圖片的數(shù)據(jù)流,
即是未保存的文件數(shù)據(jù)流, 例如 fopen()
方法獲取的文件數(shù)據(jù)流, 第二個(gè)參數(shù)為文件名, 默認(rèn)為 image
,第三個(gè)參數(shù)可選, 為文件的mime類(lèi)型, 默認(rèn)為 null
示例
$mailer->setForm('10086@qq.com')
->setTo('10086@qq.com')
->setSubject('測(cè)試郵件模板中嵌入圖片元數(shù)據(jù)')
->view('mail/index', [
'date' => date('Y-m-d H:i:s'),
'cid:image' => '/path/to/images/image.jpg',
// 'cid:image' => '/path/to/images/image.jpg',
// 'cid:image' => [fopen('/path/to/images/image.jpg','r')],
// 'cid:image' => [fopen('/path/to/images/image.jpg','r'), 'image','image/jpg'],
])
->send();
其中模板的內(nèi)容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>測(cè)試郵件</title>
</head>
<body>
<p>尊敬的yzh52521:</p>
<p> 這是一封模板測(cè)試郵件</p>
<p>{$date}</p>
<p>
<img src="{$image}" alt="">
</p>
</body>
</html>
在 HTML 中使用一樣:
$mailer
->setForm('10086@qq.com')
->setTo('10086@qq.com')
->setSubject('測(cè)試郵件模板中嵌入圖片元數(shù)據(jù)')
->setHtmlBody('<img src="{image}" />圖片測(cè)試', [
'cid:image' => '/path/to/images/image.jpg',
// 'cid:image' => '/path/to/images/image.jpg',
// 'cid:image' => [fopen('/path/to/images/image.jpg','r')],
// 'cid:image' => [fopen('/path/to/images/image.jpg','r'), 'image','image/jpg')],
])
->send();
添加附件
$mailer->attach('/path/to/images/file.jpg');
$mailer->attachContent(fopen('/path/to/documents/contract.doc', 'r'))
或者指定附件的文件名
$mailer->attach('/path/to/images/foo.jpg', ['fileName'=>文件名.jpg','contentType'=>'image/jpeg']);
$mailer->attachContent(fopen('/path/to/documents/contract.doc', 'r'), ['fileName'=>文件名.doc','contentType'=>'application/msword'])
設(shè)置消息加密/簽名
消息加密
$encrypter=new SMimeEncrypter('/path/to/certificate.crt');
$mailer->encryper = $encryptor;
相關(guān)文檔 https://symfony.com/doc/current/mailer.html#encrypting-messages
簽名
$signer = new DkimSigner('/path/to/private-key.key', 'example.com', 'sf');
or
$signer = new SMimeSigner('/path/to/certificate.crt', '/path/to/certificate-private-key.key');
$mailer->signer =$signer;
相關(guān)文檔 https://symfony.com/doc/current/mailer.html#signing-messages
設(shè)置字符編碼
$mailer->setCharset('utf8');
設(shè)置郵件優(yōu)先級(jí)
$mailer->setPriority(1);
// 可選值有:
// 1 Highest
// 2 High
// 3 Normal
// 4 Low
// 5 Lowest
發(fā)送郵件
$mailer->send();
使用匿名函數(shù) $message是 \Symfony\Component\Mime\Email 對(duì)象
$mailer->send(function ($mailer,$message) {
$mailer->setFrom('10086@qq.com')
->setTo('10086@qq.com')
->setSubject('測(cè)試郵件')
->setTextBody('測(cè)試內(nèi)容');
});
第二個(gè)參數(shù)是數(shù)組, 可以重新設(shè)置郵件配置
$mailer->send(
function ($message) {
$mailer->setFrom('10086@qq.com')
->setTo('10086@qq.com')
->setSubject('測(cè)試郵件')
->setTextBody('測(cè)試內(nèi)容');
},
[
'scheme'=>'',
'host' => '', // 服務(wù)器地址
'username' => '', //用戶名
'password' => '', // 密碼
'port' => 25, // SMTP服務(wù)器端口號(hào),一般為25
]
);
郵件發(fā)送失敗會(huì)直接以異常拋出, 或者可以通過(guò) getError()
獲取錯(cuò)誤信息
$mailer->getError();
預(yù)覽郵件內(nèi)容
$mailer->sender();
使用 getHeaders()
和 getHeadersString()
方法可以獲取頭信息
getHeaders()
返回的是頭信息數(shù)組, getHeadersString()
返回的是頭信息字符串