소스 검색

feat(email): add postmark support

Anankke 11 달 전
부모
커밋
08335b600c
5개의 변경된 파일100개의 추가작업 그리고 1개의 파일을 삭제
  1. 27 0
      config/settings.json
  2. 32 0
      resources/views/tabler/admin/setting/email.tpl
  3. 4 0
      src/Controllers/Admin/Setting/EmailController.php
  4. 3 1
      src/Services/Mail.php
  5. 34 0
      src/Services/Mail/Postmark.php

+ 27 - 0
config/settings.json

@@ -404,6 +404,33 @@
         "default": "",
         "mark": "sendgrid发件人名称"
     },
+    {
+        "item": "postmark_key",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Postmark 密钥"
+    },
+    {
+        "item": "postmark_sender",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "",
+        "mark": "Postmark 发件邮箱"
+    },
+    {
+        "item": "postmark_stream",
+        "value": "",
+        "class": "email",
+        "is_public": 0,
+        "type": "string",
+        "default": "outbound",
+        "mark": "Postmark 邮件 stream"
+    },
     {
         "item": "postal_host",
         "value": "",

+ 32 - 0
resources/views/tabler/admin/setting/email.tpl

@@ -57,6 +57,9 @@
                                 <li class="nav-item">
                                     <a href="#alibabacloud" class="nav-link" data-bs-toggle="tab">AlibabaCloud DM</a>
                                 </li>
+                                <li class="nav-item">
+                                    <a href="#postmark" class="nav-link" data-bs-toggle="tab">Postmark</a>
+                                </li>
                             </ul>
                         </div>
                         <div class="card-body">
@@ -98,6 +101,10 @@
                                                             {if $settings['email_driver'] === "alibabacloud"}selected{/if}>
                                                         alibabacloud
                                                     </option>
+                                                    <option value="postmark"
+                                                            {if $settings['email_driver'] === "postmark"}selected{/if}>
+                                                        postmark
+                                                    </option>
                                                 </select>
                                             </div>
                                         </div>
@@ -414,6 +421,31 @@
                                         </div>
                                     </div>
                                 </div>
+                                <div class="tab-pane" id="postmark">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Api Key</label>
+                                            <div class="col">
+                                                <input id="postmark_key" type="text" class="form-control"
+                                                       value="{$settings['postmark_key']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">发件人</label>
+                                            <div class="col">
+                                                <input id="postmark_sender" type="text" class="form-control"
+                                                       value="{$settings['postmark_sender']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Stream</label>
+                                            <div class="col">
+                                                <input id="postmark_stream" type="text" class="form-control"
+                                                       value="{$settings['postmark_stream']}">
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
                             </div>
                         </div>
                     </div>

+ 4 - 0
src/Controllers/Admin/Setting/EmailController.php

@@ -59,6 +59,10 @@ final class EmailController extends BaseController
         'alibabacloud_dm_endpoint',
         'alibabacloud_dm_account_name',
         'alibabacloud_dm_from_alias',
+        // Postmark
+        'postmark_key',
+        'postmark_sender',
+        'postmark_stream',
     ];
 
     /**

+ 3 - 1
src/Services/Mail.php

@@ -13,6 +13,7 @@ use App\Services\Mail\Postal;
 use App\Services\Mail\SendGrid;
 use App\Services\Mail\Ses;
 use App\Services\Mail\Smtp;
+use App\Services\Mail\Postmark;
 use Exception;
 use Psr\Http\Client\ClientExceptionInterface;
 use Smarty\Smarty;
@@ -22,7 +23,7 @@ use Smarty\Smarty;
  */
 final class Mail
 {
-    public static function getClient(): AlibabaCloud|Mailchimp|Mailgun|NullMail|Postal|SendGrid|Ses|Smtp
+    public static function getClient(): AlibabaCloud|Mailchimp|Mailgun|NullMail|Postal|SendGrid|Ses|Smtp|Postmark
     {
         return match (Config::obtain('email_driver')) {
             'alibabacloud' => new AlibabaCloud(),
@@ -32,6 +33,7 @@ final class Mail
             'sendgrid' => new SendGrid(),
             'ses' => new Ses(),
             'smtp' => new Smtp(),
+            'postmark' => new Postmark(),
             default => new NullMail(),
         };
     }

+ 34 - 0
src/Services/Mail/Postmark.php

@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Services\Mail;
+
+use App\Models\Config;
+use GuzzleHttp\Client;
+
+final class Postmark extends Base
+{
+    public function send($to, $subject, $body): void
+    {
+        $configs = Config::getClass('email');
+        $client = new Client();
+        $res = $client->post('https://api.postmarkapp.com/email', [
+            'headers' => [
+                'Content-Type' => 'application/json',
+                'X-Postmark-Server-Token' => $configs['postmark_key'],
+            ],
+            'json' => [
+                'From' => $configs['postmark_sender'],
+                'To' => $to,
+                'Subject' => $subject,
+                'HtmlBody' => $body,
+                'MessageStream' => $configs['postmark_stream'],
+            ],
+        ]);
+
+        if ($res->getStatusCode() !== 200) {
+            throw new Exception($msg_response->getBody()->getContents());
+        }
+    }
+}