es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo leer el cuerpo del mensaje de un correo electrónico utilizando *imap.Message (emersion/go-imap)

Después de encontrar el correo electrónico correcto entre algunos de los más recientes, intento leer el cuerpo del mensaje pero no se imprime nada. He probado todos los ejemplos que pude encontrar en línea y ninguno realmente muestra cómo leer el cuerpo del mensaje usando solo el objeto *imap.Message.

La mayoría del código fue tomado del ejemplo de emersion en GitHub pero he modificado algunas cosas ligeramente para adaptarlo a mi caso de uso.

func getEmail() {
    log.Println("Conectando al servidor...")

    // Conectar al servidor
    c, err := client.DialTLS("imap.gmail.com:993", nil)
    if err != nil {
        log.Fatal(err)
    }
    log.Println("Conectado")

    // No olvidar hacer logout
    defer c.Logout()

    // Login
    if err := c.Login(ImapUser, ImapPass); err != nil {
        log.Fatal(err)
    }
    log.Println("Conectado")

    // Listar buzones de correo
    mailboxes := make(chan *imap.MailboxInfo, 10)
    done := make(chan error, 1)
    go func() {
        done <- c.List("", "*", mailboxes)
    }()

    for m := range mailboxes {
        _ = m
    }

    if err := <-done; err != nil {
        log.Fatal(err)
    }

    // Seleccionar INBOX
    mbox, err := c.Select("INBOX", false)
    if err != nil {
        log.Fatal(err)
    }
    // Obtener los últimos 4 mensajes
    from := uint32(1)

    to := mbox.Messages

    if mbox.Messages > 3 {
        // Estamos utilizando enteros sin signo aquí, solo restar si el resultado es > 0
        from = mbox.Messages - 3
    }
    seqset := new(imap.SeqSet)
    seqset.AddRange(from, to)

    messages := make(chan *imap.Message, 10)
    done = make(chan error, 1)

    go func() {
        done <- c.Fetch(seqset, []imap.FetchItem{imap.FetchEnvelope}, messages)
    }()

    for msg := range messages {
        if strings.Contains(fmt.Sprint(msg.Envelope.To[0]), strings.ToLower(Credentials.email)) {
            log.Println("> Correo electrónico encontrado")

            log.Println(msg.Body)
        }
    }

    if err := <-done; err != nil {
        log.Fatal(err)
    }
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema es que el código solamente obtiene el sobre del correo electrónico, no el cuerpo. Para obtener el cuerpo del mensaje, debes incluir el campo Body en el arreglo imap.FetchItem, de esta manera:

    done <- c.Fetch(seqset, []imap.FetchItem{imap.FetchEnvelope, imap.FetchBody}, messages)
    

    Luego puedes acceder al cuerpo utilizando el campo Body del objeto imap.Message, de esta manera:

    for msg := range messages {
        if strings.Contains(fmt.Sprint(msg.Envelope.To[0]), strings.ToLower(Credentials.email)){
            log.Println("> Got Email")
    
            body := msg.GetBody(&imap.BodySectionName{})
            if body == nil {
                log.Fatal("El servidor no ha devuelto el cuerpo del mensaje")
            }
            defer body.Close()
    
            bodyBytes, err := ioutil.ReadAll(body)
            if err != nil {
                log.Fatal(err)
            }
    
            log.Println(string(bodyBytes))
        }
    }
    

    Este código utiliza el método msg.GetBody para obtener el cuerpo del mensaje como un objeto io.Reader, luego lee su contenido utilizando ioutil.ReadAll y lo convierte en una cadena para imprimirlo en la consola.

Comments are closed.