diff --git a/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala index ded55b3..716cb16 100644 --- a/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala +++ b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala @@ -3,8 +3,8 @@ import java.io.FileInputStream import gitbucket.core.admin.html -import gitbucket.core.service.{AccountService, SystemSettingsService, RepositoryService} -import gitbucket.core.util.AdminAuthenticator +import gitbucket.core.service.{AccountService, RepositoryService, SystemSettingsService} +import gitbucket.core.util.{AdminAuthenticator, Mailer} import gitbucket.core.ssh.SshServer import gitbucket.core.plugin.PluginRegistry import SystemSettingsService._ @@ -13,7 +13,8 @@ import gitbucket.core.util.Directory._ import gitbucket.core.util.StringUtil._ import io.github.gitbucket.scalatra.forms._ -import org.apache.commons.io.{IOUtils, FileUtils} +import org.apache.commons.io.{FileUtils, IOUtils} +import org.apache.commons.mail.{DefaultAuthenticator, HtmlEmail} import org.scalatra.i18n.Messages class SystemSettingsController extends SystemSettingsControllerBase @@ -70,11 +71,20 @@ ).flatten } - private val pluginForm = mapping( - "pluginId" -> list(trim(label("", text()))) - )(PluginForm.apply) + private val sendMailForm = mapping( + "smtp" -> mapping( + "host" -> trim(label("SMTP Host", text(required))), + "port" -> trim(label("SMTP Port", optional(number()))), + "user" -> trim(label("SMTP User", optional(text()))), + "password" -> trim(label("SMTP Password", optional(text()))), + "ssl" -> trim(label("Enable SSL", optional(boolean()))), + "fromAddress" -> trim(label("FROM Address", optional(text()))), + "fromName" -> trim(label("FROM Name", optional(text()))) + )(Smtp.apply), + "testAddress" -> trim(label("", text(required))) + )(SendMailForm.apply) - case class PluginForm(pluginIds: List[String]) + case class SendMailForm(smtp: Smtp, testAddress: String) case class DataExportForm(tableNames: List[String]) @@ -152,6 +162,18 @@ redirect("/admin/system") }) + post("/admin/system/sendmail", sendMailForm)(adminOnly { form => + try { + new Mailer(form.smtp).send(form.testAddress, + "Test message from GitBucket", "This is a test message from GitBucket.") + + "Test mail has been sent to: " + form.testAddress + + } catch { + case e: Exception => "[Error] " + e.toString + } + }) + get("/admin/plugins")(adminOnly { html.plugins(PluginRegistry().getPlugins()) }) diff --git a/src/main/scala/gitbucket/core/util/Notifier.scala b/src/main/scala/gitbucket/core/util/Notifier.scala index c5efe0f..36ec89d 100644 --- a/src/main/scala/gitbucket/core/util/Notifier.scala +++ b/src/main/scala/gitbucket/core/util/Notifier.scala @@ -84,26 +84,7 @@ enableLineBreaks = false ))) { case (subject, msg) => recipients(issue) { to => - val email = new HtmlEmail - email.setHostName(smtp.host) - email.setSmtpPort(smtp.port.get) - smtp.user.foreach { user => - email.setAuthenticator(new DefaultAuthenticator(user, smtp.password.getOrElse(""))) - } - smtp.ssl.foreach { ssl => - email.setSSLOnConnect(ssl) - } - smtp.fromAddress - .map (_ -> smtp.fromName.getOrElse(context.loginAccount.get.userName)) - .orElse (Some("notifications@gitbucket.com" -> context.loginAccount.get.userName)) - .foreach { case (address, name) => - email.setFrom(address, name) - } - email.setCharset("UTF-8") - email.setSubject(subject) - email.setHtmlMsg(msg) - - email.addTo(to).send + send(to, subject, msg) } } } @@ -116,6 +97,30 @@ case t => logger.error("Notifications Failed.", t) } } + + def send(to: String, subject: String, msg: String)(implicit context: Context): Unit = { + val email = new HtmlEmail + email.setHostName(smtp.host) + email.setSmtpPort(smtp.port.get) + smtp.user.foreach { user => + email.setAuthenticator(new DefaultAuthenticator(user, smtp.password.getOrElse(""))) + } + smtp.ssl.foreach { ssl => + email.setSSLOnConnect(ssl) + } + smtp.fromAddress + .map (_ -> smtp.fromName.getOrElse(context.loginAccount.get.userName)) + .orElse (Some("notifications@gitbucket.com" -> context.loginAccount.get.userName)) + .foreach { case (address, name) => + email.setFrom(address, name) + } + email.setCharset("UTF-8") + email.setSubject(subject) + email.setHtmlMsg(msg) + + email.addTo(to).send + } + } class MockMailer extends Notifier { def toNotify(r: RepositoryService.RepositoryInfo, issue: Issue, content: String) diff --git a/src/main/twirl/gitbucket/core/admin/system.scala.html b/src/main/twirl/gitbucket/core/admin/system.scala.html index 5ae62cd..2bf6827 100644 --- a/src/main/twirl/gitbucket/core/admin/system.scala.html +++ b/src/main/twirl/gitbucket/core/admin/system.scala.html @@ -294,7 +294,7 @@
- +
@@ -309,9 +309,10 @@
-
- - +
+ Send test mail to: + +

@@ -328,6 +329,40 @@ }