Как повторно использовать соединение с JavaMail, чтобы избежать AuthenticationFailedException: слишком много попыток входа в систему? - PullRequest
0 голосов
/ 07 октября 2019

В моей текущей реализации метод sendEmail вызывается много раз в цикле для отправки писем на каждый отдельный адрес электронной почты. В результате около 95 электронных писем отправляются успешно, но затем приложение завершается с ошибкой:

javax.mail.AuthenticationFailedException: слишком много попыток входа в систему, повторите попытку позже

Как мне изменить метод sendEmail, чтобы исправить это?

val EMAIL_FROM = "metricsEmail@gmail.com"

def sendEmail(text: String, recipient: String): Unit = {
    val properties = createProperties(HOST, PORT)
    val session: Session = Session.getInstance(properties)
    val message = createEmailMessage(EMAIL_FROM, properties, session, recipient, text)

    val transport: Transport = session.getTransport("smtp")
    transport.connect(EMAIL_FROM, PASSWORD)
    transport.sendMessage(message, message.getAllRecipients)
  }

UPD: После рефакторинга кода, как это предлагается в комментариях, я получаю следующее исключение:

com.sun.mail.smtp.SMTPSendFailedException: 421 4.7.0 Повторите попытку позже, закрыв соединение. (ПОЧТА)

  val properties: Properties = System.getProperties
  properties.setProperty("mail.smtp.host", HOST)
  properties.setProperty("mail.smtp.port", PORT)
  properties.setProperty("mail.smtp.starttls.enable", "true")
  properties.setProperty("mail.smtp.auth", "true")

  val session: Session = Session.getDefaultInstance(properties)
  val transport: Transport = session.getTransport("smtp")
  transport.connect(DEFAULT_EMAIL_FROM, SENDER_PASSWORD)

    def sendEmail(text: String, recipient: String): Unit = {
        val message = createEmailMessage(EMAIL_FROM, properties, session, recipient, text)
        transport.sendMessage(message, message.getAllRecipients)
      }

1 Ответ

2 голосов
/ 07 октября 2019

Предположительно, transport.connect(EMAIL_FROM, PASSWORD) нужно выполнить только один раз, а не каждый раз, когда вы отправляете электронное письмо. Для этого вам следует выполнить рефакторинг, чтобы удалить создание свойств, получение сеанса и транспорта, а также соединение из транспорта вне метода sendEmail.

...