none
Descargar Adjuntos en Correo de Gmail RRS feed

  • Pregunta

  • Buenas

    Alguien me podria ayudar con esto, he estado buscando como hacerlo pero algunos blogs suben los codigos incompletos o con librerias desconocidas lo que necesito es leer un correo con un asunto en gmail y descargar el adjunto que llega en el correo, la tarea ya la hice con php pero lo quisiera hacer en c# 

    Gracias por su ayuda quedo atento

    jueves, 14 de marzo de 2019 14:26

Todas las respuestas

  • hola

    Para acceder a los mail necesitas una libreria que implemente el protocolo POP3 o sino IMAP, imagino conoces la diferencia entre estos

    https://github.com/jstedfast/MailKit

    la agregas desde nuget

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 14 de marzo de 2019 14:53
  • Gracias

    ya puedo acceder lo que no consigo es el codigo o libreria para descargar el adjunto

    jueves, 14 de marzo de 2019 14:55
  • como accedes ?

    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 14 de marzo de 2019 15:38
  • AE.Net.Mail.ImapClient ic = new AE.Net.Mail.ImapClient("imap.gmail.com", "user@gmail.com", "pass", AE.Net.Mail.AuthMethods.Login, 993, true); ic.SelectMailbox("INBOX"); Console.WriteLine(ic.GetMessageCount());

    la libreria esta en NuGet

    https://es.stackoverflow.com/questions/31123/como-leer-correos-pop3-desde-c

    jueves, 14 de marzo de 2019 15:44
  • hola , hace algún tiempo hice algo como lo que necesitas, pero utilizé la librería que corresponde al protocolo POP

    la descargué del sitio SOURCEFORGE

    el código era algo como esto, quizas contenga algún error.

     private void DescargarAdjunto_Click(object sender, EventArgs e)
            {
                //List<MessagePart> attachments = message.FindAllAttachments();
                Pop3Client popup = new Pop3Client();
                popup.Connect("XXX.XX.X.XX", 995, true, 6000, 6000, new RemoteCertificateValidationCallback(ValidateServerCertificate));
                popup.Authenticate("usuario", "clave");
                
                int c = popup.GetMessageCount();         
                var Messages=new List<OpenPop.Mime.Message>(c);
     
                    for (int n = 0; n <c ; n++)
                    {
                        OpenPop.Mime.Message getMessage = popup.GetMessage(n+1);
                        Messages.Add(getMessage);
                    }
    				
                    foreach (OpenPop.Mime.Message msg in Messages)
                    {
                        foreach (var attachment in msg.FindAllAttachments())
                        {
                            string filePath = Path.Combine(@"C:\DOCUMENTOS", attachment.FileName);
                            
                                FileStream Stream = new FileStream(filePath, FileMode.Create);
                                BinaryWriter BinaryStream = new BinaryWriter(Stream);
                                BinaryStream.Write(attachment.Body);
                                BinaryStream.Close();
                            
                        }
                    }
                
                popup.Dispose();
    
            }
        public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
            {
                return true;  // force the validation of any certificate
            }



    Votar y marcar respuestas es agradecer.
    Saludos.
    Lima-Perú


    • Editado Augusto1982 jueves, 14 de marzo de 2019 17:20
    jueves, 14 de marzo de 2019 17:17
  • hola muchas gracias, donde especifico el asunto del email que voy a descargar? para llamar el mas reciente

    jueves, 14 de marzo de 2019 17:52
  • hola muchas gracias, donde especifico el asunto del email que voy a descargar? para llamar el mas reciente

    Es cuestión de buscar en los objetos que llenas

    OpenPop.Mime.Message getMessage = popup.GetMessage(n+1);
    string fecha=Convert.ToString(message.Headers.Date);


    Votar y marcar respuestas es agradecer.
    Saludos.
    Lima-Perú

    jueves, 14 de marzo de 2019 18:54
  • hola lo hice de esta manera

    usando la libreria AE.Net.Mail que se consigue en el Nuget

    using AE.Net.Mail;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace Descargar_Correo
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                try
                {
                    //borrar archivo anterior con el mismo nombre
                    string path = System.IO.Path.GetFullPath(Path.GetFileName("~/archivo para borrar"));
                    File.Delete(path);
                    string msgId ="";
                    using (var ic = new AE.Net.Mail.ImapClient("imap.gmail.com", "micorreo", "micontraseña", AE.Net.Mail.AuthMethods.Login, 993, true))
                    {
                        ic.SelectMailbox("INBOX");
                        Console.WriteLine(ic.GetMessageCount());
                        List<AE.Net.Mail.MailMessage> mails = new List<AE.Net.Mail.MailMessage>();
                        var msgs = ic.SearchMessages(SearchCondition.Subject("asunto que buscar"));
    
                        for (int i = msgs.Length-1; i >= 0;)
                        {
                             msgId = msgs[i].Value.Uid;
                            break;              
                        }
                        mails.Add(ic.GetMessage(msgId, headersonly: false));
                        foreach (var msg in mails)
                        {
                            foreach (var att in msg.Attachments)
                            {
                                string fName;
                                fName = att.Filename;
                                att.Save(@"ruta para guardar"+fName+"");
                            }
                        }
                    }     
                }
                catch (Exception ex)
                {
                    this.Close();
                    throw;
                }
                this.Close();
            }
        }        
    }
    

    jueves, 14 de marzo de 2019 19:05