Maison > Article > développement back-end > émergence/go-imap - imap.FetchRFC822 : adresse mémoire invalide ou déréférencement de pointeur nul
L'éditeur php Xigua peut rencontrer un message d'erreur courant lors de l'utilisation de la bibliothèque émergence/go-imap : "imap.FetchRFC822 : adresse mémoire invalide ou déréférencement de pointeur nul". Ce message d'erreur est généralement dû à une initialisation incorrecte du client imap ou à une connexion incorrecte au serveur IMAP. La solution à ce problème est simple, assurez-vous simplement d'initialiser correctement le client imap et de vous connecter avec succès au serveur IMAP. Cet article présentera en détail comment résoudre ce problème et aidera les lecteurs à utiliser avec succès la bibliothèque émergence/go-imap pour effectuer des opérations imap.
J'essaie de récupérer tous les e-mails du serveur en utilisant le code source suivant (cette fonction est appelée dans le module principal) :
package internal import ( "fmt" "io" "io/ioutil" "log" "github.com/emersion/go-imap" "github.com/emersion/go-imap/client" "github.com/emersion/go-message" ) func fetchemail(server string, username string, password string) error { //connect to server log.println("connecting to server...") c, err := client.dialtls(server, nil) log.println("connected to " + server) defer c.logout() //check if connection successful if err != nil { log.println("in connection error") return err } //err = nil //login log.println("logging in...") err = c.login(username, password) log.println("logged in as " + username) //check if login successful if err != nil { log.println("in login error") return err } //select inbox log.println("selecting inbox...") mbox, err := c.select("inbox", false) log.println("selected inbox") //check if select successful if err != nil { return err } //fetch all messages log.println("fetching all messages...") seqset := new(imap.seqset) seqset.addrange(1, mbox.messages) items := []imap.fetchitem{imap.fetchrfc822} messages := make(chan *imap.message, 10) done := make(chan error, 1) go func() { done <- c.fetch(seqset, items, messages) }() //check if fetch successful if err := <-done; err != nil { log.println("in fetch error") return err } log.println("run successful - terminating...") return nil }
Cela entraîne l'erreur suivante :
panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x5ee505] goroutine 1 [running]:
J'ai essayé imap.fetchevelope() et cela fonctionne, mais pour une raison quelconque, imap.fetchrfc822 ne fonctionne pas.
Mon objectif principal est d'exporter toutes les pièces jointes (.gz, .zip...) de tous les emails, c'est pourquoi j'ai besoin de l'intégralité de l'e-mail, pas seulement de l'enveloppe.
Je pense que le problème est dans cette ligne items := []imap.fetchitem{imap.fetchrfc822}
.
Tout d’abord, clarifions quel est le type fetchitem
. Celui-ci représente les différentes parties de l'email pouvant être obtenues (enveloppe, corps, uid, drapeaux, etc.).
Ensuite, parlons des tranches de fetch
方法。它需要传入 imap.fetchitem
. Il récupère toutes les parties spécifiées par cette tranche à partir de l'e-mail.
La solution à votre problème est donc de remplacer cette ligne par items := []imap.fetchitem{imap.fetchrfc822, imap.fetchenvelope}
.
J'ai corrigé et testé votre programme comme vous pouvez le voir dans l'extrait ci-dessous :
package main import ( "fmt" "log" "github.com/emersion/go-imap" "github.com/emersion/go-imap/client" ) func FetchEMail(server string, username string, password string) error { // Connect to Server log.Println("Connecting to server...") c, err := client.Dial(server) log.Println("Connected to " + server) defer c.Logout() // check if connection successful if err != nil { log.Println("In connection Error") return err } // Login log.Println("Logging in...") err = c.Login(username, password) log.Println("Logged in as " + username) // check if login successful if err != nil { log.Println("In login Error") return err } // Select INBOX log.Println("Selecting INBOX...") mbox, err := c.Select("INBOX", false) log.Println("Selected INBOX") // check if select successful if err != nil { return err } // Fetch all messages log.Println("Fetching all messages...") seqset := new(imap.SeqSet) seqset.AddRange(1, mbox.Messages) items := []imap.FetchItem{imap.FetchRFC822, imap.FetchEnvelope} messages := make(chan *imap.Message, 10) done := make(chan error, 1) go func() { done <- c.Fetch(seqset, items, messages) }() for msg := range messages { fmt.Printf("suject: %v\n", msg.Envelope.Subject) } // check if fetch successful if err := <-done; err != nil { log.Println("In fetch Error") return err } log.Println("Run Successful - Terminating...") return nil } func main() { err := FetchEMail("xxxxxxx", "xxxxx", "xxxxx") if err != nil { panic(err) } }
Vers la fin, j'ai ajouté for
来打印检索到的电子邮件的主题。在这里,您可以用自己的逻辑替换代码。 nil 指针取消引用
et l'erreur a disparu.
Si cela résout votre problème, faites-le-moi savoir !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!