1
votes

Impossible de se connecter au serveur smtp: erreur [Aucun fournisseur pour smtp] scala spark

code:

[info] Here are other dependency conflicts that were resolved:
[info]  * javax.activation:activation:1.1.1 is selected over 1.1
[info]      +- org.apache.commons:commons-email:1.4               (depends on 1.1.1)
[info]      +- com.sun.mail:javax.mail:1.5.2                      (depends on 1.1)
[success] Total time: 4 s, completed Jun 18, 2020 1:10:36 AM

J'obtiens l'erreur suivante:

libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "2.3.0",
"org.apache.spark" %% "spark-sql" % "2.3.0",
"com.typesafe" % "config" % "1.2.0",
"mysql" % "mysql-connector-java" % "5.1.12",
"org.apache.commons" % "commons-dbcp2" % "2.0.1",
"org.apache.commons" % "commons-email" % "1.5",
)
dependencyOverrides ++= Seq(
        "javax.activation" % "activation" % "1.1.1",
        "javax.mail" % "javax.mail-api" % "1.6.2"
)

assemblyMergeStrategy in assembly := {
 case PathList("META-INF", xs @ _*) => MergeStrategy.discard
 case x => MergeStrategy.last
}

J'ai essayé de vérifier en utilisant telnet si le serveur smtp que j'ai j'utilise est actif. Je l'ai trouvé actif:

spark-submit --master yarn-cluster 
             --class ImpressionThrottlingPattern 
             --name Test_MukundDBRead 
             /home/ml.user/mukund/prod/ImpressionThrottlingPatternGenerator/target/scala-2.11/TestMukund-assembly-1.0.jar

Voici mon fichier sbt:

name := "TestMukund"
version := "1.0"
scalaVersion := "2.11.8"
val sparkVersion = "2.3.0"
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "2.3.0",
"org.apache.spark" %% "spark-sql" % "2.3.0",
"com.databricks" %% "spark-csv" % "1.5.0",
"com.typesafe" % "config" % "1.2.0",
"mysql" % "mysql-connector-java" % "5.1.12",
"org.apache.commons" % "commons-dbcp2" % "2.0.1",
"org.apache.commons" % "commons-email" % "1.4"
)

assemblyMergeStrategy in assembly := {
 case PathList("META-INF", xs @ _*) => MergeStrategy.discard
 case x => MergeStrategy.first
}

Je ne pense pas que le problème est avec le nom d'utilisateur et le mot de passe car l'erreur indique que le fournisseur smtp est lui-même introuvable. Je suis très nouveau dans le domaine de la scala et du débordement de pile. J'espère que les détails ci-dessus sont suffisants pour trouver la cause profonde du problème.

MODIFIER L'application est exécutée via la commande:

[root@qa-mukund mukund.sudharsan]# telnet smtp.office365.com 587
Trying xx.xx.xx.xxx...
Connected to smtp.office365.com.
Escape character is '^]'.
220 BY5PR04CA0025.outlook.office365.com Microsoft ESMTP MAIL Service ready at Wed, 17 Jun 2020 13:48:54 +0000

J'ai essayé de remplacer la version 1.6.2 de javax.mail-api verision en mettant à jour le fichier sbt comme suit: p >

0/06/17 05:22:32 ERROR ApplicationMaster: User class threw exception: org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.office365.com:587
org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.office365.com:587
        at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1421)
        at org.apache.commons.mail.Email.send(Email.java:1448)
        at mail$send$.a(mail.scala:56)
        at ImpressionThrottlingPattern$.main(pattern.scala:292)
        at ImpressionThrottlingPattern.main(pattern.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$4.run(ApplicationMaster.scala:721)
Caused by: javax.mail.NoSuchProviderException: No provider for smtp
        at javax.mail.Session.getProvider(Session.java:479)
        at javax.mail.Session.getTransport(Session.java:681)
        at javax.mail.Session.getTransport(Session.java:662)
        at javax.mail.Session.getTransport(Session.java:719)
        at javax.mail.Transport.send0(Transport.java:248)
        at javax.mail.Transport.send(Transport.java:124)
        at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1411)
        ... 9 more

Mais cela n'a pas fonctionné aussi bien.

J'ai essayé d'exécuter la commande sbt expulsée et j'ai trouvé la sortie contenant les lignes suivantes (je ne sais pas si cela aiderait) :

object mail {

 // implicit def stringToSeq(single: String): Seq[String] = Seq(single)
  implicit def liftToOption[T](t: T): Option[T] = Some(t)

  sealed abstract class MailType
  case object Plain extends MailType
  case object Rich extends MailType
  case object MultiPart extends MailType

  case class Mail(
    from: (String, String), // (email -> name)
    to: Seq[String],
    cc: Seq[String] = Seq.empty,
    bcc: Seq[String] = Seq.empty,
    subject: String,
    message: String,
    richMessage: Option[String] = None,
    attachment: Option[(java.io.File)] = None
  )

