Es ist keine große Sache, wenn Sie verstehen, dass ich süchtig danach war, E-Mails mit Java Mail von Exchange Online zu empfangen

Einführung

Ich habe beschlossen, E-Mails mit der Java-App (Kotlin) an und von Exchange Online zu senden und zu empfangen. Daher habe ich versucht, E-Mails zu senden, die ich leicht herausfinden konnte.

kotlin:build.gradle.kts


import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
  id("org.springframework.boot") version "2.1.6.RELEASE"
  kotlin("jvm") version "1.3.41"
  kotlin("plugin.spring") version "1.3.41"
}
repositories {
  mavenCentral()
}
dependencies {
  implementation(platform("org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE"))
  implementation("org.springframework.boot:spring-boot-starter-mail")
  implementation(kotlin("stdlib-jdk8"))
}
val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions {
  jvmTarget = "1.8"
}
val compileTestKotlin: KotlinCompile by tasks
compileTestKotlin.kotlinOptions {
  jvmTarget = "1.8"
}

application.yml


spring:
  mail:
    host: smtp.office365.com
    port: 587
    username:Meru liebt
    password:Passwa-do
    properties:
      mail:
        smtp:
          starttls:
            enable: true

Application.kt


import org.springframework.boot.CommandLineRunner
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.mail.SimpleMailMessage
import org.springframework.mail.javamail.JavaMailSender

@SpringBootApplication
class Application(val mailSender: JavaMailSender): CommandLineRunner {
  override fun run(vararg args: String?) {
    val mailMessage = SimpleMailMessage().apply {
      setTo("Ziel")
      from = "Meru liebt"
      subject = "Kenmei"
      text = "Ja wirklich"
    }
    mailSender.send(mailMessage)
  }
}

fun main( args: Array<String>) {
  runApplication<Application>(*args)
}

Da ich E-Mails auf diese Weise problemlos senden konnte, dachte ich, dass es trotz Exchange Online einfach sein würde, sie wie bei einem normalen E-Mail-Server zu empfangen. Am Ende ist das richtig, aber als ich auf dem Weg stolperte, wurde ich von Misstrauen getroffen und ging hin und her.

Eine kleine Wolke gebunden ...

Da ich eine E-Mail senden konnte, tat ich so, als könnte ich sie selbstverständlich empfangen, und als es Zeit für die Implementierung wurde, dachte ich das !? In spring-context-support-5.1.8.RELEASE.jar mit JavaMailSender gibt es keinen JavaMailReciver. .. Warum kann JavaMail selbst empfangen? Die Spring-Integration empfängt auch E-Mails, aber ich hatte keine Lust, sie zu integrieren. Deshalb habe ich mich entschieden, JavaMail direkt zu verwenden. Ich habe mich jedoch gefragt, ob es schwierig ist, etwas zu standardisieren, da es im Spring Framework keinen E-Mail-Empfang gibt, der verschiedene Implementierungen umschließt und die Verwendung vereinfacht.

Und süchtig

Die Empfangslogik in JavaMail war nicht zu wachsam.

val props = Properties()
//Sitzung generieren
val session = Session.getInstance(props)
//Protokoll auswählen
val store = session.getStore("imaps")
//Verbinden zum Server
store.connect("outlook.office365.com", 993, "Meru liebt", "Passwa-do")
//Wählen Sie einen Ordner
val folder = store.getFolder("INBOX")
folder.open(Folder.READ_ONLY)
//eingehende Post
folder.messages.map {
  println(it.subject)
}
folder.close(false)
store.close()

Dann tritt beim Aufruf der store.connect-Methode javax.mail.AuthenticationFailedException: AUTHENTICATE failed auf. Wenn Sie session.debug = true angeben und ein detailliertes Protokoll erhalten

DEBUG: setDebug: JavaMail version 1.6.2
DEBUG: getProvider() returning javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle]
DEBUG IMAPS: mail.imap.fetchsize: 16384
DEBUG IMAPS: mail.imap.ignorebodystructuresize: false
DEBUG IMAPS: mail.imap.statuscachetimeout: 1000
DEBUG IMAPS: mail.imap.appendbuffersize: -1
DEBUG IMAPS: mail.imap.minidletime: 10
DEBUG IMAPS: closeFoldersOnStoreFailure
DEBUG IMAPS: trying to connect to host "outlook.office365.com", port 993, isSSL true
* OK The Microsoft Exchange IMAP4 service is ready. 
A0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS ID UNSELECT CHILDREN IDLE NAMESPACE LITERAL+
A0 OK CAPABILITY completed.
DEBUG IMAPS: AUTH: PLAIN
DEBUG IMAPS: AUTH: XOAUTH2
DEBUG IMAPS: protocolConnect login, host=outlook.office365.com, user=Meru liebt, password=<non-null>
DEBUG IMAPS: AUTHENTICATE PLAIN command trace suppressed
DEBUG IMAPS: AUTHENTICATE PLAIN command result: A1 NO AUTHENTICATE failed.

