Ce n'est pas un gros problème si vous comprenez que j'étais accro à recevoir du courrier avec Java Mail depuis Exchange Online

introduction

J'ai décidé d'envoyer et de recevoir des e-mails depuis et vers Exchange Online en utilisant l'application Java (Kotlin), j'ai donc essayé d'envoyer des e-mails que je pourrais facilement trouver.

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 adore
    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("Destination")
      from = "Meru adore"
      subject = "Kenmei"
      text = "Vraiment"
    }
    mailSender.send(mailMessage)
  }
}

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

Comme je pouvais envoyer du courrier facilement comme celui-ci, j'ai pensé que même s'il s'agissait d'Exchange Online, il serait facile de le recevoir comme avec un serveur de messagerie normal. En fin de compte, c'est vrai, mais quand j'ai trébuché sur le chemin, j'ai été frappé de suspicion et j'ai fait des allers-retours.

Un petit nuage lié ...

Depuis que j'ai pu envoyer un e-mail, j'ai prétendu que je pouvais le recevoir naturellement, et quand est venu le temps de l'implémenter, j'ai pensé que!? Spring-context-support-5.1.8.RELEASE.jar avec JavaMailSender n'a pas JavaMailReciver. .. Pourquoi JavaMail lui-même peut-il recevoir? L'intégration Spring reçoit également du courrier, mais je n'avais pas envie de l'intégrer, j'ai donc décidé d'utiliser directement JavaMail. Cependant, je me suis demandé s'il y avait quelque chose de difficile à normaliser car il n'y a pas de réception de courrier dans Spring Framework qui englobe diverses implémentations et le rend facile à utiliser.

Et accro

La logique de réception dans JavaMail n'était pas trop vigilante.

val props = Properties()
//Créer une session
val session = Session.getInstance(props)
//Sélectionnez le protocole
val store = session.getStore("imaps")
//Connecter au serveur
store.connect("outlook.office365.com", 993, "Meru adore", "Passwa-do")
//Sélectionnez un dossier
val folder = store.getFolder("INBOX")
folder.open(Folder.READ_ONLY)
//courrier entrant
folder.messages.map {
  println(it.subject)
}
folder.close(false)
store.close()

Ensuite, javax.mail.AuthenticationFailedException: AUTHENTICATE a échoué lors de l'appel de la méthode store.connect. Si vous spécifiez session.debug = true et obtenez un journal détaillé

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 adore, password=<non-null>
DEBUG IMAPS: AUTHENTICATE PLAIN command trace suppressed
DEBUG IMAPS: AUTHENTICATE PLAIN command result: A1 NO AUTHENTICATE failed.

Quelque chose n'a pas réussi à s'authentifier? C'est le début de l'erreur. J'ai essayé le protocole pop3s et le numéro de port 995

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.

Une fois que toutes les authentifications ont échoué. Si vous recherchez des informations sur le net, vous devrez vous authentifier avant @ au lieu de votre adresse e-mail, ou vous ne connaîtrez pas le domaine, donc Exchange qui est proxy ou redirigé vers outlook.office365.com J'ai répété des essais et des erreurs pendant environ une demi-journée, par exemple si je devais me connecter directement au serveur.

Répondre

IMAP et POP3 ont été désactivés dans les paramètres de connexion de messagerie de l'utilisateur dans la console d'administration Exchange. Lorsque j'ai dû me connecter directement au serveur Exchange ci-dessus, j'ai demandé à un administrateur d'accéder à la console de gestion. Après tout, TCP / IP n'est pas passé directement, mais j'ai vu le document à ce moment. -et-imap4 / pop3-et-imap4) dit: "Par défaut, POP3 et IMAP4 sont activés pour tous les utilisateurs d'Exchange Online." Mais assurez-vous qu'ils peuvent être désactivés par utilisateur. Quand je l'ai vu, il était correctement désactivé. Je l'ai activé là-bas, et après un certain temps (5 à 10 minutes), cela a fonctionné sans problème!

image.png

Recommended Posts

Ce n'est pas un gros problème si vous comprenez que j'étais accro à recevoir du courrier avec Java Mail depuis Exchange Online
Une histoire que j'ai eu du mal à défier le pro de la concurrence avec Java
Android: Comment gérer "Impossible de déterminer la version Java à partir de '10 .0.1 '"
Une histoire à laquelle j'étais accro à deux reprises avec le paramètre de démarrage automatique de Tomcat 8 sur CentOS 8
J'ai essayé d'apprendre Java avec une série que les débutants peuvent comprendre clairement
Une histoire qui a souffert d'un espace qui ne disparaît pas même s'il est taillé avec Java La cause est BOM
J'ai créé un programme qui recherche la classe cible à partir du processus surchargé avec Java
J'étais accro à ne pas pouvoir me connecter à AWS-S3 à partir du conteneur Docker
SpringSecurity J'étais accro à essayer de me connecter avec un mot de passe haché (résolu)
Même en Java, je veux sortir vrai avec un == 1 && a == 2 && a == 3 (magie grise qui n'est pas tant que magie noire)
L'histoire selon laquelle traiter d'anciennes dates est agaçante
J'étais accro à faire onActivityResult () avec DialogFragment
J'ai essayé de casser le bloc avec java (1)
Ce à quoi j'étais accro lors du développement d'une application Spring Boot avec VS Code
MockMVC renvoie 200 même si je fais une demande vers un chemin qui n'existe pas
Un site facile à comprendre lorsque j'ai commencé à apprendre Spring Boot
Une histoire à laquelle j'étais accro lors de l'obtention d'une clé qui a été automatiquement essayée sur MyBatis
Java: Une histoire qui m'a mis mal à l'aise quand on m'a appris à comparer des chaînes avec des égaux sans raison.