  object send {
    def a(mail: Mail) {
      import org.apache.commons.mail._

      val format =
        if (mail.attachment.isDefined) MultiPart
        else if (mail.richMessage.isDefined) Rich
        else Plain

      val commonsMail: Email = format match {
        case Plain => new SimpleEmail().setMsg(mail.message)
        case Rich => new HtmlEmail().setHtmlMsg(mail.richMessage.get).setTextMsg(mail.message)
        case MultiPart => {
          val attachment = new EmailAttachment()
          attachment.setPath(mail.attachment.get.getAbsolutePath)
          attachment.setDisposition(EmailAttachment.ATTACHMENT)
          attachment.setName(mail.attachment.get.getName)
          new MultiPartEmail().attach(attachment).setMsg(mail.message)
        }
      }

      // TODO Set authentication from your configuration, sys properties or w/e
      commonsMail.setHostName("smtp.office365.com")
      commonsMail.setSmtpPort(587)
      commonsMail.setAuthentication("someUserName", "TestPassword")
      commonsMail.setStartTLSEnabled(true)
      // Can't add these via fluent API because it produces exceptions
      mail.to foreach (commonsMail.addTo(_))
      mail.cc foreach (commonsMail.addCc(_))
      mail.bcc foreach (commonsMail.addBcc(_))

      commonsMail.
        setFrom(mail.from._1, mail.from._2).
        setSubject(mail.subject).
        send()
    }
  }
}


4 commentaires

Bienvenue à SO! Pourriez-vous également publier la commande que vous utilisez pour exécuter votre application?


Voici la commande: spark-submit --master yarn-cluster --class ImpressionThrottlingPattern --name Test_MukundDBRead /home/ml.user/mukund/prod/ImpressionThrottlingPatternGenerat‌ ou / target / scala-2.11‌ / TestMukund-assembly‌ - 1.0.jar


J'utilise le même code son fonctionnement, pouvez-vous mettre à jour votre dernier fichier build.sbt ??


Salut Srinivas. Merci pour ça. J'ai joint mes informations de fichier sbt dans la section des questions. Pourriez-vous s'il vous plaît partager votre configuration


3 Réponses :


1
votes

3 commentaires

Merci pour votre suggestion. J'ai inclus les dernières versions du java mail et du jar d'activation dans mon fichier sbt: "javax.mail"% "javax.mail-api"% "1.6.2", "javax.activation"% "activation"% "1.1. 1 "Mais toujours la même erreur. Pourriez-vous s'il vous plaît aider à comprendre comment résoudre plusieurs fichiers JAR dans un problème d'exécution?


pouvez-vous vérifier l'arbre de dépendance trivial ajouté la commande sbt pour vérifier sbt @MukundSudharsan


J'ai essayé le sbt inspect tree clean mais je n'ai trouvé aucune information sur l'activation ou le jar javamain. Cependant, j'ai essayé d'exécuter sbt expulsé où j'ai pu trouver la ligne suivante: `` `` [info] * javax.activation: activation: 1.1.1 est sélectionné sur {1.1, 1.1, 1.1, 1.1} [info] + - net.java.dev.jets3t: jets3t: 0.9.4 (dépend de 1.1.1) [info] + - javax.xml.bind: jaxb-api: 2.2.2 (dépend de 1.1) [info] + - com. sun.mail: javax.mail: 1.5.6 (dépend de 1.1) `` En utilisant dependencyOverrides, je n'ai pas pu remplacer la version 1.5.6



0
votes

Essayez d'utiliser la bibliothèque ci-dessous dans votre build.sbt pour résoudre ce problème.

"org.apache.commons" % "commons-email" % "1.5"


1 commentaires

Merci pour la suggestion, mais n'a pas fonctionné en changeant la version de 1.4 à 1.5



0
votes

Après beaucoup d'efforts, j'ai enfin pu résoudre ce problème,

  1. J'ai dû télécharger le mail et le jar d'activation et passer explicitement via la commande spark-submit. Comme
val SparkVersion = "2.3.2"
scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
"org.apache.spark" % "spark-core_2.11" % SparkVersion,
"org.apache.spark" % "spark-sql_2.11" % SparkVersion,
"com.typesafe" % "config" % "1.2.0",
"mysql" % "mysql-connector-java" % "5.1.12",
"org.apache.commons" % "commons-dbcp2" % "2.0.1",
"org.apache.commons" % "commons-email" % "1.4",
)

  1. Modification des configurations dans le fichier sbt (notez la suppression de %% de la version précédente) comme suit:
spark-submit --jars <path_to_activation_jar>,<path_to_mail_jar> <other parameters>

Cependant, je me demande toujours comment le mail et le jar d'activation peuvent être automatiquement téléchargés via l'assembly sbt et ne pas passer explicitement.


0 commentaires