Heim >Backend-Entwicklung >Golang >emergence/go-imap – imap.FetchRFC822: Ungültige Speicheradresse oder Null-Zeiger-Dereferenzierung
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.
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.
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!