Maison  >  Article  >  développement back-end  >  émergence/go-imap - imap.FetchRFC822 : adresse mémoire invalide ou déréférencement de pointeur nul

émergence/go-imap - imap.FetchRFC822 : adresse mémoire invalide ou déréférencement de pointeur nul

WBOY
WBOYavant
2024-02-09 09:00:33718parcourir

emersion/go-imap - imap.FetchRFC822:无效的内存地址或 nil 指针取消引用

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.

Contenu de la question

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.

Solution

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Article précédent:Octets et chaînes GolangArticle suivant:Octets et chaînes Golang