首頁 > 後端開發 > Golang > 主體

emersion/go-imap - imap.FetchRFC822:無效的記憶體位址或 nil 指標取消引用

WBOY
發布: 2024-02-09 09:00:33
轉載
688 人瀏覽過

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

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中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!