Heim  >  Artikel  >  Backend-Entwicklung  >  emergence/go-imap – imap.FetchRFC822: Ungültige Speicheradresse oder Null-Zeiger-Dereferenzierung

emergence/go-imap – imap.FetchRFC822: Ungültige Speicheradresse oder Null-Zeiger-Dereferenzierung

WBOY
WBOYnach vorne
2024-02-09 09:00:33648Durchsuche

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

php-Editor Xigua kann bei Verwendung der Emergenz/go-imap-Bibliothek auf eine häufige Fehlermeldung stoßen: „imap.FetchRFC822: ungültige Speicheradresse oder Nullzeiger-Dereferenzierung“. Diese Fehlermeldung wird normalerweise dadurch verursacht, dass der IMAP-Client nicht ordnungsgemäß initialisiert wurde oder keine korrekte Verbindung zum IMAP-Server hergestellt wurde. Die Lösung für dieses Problem ist einfach: Stellen Sie einfach sicher, dass Sie den IMAP-Client korrekt initialisieren und erfolgreich eine Verbindung zum IMAP-Server herstellen. In diesem Artikel wird detailliert vorgestellt, wie dieses Problem gelöst werden kann, und den Lesern dabei helfen, die Emergenz/go-imap-Bibliothek erfolgreich zum Durchführen von IMAP-Vorgängen zu verwenden.

Frageninhalt

Ich versuche, alle E-Mails vom Server abzurufen, indem ich den folgenden Quellcode verwende (diese Funktion wird im Hauptmodul aufgerufen):

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
}

Dies führt zu folgendem Fehler:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x5ee505]
goroutine 1 [running]:

Ich habe imap.fetchevelope() ausprobiert und es funktioniert, aber aus irgendeinem Grund funktioniert imap.fetchrfc822 nicht.

Mein Hauptziel ist es, alle E-Mail-Anhänge (.gz, .zip...) aller E-Mails zu exportieren. Deshalb benötige ich die gesamte E-Mail, nicht nur den Umschlag.

Lösung

Ich denke, das Problem liegt in dieser Zeile items := []imap.fetchitem{imap.fetchrfc822}.
Lassen Sie uns zunächst klären, was der Typ fetchitem ist. Dies stellt die verschiedenen Teile der E-Mail dar, die abgerufen werden können (Umschlag, Text, UID, Flags usw.).
Dann lasst uns über Scheiben von fetch方法。它需要传入 imap.fetchitem reden. Es ruft alle von diesem Slice angegebenen Teile aus der E-Mail ab.
Die Lösung Ihres Problems besteht also darin, diese Zeile durch items := []imap.fetchitem{imap.fetchrfc822, imap.fetchenvelope}.
zu ersetzen Ich habe Ihr Programm repariert und getestet, wie Sie dem folgenden Ausschnitt entnehmen können:

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)
    }
}

Gegen Ende habe ich for 来打印检索到的电子邮件的主题。在这里,您可以用自己的逻辑替换代码。 nil 指针取消引用 hinzugefügt und der Fehler ist verschwunden.
Wenn dies Ihr Problem löst, lassen Sie es mich bitte wissen!

Das obige ist der detaillierte Inhalt vonemergence/go-imap – imap.FetchRFC822: Ungültige Speicheradresse oder Null-Zeiger-Dereferenzierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Golang-Bytes und -StringsNächster Artikel:Golang-Bytes und -Strings