php小編西瓜在使用emersion/go-imap函式庫的時候可能會遇到一個常見的錯誤提示:「imap.FetchRFC822: invalid memory address or nil pointer dereference」。這個錯誤提示通常是由於沒有正確初始化imap客戶端或沒有正確連接到IMAP伺服器所導致的。解決這個問題的方法很簡單,只需要確保正確初始化imap客戶端並且成功連接到IMAP伺服器即可。本文將詳細介紹如何解決這個問題,幫助讀者順利使用emersion/go-imap函式庫進行imap操作。
我正在嘗試使用以下原始程式碼從伺服器獲取所有電子郵件(此函數在主模組中呼叫):
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 }
這會導致以下錯誤:
panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x5ee505] goroutine 1 [running]:
我已經嘗試過 imap.fetchevelope() 它可以工作,但由於某種原因 imap.fetchrfc822 不起作用。
我的主要目標是匯出所有電子郵件中的所有電子郵件附件(.gz、.zip...),這就是為什麼我需要整個電子郵件,而不僅僅是信封。
我認為問題出在這一行 items := []imap.fetchitem{imap.fetchrfc822}
.
#
首先,我們先澄清一下 fetchitem
類型是什麼。這表示可以取得的電子郵件的不同部分(信封、正文、uid、標誌等)。
然後,我們來談談fetch
方法。它需要傳入 imap.fetchitem
的切片。它從電子郵件中檢索該切片指定的所有部分。
因此,解決您的問題的方法是將這一行替換為 items := []imap.fetchitem{imap.fetchrfc822, imap.fetchenvelope}
.
我修復並測試了您的程序,您可以從下面的程式碼片段中看到:
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) } }
接近尾聲時,我加入了 for
來列印檢索到的電子郵件的主題。在這裡,您可以用自己的邏輯替換程式碼。 nil 指標取消引用
錯誤消失。
如果這可以解決您的問題,請告訴我!
以上是emersion/go-imap - imap.FetchRFC822:無效的記憶體位址或 nil 指標取消引用的詳細內容。更多資訊請關注PHP中文網其他相關文章!