Просмотр исходного кода

Merge pull request #2734 from weseek/imprv/send-test-email-with-smtp

Imprv/send test email with smtp
yusuketk 5 лет назад
Родитель
Сommit
b4a800c074

+ 2 - 0
resource/locales/en_US/admin/admin.json

@@ -28,6 +28,8 @@
     "update": "Update",
     "mail_settings": "E-mail Settings",
     "from_e-mail_address": "From e-mail address",
+    "send_test_email": "Send a test-email",
+    "success_to_send_test_email": "Success to send a test-email",
     "smtp_settings": "SMTP settings",
     "host": "Host",
     "port": "Port",

+ 2 - 0
resource/locales/ja_JP/admin/admin.json

@@ -28,6 +28,8 @@
     "update": "更新",
     "mail_settings": "メールの設定",
     "from_e-mail_address": "Fromアドレス",
+    "send_test_email": "テストメールを送信",
+    "success_to_send_test_email": "テストメールを送信しました。",
     "smtp_settings": "SMTP設定",
     "host": "ホスト",
     "port": "ポート",

+ 3 - 1
resource/locales/zh_CN/admin/admin.json

@@ -28,7 +28,9 @@
 		"update": "更新",
 		"mail_settings": "邮件设置",
 		"from_e-mail_address": "From e-mail address",
-		"smtp_settings": "SMTP 设置",
+    "send_test_email": "Send a test-email",
+    "success_to_send_test_email": "Success to send a test-email",
+    "smtp_settings": "SMTP 设置",
 		"host": "服务器",
 		"port": "端口号",
 		"user": "用户名",

+ 15 - 0
src/client/js/components/Admin/App/SmtpSetting.jsx

@@ -31,6 +31,18 @@ function SmtpSetting(props) {
     }
   }
 
+  async function sendTestEmailHandler() {
+    const { adminAppContainer } = props;
+    try {
+      await adminAppContainer.sendTestEmail();
+      toastSuccess(t('admin:app_setting.success_to_send_test_email'));
+    }
+    catch (err) {
+      toastError(err);
+      logger.error(err);
+    }
+  }
+
   return (
     <React.Fragment>
       <div id="mail-smtp" className="tab-pane active mt-5">
@@ -81,6 +93,9 @@ function SmtpSetting(props) {
             <button type="button" className="btn btn-primary" onClick={submitHandler} disabled={adminAppContainer.state.retrieveError != null}>
               { t('Update') }
             </button>
+            <button type="button" className="btn btn-secondary ml-4" onClick={sendTestEmailHandler}>
+              {t('admin:app_setting.send_test_email')}
+            </button>
           </div>
         </div>
 

+ 8 - 0
src/client/js/services/AdminAppContainer.js

@@ -278,6 +278,14 @@ export default class AdminAppContainer extends Container {
     return mailSettingParams;
   }
 
+  /**
+   * send test e-mail
+   * @memberOf AdminAppContainer
+   */
+  async sendTestEmail() {
+    return this.appContainer.apiv3.post('/app-settings/smtp-test');
+  }
+
   /**
    * Update AWS setting
    * @memberOf AdminAppContainer

+ 19 - 17
src/server/routes/apiv3/app-settings.js

@@ -313,7 +313,7 @@ module.exports = (crowi) => {
   /**
    * validate mail setting send test mail
    */
-  async function sendTestEmail(req) {
+  async function sendTestEmail(destinationAddress) {
 
     const { configManager, mailService } = crowi;
 
@@ -326,14 +326,19 @@ module.exports = (crowi) => {
       throw Error('fromAddress is not setup');
     }
 
+    const smtpHost = configManager.getConfig('crowi', 'mail:smtpHost');
+    const smtpPort = configManager.getConfig('crowi', 'mail:smtpPort');
+    const smtpUser = configManager.getConfig('crowi', 'mail:smtpUser');
+    const smtpPassword = configManager.getConfig('crowi', 'mail:smtpPassword');
+
     const option = {
-      host: req.body.smtpHost,
-      port: req.body.smtpPort,
+      host: smtpHost,
+      port: smtpPort,
     };
-    if (req.body.smtpUser && req.body.smtpPassword) {
+    if (smtpUser && smtpPassword) {
       option.auth = {
-        user: req.body.smtpUser,
-        pass: req.body.smtpPassword,
+        user: smtpUser,
+        pass: smtpPassword,
       };
     }
     if (option.port === 465) {
@@ -345,7 +350,7 @@ module.exports = (crowi) => {
 
     const mailOptions = {
       from: fromAddress,
-      to: req.user.email,
+      to: destinationAddress,
       subject: 'Wiki管理設定のアップデートによるメール通知',
       text: 'このメールは、WikiのSMTP設定のアップデートにより送信されています。',
     };
@@ -367,10 +372,13 @@ module.exports = (crowi) => {
 
     return {
       isMailerSetup: mailService.isMailerSetup,
+      fromAddress: configManager.getConfig('crowi', 'mail:from'),
       smtpHost: configManager.getConfig('crowi', 'mail:smtpHost'),
       smtpPort: configManager.getConfig('crowi', 'mail:smtpPort'),
       smtpUser: configManager.getConfig('crowi', 'mail:smtpUser'),
       smtpPassword: configManager.getConfig('crowi', 'mail:smtpPassword'),
+      sesAccessKeyId: configManager.getConfig('crowi', 'mail:sesAccessKeyId'),
+      sesSecretAccessKey: configManager.getConfig('crowi', 'mail:sesSecretAccessKey'),
     };
   };
 
@@ -459,29 +467,23 @@ module.exports = (crowi) => {
    *    /app-settings/smtp-test:
    *      post:
    *        tags: [AppSettings]
-   *        operationId: posyAppSettingSmtpTast
+   *        operationId: postSmtpTest
    *        summary: /app-settings/smtp-setting
    *        description: Send test mail for smtp
-   *        requestBody:
-   *          required: true
-   *          content:
-   *            application/json:
-   *              schema:
-   *                $ref: '#/components/schemas/SmtpSettingParams'
    *        responses:
    *          200:
    *            description: Succeeded to send test mail for smtp
    */
-  router.post('/smtp-test', loginRequiredStrictly, adminRequired, csrf, validator.smtpSetting, apiV3FormValidator, async(req, res) => {
+  router.post('/smtp-test', loginRequiredStrictly, adminRequired, async(req, res) => {
     try {
-      await sendTestEmail(req);
+      await sendTestEmail(req.user.email);
       return res.apiv3({});
     }
     catch (err) {
       const msg = req.t('validation.failed_to_send_a_test_email');
       logger.error('Error', err);
       debug('Error validate mail setting: ', err);
-      return res.apiv3Err(new ErrorV3(msg, 'update-mailSetting-failed'));
+      return res.apiv3Err(new ErrorV3(msg, 'send-email-with-smtp-failed'));
     }
   });