从电子邮件下载附件

时间:2011-12-22 17:25:14

标签: c# email download email-attachments

如何浏览电子邮件并下载所有附件?

public string Connect_Email ()
{
    string Res = "";

    try
    {
        mailclient = new TcpClient("pop.orange.fr", Convert.ToInt16("110"));
    }
    catch ( SocketException ExTrhown )
    {
        Res = "Unable to connect to server 1";
        throw new Exception(ExTrhown.Message + "Unable to connect to server 1");
    }

    ns = mailclient.GetStream();
    sr = new StreamReader(ns);
    sw = new StreamWriter(ns);

    response = sr.ReadLine(); //Get opening POP3 banner

    sw.WriteLine("USER " + "xxxxx@orange.fr"); //Send username
    sw.Flush();

    response = sr.ReadLine();

    if ( response.Substring(0, 4) == "-ERR" )
    {
        Res = "Unable to log into server 2";
    }

    sw.WriteLine("PASS " + "xxxxx"); //Send password
    sw.Flush();

    response = sr.ReadLine();

    if ( response.Substring(0, 3) == "-ER" )
    {
        Res = "Unable to log into server 3";
    }

    return Res;
}

public void Get_Attacht ()
{
    string ClientName = "";

    #region Chercher Attachment
    sw.WriteLine("STAT"); //Send stat command to get number of messages
    sw.Flush();

    response = sr.ReadLine();

    //find number of message
    string[] nummess = response.Split(' ');
    totmessages = Convert.ToInt16(nummess[1]);

    //read emails
    for ( int i = 1; i <= totmessages; i++ )
    {
        msg = null;

        sw.WriteLine("top " + i + " 0"); //read header of each message
        sw.Flush();
        response = sr.ReadLine();

        while ( true )
        {
            response = sr.ReadLine();
            if ( response == "." )
                break;
            msg = msg + response + "\r\n";
        }

        //read attachment
        attachment = null;
        if ( Regex.Match(msg, "multipart/mixed").Success )
        {
            msg = null;
            sw.WriteLine("retr " + i.ToString()); //Retrieve entire message
            sw.Flush();
            response = sr.ReadLine();

            while ( true )
            {
                response = sr.ReadLine();
                if ( response == "." )
                    break;
                msg = msg + response + "\r\n";
            }

            int End = msg.IndexOf(".csv");
            string LeFile = msg.Substring(End - 9, 9);

            if ( Regex.Match(msg, LeFile + ".csv").Success )
            {
                data = msg.Split('\r');

                startindex = 0;
                index = 0;
                lastindex = 0;
                x = null;
                ms = null;
                fs = null;

                while ( true )
                {
                    attachment = null;
                    while ( !Regex.Match(data[index].Trim(), "filename").Success )
                    {
                        index++;
                    }
                    if ( index == data.Length - 1 ) break;
                    FileName_Email = data[index].Trim().Substring(42).Replace("\"", "");

                    //find start of attachment data
                    index++;
                    while ( data[index].Length != 1 )
                    {
                        index++;
                    }

                    if ( index == data.Length - 1 ) break;
                    startindex = index + 1;

                    //find end of data
                    index = startindex + 1;
                    while ( ( !Regex.Match(data[index].Trim(), "--0").Success ) && ( data[index].Length != 1 ) && ( index < data.Length - 1 ) )
                    {
                        index++;
                    }
                    if ( index == data.Length ) break;
                    lastindex = index - 2;

                    for ( int j = startindex; j <= lastindex; j++ )
                    {
                        attachment = attachment + data[j];
                    }
                    attachment = attachment + "\r\n";

                    if ( Regex.Match(FileName_Email.ToLower(), "csv").Success )
                    {
                        byte[] filebytes = Convert.FromBase64String(attachment);
                        FileStream LeFS = new FileStream(filePath + "\\testDEC.csv", FileMode.Create, FileAccess.Write, FileShare.None);
                        LeFS.Write(filebytes, 0, filebytes.Length);
                        LeFS.Close();
                        break;
                    }

                }
            }
        }
    }

    sw.WriteLine("quit"); //quit
    sw.Flush();
    #endregion
}

它不起作用,你有另一个简单的想法吗?

3 个答案:

答案 0 :(得分:3)

如果您尝试通过POP3阅读电子邮件,我建议您使用OpenPOP.NET library而不是滚动自己的电子邮件。这很容易使用。

答案 1 :(得分:3)

尝试这样的事情

using(Pop3 pop3 = new Pop3())  
 {  
     pop3.Connect("server");  
     pop3.UseBestLogin("user", "password");  
     foreach (string uid in pop3.GetAll())  
     {  
         IMail email = new MailBuilder()
         .CreateFromEml(pop3.GetMessageByUID(uid));  
         Console.WriteLine(email.Subject);  
         // save all attachments to disk  
         email.Attachments.ForEach(mime => mime.Save(mime.SafeFileName));  
     }  
     pop3.Close();  
 } 

//这里是您可以使用的参考链接 Getting Email Attachments

答案 2 :(得分:2)

谢谢大家的贡献。最后我使用POP3:

public string Connect_Email()
{
    string Res = "";
    try
    {
        Pop3Client email = new Pop3Client("login", "password", "server");
        email.OpenInbox();

        while (email.NextEmail())
        {
            if (email.IsMultipart)
            {
                IEnumerator enumerator = email.MultipartEnumerator;
                while (enumerator.MoveNext())
                {
                    Pop3Component multipart = (Pop3Component)
                    enumerator.Current;
                    if (multipart.IsBody)
                    {
                        //Console.WriteLine("Multipart body:" + multipart.Name);
                    }
                    else
                    {
                        //Console.WriteLine("Attachment name=" +    multipart.Name); // ... etc
                        byte[] filebytes = Convert.FromBase64String(multipart.Data);

                        //Search FileName
                        int Begin = multipart.ContentType.IndexOf("name=");
                        string leFileNale = multipart.ContentType.Substring(Begin + 5, 12);

                        FileStream LeFS = new FileStream(filePath + "\\" + leFileNale, FileMode.Create, FileAccess.Write, FileShare.None);
                        LeFS.Write(filebytes, 0, filebytes.Length);
                        LeFS.Close();
                    }
                }
            }
        }
        email.CloseConnection();
    }
    catch (Pop3LoginException)
    {
        Res = "Vous semblez avoir un problème de connexion!";
    }
    return Res;
}

它运作良好,但我仍然需要找到并下载我自己的附件。

byte[] filebytes = Convert.FromBase64String(multipart.Data);

//Search FileName
int Begin = multipart.ContentType.IndexOf("name=");
string leFileNale = multipart.ContentType.Substring(Begin + 5, 12);

FileStream LeFS = new FileStream(filePath + "\\" + leFileNale, FileMode.Create, FileAccess.Write, FileShare.None);
LeFS.Write(filebytes, 0, filebytes.Length);
LeFS.Close();