prepare gradual transition between smtp configs

pull/8524/head
Niklas Fiekas 2021-03-31 22:35:29 +02:00
parent c91c486424
commit e7c4abb46f
4 changed files with 23 additions and 5 deletions

View File

@ -10,6 +10,7 @@ final class Dev(env: Env) extends LilaController(env) {
private lazy val settingsList = List[lila.memo.SettingStore[_]](
env.security.ugcArmedSetting,
env.security.spamKeywordsSetting,
env.security.mailerSecondaryPercentageSetting,
env.irwin.irwinThresholdsSetting,
env.explorer.indexFlowSetting,
env.report.scoreThresholdsSetting,

View File

@ -193,6 +193,7 @@ security {
user = "noreply@lichess.org"
password = "???"
}
secondary = ${security.mailer.primary}
sender = "lichess.org <noreply@lichess.org>"
}
email_confirm {

View File

@ -79,7 +79,16 @@ final class Env(
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 =
if (config.emailConfirm.enabled)

View File

@ -9,12 +9,13 @@ import scala.concurrent.{ blocking, Future }
import scalatags.Text.all._
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.i18n.I18nKeys.{ emails => trans }
final class Mailer(
config: Mailer.Config
config: Mailer.Config,
getSecondaryPercentage: () => Int
)(implicit
ec: scala.concurrent.ExecutionContext,
system: ActorSystem
@ -23,7 +24,12 @@ final class Mailer(
private val workQueue =
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 =
if (msg.to.isNoReply) {
@ -34,7 +40,7 @@ final class Mailer(
Future {
Chronometer.syncMon(_.email.send.time) {
blocking {
client
randomClient()
.send(
Email(
subject = msg.subject,
@ -78,6 +84,7 @@ object Mailer {
case class Config(
primary: Smtp,
secondary: Smtp,
sender: String
)
implicit val configLoader = AutoConfig.loader[Config]