Etwas konnte sich nicht authentifizieren? Dies ist der Beginn des Streuners. Ich habe das pop3s-Protokoll und die 995-Portnummer ausprobiert

DEBUG: setDebug: JavaMail version 1.6.2
DEBUG: getProvider() returning javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle]
DEBUG POP3: mail.pop3s.rsetbeforequit: false
DEBUG POP3: mail.pop3s.disabletop: false
DEBUG POP3: mail.pop3s.forgettopheaders: false
DEBUG POP3: mail.pop3s.cachewriteto: false
DEBUG POP3: mail.pop3s.filecache.enable: false
DEBUG POP3: mail.pop3s.keepmessagecontent: false
DEBUG POP3: mail.pop3s.starttls.enable: false
DEBUG POP3: mail.pop3s.starttls.required: false
DEBUG POP3: mail.pop3s.finalizecleanclose: false
DEBUG POP3: mail.pop3s.apop.enable: false
DEBUG POP3: mail.pop3s.disablecapa: false
DEBUG POP3: connecting to host "outlook.office365.com", port 995, isSSL true
+OK The Microsoft Exchange POP3 service is ready. 
CAPA
+OK
TOP
UIDL
SASL PLAIN
USER
.
DEBUG POP3: authentication command trace suppressed
DEBUG POP3: authentication command failed
QUIT
+OK Microsoft Exchange Server POP3 server signing off.

Nachdem die Authentifizierung fehlgeschlagen ist. Wenn Sie im Internet nach Informationen suchen, müssen Sie sich vor @ anstelle Ihrer E-Mail-Adresse authentifizieren, oder Sie kennen die Domain nicht Ich wiederholte Versuch und Irrtum etwa einen halben Tag lang, als müsste ich mich direkt mit dem Server verbinden.

Antworten

IMAP und POP3 wurden in den E-Mail-Verbindungseinstellungen des Benutzers in der Exchange-Administratorkonsole deaktiviert. Als ich mich direkt mit dem oben genannten Exchange-Server verbinden musste, bat ich einen Administrator, auf die Verwaltungskonsole zuzugreifen. Immerhin wurde TCP / IP nicht direkt übergeben, aber ich habe zu diesem Zeitpunkt das Dokument gesehen. -and-imap4 / pop3-and-imap4) sagt: "Standardmäßig sind POP3 und IMAP4 für alle Exchange Online-Benutzer aktiviert." Stellen Sie jedoch sicher, dass sie für jeden Benutzer deaktiviert werden können. Als ich es sah, war es richtig deaktiviert. Ich habe es dort aktiviert und nach einer Weile (5-10 Minuten) hat es reibungslos funktioniert!

image.png

Recommended Posts

Es ist keine große Sache, wenn Sie verstehen, dass ich süchtig danach war, E-Mails mit Java Mail von Exchange Online zu empfangen
Eine Geschichte, die ich mit Java nur schwer herausfordern konnte
Android: Umgang mit "Java-Version von '10 .0.1 'konnte nicht ermittelt werden"
Eine Geschichte, der ich mit der automatischen Starteinstellung von Tomcat 8 unter CentOS 8 zweimal verfallen war
Ich habe versucht, Java mit einer Reihe zu lernen, die Anfänger klar verstehen können
Eine Geschichte, die unter einem Raum litt, der nicht verschwindet, selbst wenn er mit Java beschnitten ist
Ich habe ein Programm erstellt, das aus dem mit Java überladenen Prozess nach der Zielklasse sucht
Ich war süchtig danach, vom Docker-Container aus keine Verbindung zu AWS-S3 herstellen zu können
SpringSecurity Ich war süchtig danach, mich mit einem Hash-Passwort anzumelden (gelöst)
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (graue Magie, die weniger schwarze Magie ist)
Die Geschichte, dass der Umgang mit alten Daten ärgerlich ist
Ich war süchtig danach, onActivityResult () mit DialogFragment zu machen
Ich habe versucht, den Block mit Java zu brechen (1)
Wovon ich süchtig war, als ich eine Spring Boot-Anwendung mit VS Code entwickelte
MockMVC gibt 200 zurück, auch wenn ich eine Anfrage an einen Pfad stelle, der nicht existiert
Eine Seite, die leicht zu verstehen war, als ich anfing, Spring Boot zu lernen
Eine Geschichte, nach der ich süchtig war, als ich einen Schlüssel bekam, der automatisch auf MyBatis ausprobiert wurde
Java: Eine Geschichte, in der ich mich unwohl fühlte, als mir beigebracht wurde, Strings ohne Grund mit Gleichen zu vergleichen.