email.tpl 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. {include file='admin/header.tpl'}
  2. <div class="page-wrapper">
  3. <div class="container-xl">
  4. <div class="page-header d-print-none text-white">
  5. <div class="row align-items-center">
  6. <div class="col">
  7. <h2 class="page-title">
  8. <span class="home-title">邮件设置</span>
  9. </h2>
  10. <div class="page-pretitle my-3">
  11. <span class="home-subtitle">设置站点的邮件系统</span>
  12. </div>
  13. </div>
  14. <div class="col-auto ms-auto d-print-none">
  15. <div class="btn-list">
  16. <a id="save-setting" href="#" class="btn btn-primary">
  17. <i class="icon ti ti-device-floppy"></i>
  18. 保存
  19. </a>
  20. </div>
  21. </div>
  22. </div>
  23. </div>
  24. </div>
  25. <div class="page-body">
  26. <div class="container-xl">
  27. <div class="row row-deck row-cards">
  28. <div class="col-md-12">
  29. <div class="card">
  30. <div class="card-header">
  31. <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
  32. <li class="nav-item">
  33. <a href="#email" class="nav-link active" data-bs-toggle="tab">邮件设置</a>
  34. </li>
  35. <li class="nav-item">
  36. <a href="#limit" class="nav-link" data-bs-toggle="tab">发送限制</a>
  37. </li>
  38. <li class="nav-item">
  39. <a href="#smtp" class="nav-link" data-bs-toggle="tab">SMTP</a>
  40. </li>
  41. <li class="nav-item">
  42. <a href="#sendgrid" class="nav-link" data-bs-toggle="tab">Sendgrid</a>
  43. </li>
  44. <li class="nav-item">
  45. <a href="#mailgun" class="nav-link" data-bs-toggle="tab">Mailgun</a>
  46. </li>
  47. <li class="nav-item">
  48. <a href="#postal" class="nav-link" data-bs-toggle="tab">Postal</a>
  49. </li>
  50. <li class="nav-item">
  51. <a href="#ses" class="nav-link" data-bs-toggle="tab">AWS SES</a>
  52. </li>
  53. </ul>
  54. </div>
  55. <div class="card-body">
  56. <div class="tab-content">
  57. <div class="tab-pane active show" id="email">
  58. <div class="card-body">
  59. <div class="form-group mb-3 row">
  60. <label class="form-label col-3 col-form-label">邮件服务提供商</label>
  61. <div class="col">
  62. <select id="email_driver" class="col form-select"
  63. value="{$settings['email_driver']}">
  64. <option value="none"
  65. {if $settings['email_driver'] === "none"}selected{/if}>none
  66. </option>
  67. <option value="smtp"
  68. {if $settings['email_driver'] === "smtp"}selected{/if}>smtp
  69. </option>
  70. <option value="sendgrid"
  71. {if $settings['email_driver'] === "sendgrid"}selected{/if}>
  72. sendgrid
  73. </option>
  74. <option value="mailgun"
  75. {if $settings['email_driver'] === "mailgun"}selected{/if}>
  76. mailgun
  77. </option>
  78. <option value="postal"
  79. {if $settings['email_driver'] === "postal"}selected{/if}>
  80. postal
  81. </option>
  82. <option value="ses"
  83. {if $settings['email_driver'] === "ses"}selected{/if}>ses
  84. </option>
  85. </select>
  86. </div>
  87. </div>
  88. <div class="form-group mb-3 row">
  89. <label class="form-label col-3 col-form-label">测试邮件接收地址</label>
  90. <input type="text" class="form-control" id="recipient" value="">
  91. <div class="row my-3">
  92. <div class="col">
  93. <button id="test-email" class="btn btn-primary">发送测试邮件
  94. </button>
  95. </div>
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. <div class="tab-pane" id="limit">
  101. <div class="card-body">
  102. <div class="form-group mb-3 row">
  103. <label class="form-label col-3 col-form-label">邮箱验证码有效期(秒)</label>
  104. <div class="col">
  105. <input id="email_verify_code_ttl" type="text" class="form-control"
  106. value="{$settings['email_verify_code_ttl']}">
  107. </div>
  108. </div>
  109. <div class="form-group mb-3 row">
  110. <label class="form-label col-3 col-form-label">邮箱重设密码链接有效期(秒)</label>
  111. <div class="col">
  112. <input id="email_password_reset_ttl" type="text" class="form-control"
  113. value="{$settings['email_password_reset_ttl']}">
  114. </div>
  115. </div>
  116. <div class="form-group mb-3 row">
  117. <label class="form-label col-3 col-form-label">单个IP每小时可请求的发信次数</label>
  118. <div class="col">
  119. <input id="email_request_ip_limit" type="text" class="form-control"
  120. value="{$settings['email_request_ip_limit']}">
  121. </div>
  122. </div>
  123. <div class="form-group mb-3 row">
  124. <label class="form-label col-3 col-form-label">单个邮箱地址每小时可请求的发信次数</label>
  125. <div class="col">
  126. <input id="email_request_address_limit" type="text" class="form-control"
  127. value="{$settings['email_request_address_limit']}">
  128. </div>
  129. </div>
  130. </div>
  131. </div>
  132. <div class="tab-pane" id="smtp">
  133. <div class="card-body">
  134. <div class="form-group mb-3 row">
  135. <label class="form-label col-3 col-form-label">SMTP 主机地址</label>
  136. <div class="col">
  137. <input id="smtp_host" type="text" class="form-control"
  138. value="{$settings['smtp_host']}">
  139. </div>
  140. </div>
  141. <div class="form-group mb-3 row">
  142. <label class="form-label col-3 col-form-label">SMTP 用户名</label>
  143. <div class="col">
  144. <input id="smtp_username" type="text" class="form-control"
  145. value="{$settings['smtp_username']}">
  146. </div>
  147. </div>
  148. <div class="form-group mb-3 row">
  149. <label class="form-label col-3 col-form-label">SMTP 密码</label>
  150. <div class="col">
  151. <input id="smtp_password" type="text" class="form-control"
  152. value="{$settings['smtp_password']}">
  153. </div>
  154. </div>
  155. <div class="form-group mb-3 row">
  156. <label class="form-label col-3 col-form-label">SMTP 端口</label>
  157. <div class="col">
  158. <select id="smtp_port" class="col form-select"
  159. value="{$settings['smtp_port']}">
  160. <option value="465"
  161. {if $settings['smtp_port'] === "465"}selected{/if}>465
  162. </option>
  163. <option value="587"
  164. {if $settings['smtp_port'] === "587"}selected{/if}>587
  165. </option>
  166. <option value="443"
  167. {if $settings['smtp_port'] === "443"}selected{/if}>443
  168. </option>
  169. <option value="80"
  170. {if $settings['smtp_port'] === "80"}selected{/if}>80
  171. </option>
  172. <option value="2525"
  173. {if $settings['smtp_port'] === "2525"}selected{/if}>2525
  174. </option>
  175. <option value="25"
  176. {if $settings['smtp_port'] === "25"}selected{/if}>25
  177. </option>
  178. </select>
  179. </div>
  180. </div>
  181. <div class="form-group mb-3 row">
  182. <label class="form-label col-3 col-form-label">SMTP 发件人名称</label>
  183. <div class="col">
  184. <input id="smtp_name" type="text" class="form-control"
  185. value="{$settings['smtp_name']}">
  186. </div>
  187. </div>
  188. <div class="form-group mb-3 row">
  189. <label class="form-label col-3 col-form-label">SMTP 发信地址</label>
  190. <div class="col">
  191. <input id="smtp_sender" type="text" class="form-control"
  192. value="{$settings['smtp_sender']}">
  193. </div>
  194. </div>
  195. <div class="form-group mb-3 row">
  196. <label class="form-label col-3 col-form-label">是否使用 TLS/SSL</label>
  197. <div class="col">
  198. <select id="smtp_ssl" class="col form-select"
  199. value="{$settings['smtp_ssl']}">
  200. <option value="0" {if ! $settings['smtp_ssl']}selected{/if}>关闭
  201. </option>
  202. <option value="1" {if $settings['smtp_ssl']}selected{/if}>开启
  203. </option>
  204. </select>
  205. </div>
  206. </div>
  207. <div class="form-group mb-3 row">
  208. <label class="form-label col-3 col-form-label">客户邮件副本接收邮箱</label>
  209. <div class="col">
  210. <input id="smtp_bbc" type="text" class="form-control"
  211. value="{$settings['smtp_bbc']}">
  212. </div>
  213. </div>
  214. </div>
  215. </div>
  216. <div class="tab-pane" id="sendgrid">
  217. <div class="card-body">
  218. <div class="form-group mb-3 row">
  219. <label class="form-label col-3 col-form-label">Sendgrid 密钥</label>
  220. <div class="col">
  221. <input id="sendgrid_key" type="text" class="form-control"
  222. value="{$settings['sendgrid_key']}">
  223. </div>
  224. </div>
  225. <div class="form-group mb-3 row">
  226. <label class="form-label col-3 col-form-label">Sendgrid 发信地址</label>
  227. <div class="col">
  228. <input id="sendgrid_sender" type="text" class="form-control"
  229. value="{$settings['sendgrid_sender']}">
  230. </div>
  231. </div>
  232. <div class="form-group mb-3 row">
  233. <label class="form-label col-3 col-form-label">Sendgrid 发件人名称</label>
  234. <div class="col">
  235. <input id="sendgrid_name" type="text" class="form-control"
  236. value="{$settings['sendgrid_name']}">
  237. </div>
  238. </div>
  239. </div>
  240. </div>
  241. <div class="tab-pane" id="mailgun">
  242. <div class="card-body">
  243. <div class="form-group mb-3 row">
  244. <label class="form-label col-3 col-form-label">Mailgun 密钥</label>
  245. <div class="col">
  246. <input id="mailgun_key" type="text" class="form-control"
  247. value="{$settings['mailgun_key']}">
  248. </div>
  249. </div>
  250. <div class="form-group mb-3 row">
  251. <label class="form-label col-3 col-form-label">Mailgun 域名</label>
  252. <div class="col">
  253. <input id="mailgun_domain" type="text" class="form-control"
  254. value="{$settings['mailgun_domain']}">
  255. </div>
  256. </div>
  257. <div class="form-group mb-3 row">
  258. <label class="form-label col-3 col-form-label">Mailgun 发信地址</label>
  259. <div class="col">
  260. <input id="mailgun_sender" type="text" class="form-control"
  261. value="{$settings['mailgun_sender']}">
  262. </div>
  263. </div>
  264. <div class="form-group mb-3 row">
  265. <label class="form-label col-3 col-form-label">Mailgun 发信人名称</label>
  266. <div class="col">
  267. <input id="mailgun_sender_name" type="text" class="form-control"
  268. value="{$settings['mailgun_sender_name']}">
  269. </div>
  270. </div>
  271. </div>
  272. </div>
  273. <div class="tab-pane" id="postal">
  274. <div class="card-body">
  275. <div class="form-group mb-3 row">
  276. <label class="form-label col-3 col-form-label">Postal API地址</label>
  277. <div class="col">
  278. <input id="postal_host" type="text" class="form-control"
  279. value="{$settings['postal_host']}">
  280. </div>
  281. </div>
  282. <div class="form-group mb-3 row">
  283. <label class="form-label col-3 col-form-label">Postal API密钥</label>
  284. <div class="col">
  285. <input id="postal_key" type="text" class="form-control"
  286. value="{$settings['postal_key']}">
  287. </div>
  288. </div>
  289. <div class="form-group mb-3 row">
  290. <label class="form-label col-3 col-form-label">Postal发件邮箱</label>
  291. <div class="col">
  292. <input id="postal_sender" type="text" class="form-control"
  293. value="{$settings['postal_sender']}">
  294. </div>
  295. </div>
  296. <div class="form-group mb-3 row">
  297. <label class="form-label col-3 col-form-label">Postal发件人名称</label>
  298. <div class="col">
  299. <input id="postal_name" type="text" class="form-control"
  300. value="{$settings['postal_name']}">
  301. </div>
  302. </div>
  303. </div>
  304. </div>
  305. <div class="tab-pane" id="ses">
  306. <div class="card-body">
  307. <div class="form-group mb-3 row">
  308. <label class="form-label col-3 col-form-label">AWS 密钥 ID</label>
  309. <div class="col">
  310. <input id="aws_access_key_id" type="text" class="form-control"
  311. value="{$settings['aws_access_key_id']}">
  312. </div>
  313. </div>
  314. <div class="form-group mb-3 row">
  315. <label class="form-label col-3 col-form-label">AWS 密钥</label>
  316. <div class="col">
  317. <input id="aws_secret_access_key" type="text" class="form-control"
  318. value="{$settings['aws_secret_access_key']}">
  319. </div>
  320. </div>
  321. <div class="form-group mb-3 row">
  322. <label class="form-label col-3 col-form-label">AWS 区域</label>
  323. <div class="col">
  324. <input id="aws_region" type="text" class="form-control"
  325. value="{$settings['aws_region']}">
  326. </div>
  327. </div>
  328. <div class="form-group mb-3 row">
  329. <label class="form-label col-3 col-form-label">AWS SES 发信地址</label>
  330. <div class="col">
  331. <input id="aws_ses_sender" type="text" class="form-control"
  332. value="{$settings['aws_ses_sender']}">
  333. </div>
  334. </div>
  335. </div>
  336. </div>
  337. </div>
  338. </div>
  339. </div>
  340. </div>
  341. </div>
  342. </div>
  343. <script>
  344. $("#save-setting").click(function () {
  345. $.ajax({
  346. url: '/admin/setting/email',
  347. type: 'POST',
  348. dataType: "json",
  349. data: {
  350. {foreach $update_field as $key}
  351. {$key}: $('#{$key}').val(),
  352. {/foreach}
  353. },
  354. success: function (data) {
  355. if (data.ret === 1) {
  356. $('#success-message').text(data.msg);
  357. $('#success-dialog').modal('show');
  358. } else {
  359. $('#fail-message').text(data.msg);
  360. $('#fail-dialog').modal('show');
  361. }
  362. }
  363. })
  364. });
  365. $("#test-email").click(function () {
  366. $.ajax({
  367. url: '/admin/setting/test/email',
  368. type: 'POST',
  369. dataType: "json",
  370. data: {
  371. recipient: $('#recipient').val(),
  372. },
  373. success: function (data) {
  374. if (data.ret === 1) {
  375. $('#success-noreload-message').text(data.msg);
  376. $('#success-noreload-dialog').modal('show');
  377. } else {
  378. $('#fail-message').text(data.msg);
  379. $('#fail-dialog').modal('show');
  380. }
  381. }
  382. })
  383. });
  384. </script>
  385. {include file='admin/footer.tpl'}