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)
}
}
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 arregloimap.FetchItem
, de esta manera:Luego puedes acceder al cuerpo utilizando el campo
Body
del objetoimap.Message
, de esta manera:Este código utiliza el método
msg.GetBody
para obtener el cuerpo del mensaje como un objetoio.Reader
, luego lee su contenido utilizandoioutil.ReadAll
y lo convierte en una cadena para imprimirlo en la consola.