123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- <?php
- namespace App\Modules\Message;
- use App\Consts\SysConsts;
- use Exception;
- use GuzzleHttp\Client;
- use Illuminate\Support\Facades\Log;
- /**
- * 邮件通知
- */
- class MailNotify
- {
- /**
- * code
- */
- private $project_code = SysConsts::PROJECT_CODE;
- /**
- * key
- */
- private $project_key = SysConsts::PROJECT_KEY;
- /**
- * 通知地址
- */
- private $url = SysConsts::MESSAGE_NOTIFY_BASE_URI;
- /**
- * 收件人
- */
- private $to_emails;
- /**
- * 抄送
- */
- private $cc_emails;
- /**
- * 主题
- */
- private $subject;
- /**
- * 邮件内容
- */
- private $body;
- /**
- * 邮件附件
- */
- private $attaches;
- /**
- * 时间戳
- */
- private $timestamps;
- /**
- * 通知方式
- */
- private $method;
- /**
- * 请求路由
- */
- private $path;
- public function __construct(array $data)
- {
- $this->to_emails = $data['to_emails'];
- $this->cc_emails = isset($data['cc_emails']) ? $data['cc_emails'] : '';
- $this->subject = $data['subject'];
- $this->body = $data['body'];
- $this->delay_times = isset($data['delay_times']) ? $data['delay_times'] : 0;
- $this->method = 'POST';
- $this->path = 'send_raw_email';
- $this->timestamps = time();
- }
- /**
- * 添加附件
- */
- public function addAttach(string $file_path, string $file_name = '')
- {
- if (!$this->attaches) {
- $this->attaches = [];
- }
- if (!$file_name) {
- preg_match('/([0-9a-zA-Z\x{4e00}-\x{9fa5}]+)\.?\w*$/u', $file_path, $mathes);
- $file_name = $mathes[0];
- }
- $this->attaches[] = ['file_name' => $file_name, 'file_path' => $file_path];
- }
- /**
- * 生成签名
- */
- private function makeSign()
- {
- return md5($this->project_code . $this->timestamps . $this->project_key);
- }
- /**
- * 设置请求参数
- */
- private function setRequestOptions()
- {
- $project_code = $this->project_code;
- $timestamp = $this->timestamps;
- $sign = $this->makeSign();
- $to_email = $this->to_emails;
- $cc_email = $this->cc_emails;
- $subject = $this->subject;
- $body = $this->body;
- $delay_times = $this->delay_times;
- $params = compact('project_code', 'timestamp', 'sign', 'to_email', 'cc_email', 'subject', 'body', 'delay_times');
- if ($this->attaches) {
- $mults = collect($params)->map(function ($item, $k) {
- return ['name' => $k, 'contents' => $item];
- })->all();
- foreach ($this->attaches as $attach) {
- $mults[] = [
- 'name' => str_replace('.', '_', $attach['file_name']),
- 'contents' => fopen(storage_path($attach['file_path']), 'r+'),
- 'filename' => $attach['file_name'],
- ];
- }
- return ['multipart' => $mults];
- } else {
- return ['form_params' => $params];
- }
- }
- /**
- * 发送消息通知
- */
- public function notify()
- {
- $client = new Client(['base_uri' => $this->url, 'timesout' => 10]);
- try {
- $options = $this->setRequestOptions();
- $response = $client->request($this->method, $this->path, $options);
- $contents = $response->getBody()->getContents();
- if ($contents) {
- $result = json_decode($contents);
- if ($result->code === 0) {
- return true;
- } else {
- Log::error('email_notify: ' . $contents);
- }
- } else {
- Log::error('email_notify: no response');
- }
- } catch (Exception $e) {
- Log::error('email_notify: ' . $e->getMessage());
- }
- }
- }
|