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.
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.
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.
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!
Recommended Posts