prepare gradual transition between smtp configs
parent
c91c486424
commit
e7c4abb46f
|
@ -10,6 +10,7 @@ final class Dev(env: Env) extends LilaController(env) {
|
||||||
private lazy val settingsList = List[lila.memo.SettingStore[_]](
|
private lazy val settingsList = List[lila.memo.SettingStore[_]](
|
||||||
env.security.ugcArmedSetting,
|
env.security.ugcArmedSetting,
|
||||||
env.security.spamKeywordsSetting,
|
env.security.spamKeywordsSetting,
|
||||||
|
env.security.mailerSecondaryPercentageSetting,
|
||||||
env.irwin.irwinThresholdsSetting,
|
env.irwin.irwinThresholdsSetting,
|
||||||
env.explorer.indexFlowSetting,
|
env.explorer.indexFlowSetting,
|
||||||
env.report.scoreThresholdsSetting,
|
env.report.scoreThresholdsSetting,
|
||||||
|
|
|
@ -193,6 +193,7 @@ security {
|
||||||
user = "noreply@lichess.org"
|
user = "noreply@lichess.org"
|
||||||
password = "???"
|
password = "???"
|
||||||
}
|
}
|
||||||
|
secondary = ${security.mailer.primary}
|
||||||
sender = "lichess.org <noreply@lichess.org>"
|
sender = "lichess.org <noreply@lichess.org>"
|
||||||
}
|
}
|
||||||
email_confirm {
|
email_confirm {
|
||||||
|
|
|
@ -79,7 +79,16 @@ final class Env(
|
||||||
mk(ugcArmedSetting.get _)
|
mk(ugcArmedSetting.get _)
|
||||||
}
|
}
|
||||||
|
|
||||||
private lazy val mailer: Mailer = wire[Mailer]
|
lazy val mailerSecondaryPercentageSetting = settingStore[Int](
|
||||||
|
"mailerSecondaryPercentage",
|
||||||
|
default = 0,
|
||||||
|
text = "Percentage of mails to send using secondary SMTP configuration".some
|
||||||
|
)
|
||||||
|
|
||||||
|
private lazy val mailer = new Mailer(
|
||||||
|
config.mailer,
|
||||||
|
getSecondaryPercentage = () => mailerSecondaryPercentageSetting.get()
|
||||||
|
)
|
||||||
|
|
||||||
lazy val emailConfirm: EmailConfirm =
|
lazy val emailConfirm: EmailConfirm =
|
||||||
if (config.emailConfirm.enabled)
|
if (config.emailConfirm.enabled)
|
||||||
|
|
|
@ -9,12 +9,13 @@ import scala.concurrent.{ blocking, Future }
|
||||||
import scalatags.Text.all._
|
import scalatags.Text.all._
|
||||||
|
|
||||||
import lila.common.config.Secret
|
import lila.common.config.Secret
|
||||||
import lila.common.{ Chronometer, EmailAddress }
|
import lila.common.{ Chronometer, EmailAddress, ThreadLocalRandom }
|
||||||
import lila.common.String.html.{ escapeHtml, nl2brUnsafe }
|
import lila.common.String.html.{ escapeHtml, nl2brUnsafe }
|
||||||
import lila.i18n.I18nKeys.{ emails => trans }
|
import lila.i18n.I18nKeys.{ emails => trans }
|
||||||
|
|
||||||
final class Mailer(
|
final class Mailer(
|
||||||
config: Mailer.Config
|
config: Mailer.Config,
|
||||||
|
getSecondaryPercentage: () => Int
|
||||||
)(implicit
|
)(implicit
|
||||||
ec: scala.concurrent.ExecutionContext,
|
ec: scala.concurrent.ExecutionContext,
|
||||||
system: ActorSystem
|
system: ActorSystem
|
||||||
|
@ -23,7 +24,12 @@ final class Mailer(
|
||||||
private val workQueue =
|
private val workQueue =
|
||||||
new lila.hub.DuctSequencer(maxSize = 512, timeout = Mailer.timeout * 2, name = "mailer")
|
new lila.hub.DuctSequencer(maxSize = 512, timeout = Mailer.timeout * 2, name = "mailer")
|
||||||
|
|
||||||
private val client = new SMTPMailer(config.primary.toClientConfig)
|
private val primaryClient = new SMTPMailer(config.primary.toClientConfig)
|
||||||
|
private val secondaryClient = new SMTPMailer(config.secondary.toClientConfig)
|
||||||
|
|
||||||
|
private def randomClient(): SMTPMailer =
|
||||||
|
if (ThreadLocalRandom.nextInt(100) < getSecondaryPercentage()) secondaryClient
|
||||||
|
else primaryClient
|
||||||
|
|
||||||
def send(msg: Mailer.Message): Funit =
|
def send(msg: Mailer.Message): Funit =
|
||||||
if (msg.to.isNoReply) {
|
if (msg.to.isNoReply) {
|
||||||
|
@ -34,7 +40,7 @@ final class Mailer(
|
||||||
Future {
|
Future {
|
||||||
Chronometer.syncMon(_.email.send.time) {
|
Chronometer.syncMon(_.email.send.time) {
|
||||||
blocking {
|
blocking {
|
||||||
client
|
randomClient()
|
||||||
.send(
|
.send(
|
||||||
Email(
|
Email(
|
||||||
subject = msg.subject,
|
subject = msg.subject,
|
||||||
|
@ -78,6 +84,7 @@ object Mailer {
|
||||||
|
|
||||||
case class Config(
|
case class Config(
|
||||||
primary: Smtp,
|
primary: Smtp,
|
||||||
|
secondary: Smtp,
|
||||||
sender: String
|
sender: String
|
||||||
)
|
)
|
||||||
implicit val configLoader = AutoConfig.loader[Config]
|
implicit val configLoader = AutoConfig.loader[Config]
|
||||||
|
|
Loading…
Reference in New Issue