From 16b81fff380023e3795d7c7a82f7cd7de5ffbcc7 Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Thu, 4 Jul 2019 21:07:02 +0900
Subject: [PATCH] Resolve #3431

---
 CHANGELOG.md                                 |  1 +
 locales/ja-JP.yml                            |  2 ++
 src/client/app/admin/views/instance.vue      | 27 ++++++++++++++++++++
 src/server/api/endpoints/admin/send-email.ts | 26 +++++++++++++++++++
 4 files changed, 56 insertions(+)
 create mode 100644 src/server/api/endpoints/admin/send-email.ts

diff --git a/CHANGELOG.md b/CHANGELOG.md
index f8a34fcb7..17b622381 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -26,6 +26,7 @@ unreleased
 * APNGサポート
 * アバターファイル選択でimage以外は表示しないように
 * データベース手動バキューム機能
+* メールサーバー設定が正しいか確認できるように
 * ピン止めの上限に達したときエラーを表示するように
 * AP: attributedTo, to, cc が Array や Object のパターンに対応
 * AP: object type が Audio, Document, Image, Page, Video のパターンに対応
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index f6e36c045..6040be045 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -1389,6 +1389,8 @@ admin/views/instance.vue:
   smtp-auth: "SMTP認証を行う"
   smtp-user: "SMTPユーザー"
   smtp-pass: "SMTPパスワード"
+  test-email: "テスト"
+  test-email-to: "テストメールの送信先アドレス"
   serviceworker-config: "ServiceWorker"
   enable-serviceworker: "ServiceWorkerを有効にする"
   serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
diff --git a/src/client/app/admin/views/instance.vue b/src/client/app/admin/views/instance.vue
index 588b24f6b..7d271bcb8 100644
--- a/src/client/app/admin/views/instance.vue
+++ b/src/client/app/admin/views/instance.vue
@@ -129,6 +129,7 @@
 					<ui-input v-model="smtpPass" type="password" :with-password-toggle="true" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-pass') }}</ui-input>
 				</ui-horizon-group>
 				<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template #desc>{{ $t('smtp-secure-info') }}</template></ui-switch>
+				<ui-button @click="testEmail()">{{ $t('test-email') }}</ui-button>
 			</template>
 		</section>
 		<section>
@@ -424,6 +425,32 @@ export default Vue.extend({
 			});
 		},
 
+		async testEmail() {
+			const { canceled, result: to } = await this.$root.dialog({
+				title: this.$t('test-email-to'),
+				input: {
+					type: 'email',
+				},
+				showCancelButton: true
+			});
+			if (canceled) return;
+			this.$root.api('admin/send-email', {
+				to: to,
+				subject: 'Test email',
+				text: 'Yo'
+			}).then(x => {
+				this.$root.dialog({
+					type: 'success',
+					splash: true
+				});
+			}).catch(e => {
+				this.$root.dialog({
+					type: 'error',
+					text: e
+				});
+			});
+		},
+
 		updateMeta() {
 			this.$root.api('admin/update-meta', {
 				maintainerName: this.maintainerName,
diff --git a/src/server/api/endpoints/admin/send-email.ts b/src/server/api/endpoints/admin/send-email.ts
new file mode 100644
index 000000000..fed4f2df1
--- /dev/null
+++ b/src/server/api/endpoints/admin/send-email.ts
@@ -0,0 +1,26 @@
+import $ from 'cafy';
+import define from '../../define';
+import { sendEmail } from '../../../../services/send-email';
+
+export const meta = {
+	tags: ['admin'],
+
+	requireCredential: true,
+	requireModerator: true,
+
+	params: {
+		to: {
+			validator: $.str,
+		},
+		subject: {
+			validator: $.str,
+		},
+		text: {
+			validator: $.str,
+		},
+	}
+};
+
+export default define(meta, async (ps) => {
+	await sendEmail(ps.to, ps.subject, ps.text);
+});