-
Notifications
You must be signed in to change notification settings - Fork 1
/
Mailer.php
209 lines (198 loc) · 5.67 KB
/
Mailer.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
<?php
namespace bailangzhan;
use Yii;
use yii\base\InvalidConfigException;
/**
* 发送邮件处理类
*
* Forexample:
*
* send a text message
*
* ```php
* $message = [
'to' => 'xxx@qq.com',
'subject' => 'just a test.',
'content' => 'This just a test.',
];
$mailer = new Mailer(Mailer::TYPE_1, $messages);
$result = $mailer->sendMessage();
* ```
*
* If the message you want to send is an html template page, you can do so:
* ```php
* $message = [
'to' => 'xxx@qq.com',
'subject' => 'just a test.',
'content' => 'This just a test.',
'view' => Yii::$app->mailer->viewPath,
'params' => [
'name' => 'xiaoming',
'age' => 20
]
];
* ```
* name and age is the corresponding variable inside the view
*
* Send text messages in bulk
* ```php
* $messages = [
[
'to' => 'xxx@qq.com',
'subject' => 'just a test.',
'content' => 'This just a test.',
],
[
'to' => 'xxx@qq.com',
'subject' => 'just a test2.',
'content' => 'This just a test2.',
]
];
$mailer = new Mailer(Mailer::TYPE_2, $messages);
$result = $mailer->sendMessage();
* ```
*/
class Mailer
{
/**
* @var Yii::$app->mailer
*/
private $_mailer;
/**
* @var mailer config, name-value pairs
*
* For example:
*
* ```php
* [
* 'to' => '',
* 'subject' => '',
* 'content' => '',
* 'view' => null,
* 'params' => [],
* ]
* ```
*/
public $message = [];
public $type;
// one
const TYPE_1 = 1;
// multi
const TYPE_2 = 2;
public function __construct($type, $message = null)
{
// init
if ($this->_mailer == null) {
$this->_mailer = Yii::$app->mailer;
}
$this->message = $message;
$this->type = $type;
// configuration check
$this->checkType();
$this->check();
}
/**
* send a text message
* @param array $message refer to $this->message
*/
public function text($message = null)
{
!$message && $message = $this->message;
$result = $this->_mailer
->compose(
!empty($message['view']) ? $message['view'] : null,
!empty($message['params']) ? (array) $message['params'] : []
)
->setTo($message['to'])
->setSubject($message['subject'])
->setTextBody($message['content']);
return $result;
}
/**
* Send text messages in bulk
* @return Array $messages
*/
public function multiText()
{
$messages = [];
foreach ($this->message as $message) {
$messages[] = $this->text($message);
}
return $messages;
}
public function sendMessage()
{
try {
$result = null;
// choose diffrent send type
switch ($this->type) {
case self::TYPE_1:
$result = $this->text()->send();
break;
case self::TYPE_2:
$messages = $this->multiText();
$result = $this->_mailer->sendMultiple($messages);
break;
default:
break;
}
} catch (\Exception $e) {
$msg = $e->getMessage();
$logObject = Yii::getLogger();
$logObject->log($msg, \yii\log\Logger::LEVEL_ERROR);
$logObject->flush(true);
throw new \Exception("Error: {$msg}.", 1);
}
return $result;
}
/**
* Check the configuration is correct
*/
public function check()
{
$tempMessage = $this->message;
$multi = current($tempMessage);
$count = 0;
switch ($this->type) {
case self::TYPE_1:
if (!is_array($multi)) {
$this->singleCheck($this->message);
$count ++;
}
break;
case self::TYPE_2:
if (is_array($multi)) {
foreach ($this->message as $msg) {
$this->singleCheck($msg);
$count ++;
}
}
break;
default:
break;
}
if (!$count) {
throw new InvalidConfigException("Your configuration is wrong.", 1);
}
return $count;
}
public function singleCheck($message)
{
if (!is_array($message)) {
throw new InvalidConfigException("Mailer::\$message must be an array, please refer to Mailer::\$message configuration.", 1);
}
if (empty($message['to']) || empty($message['subject'])) {
throw new InvalidConfigException("\$message['to'] and \$message['subject'] must be set.", 1);
}
if (empty($message['view']) && empty($message['content'])) {
throw new InvalidConfigException("If you have not set \$message['view'], you have to set \$message['content'].", 1);
}
return true;
}
public function checkType()
{
if (!in_array($this->type, [self::TYPE_1, self::TYPE_2])) {
throw new InvalidConfigException("you have not set up Mailer::\$type, please refer to Mailer::\$type configuration.", 1);
}
}
}