【问题标题】:How to save email attachment using OpenPop如何使用 OpenPop 保存电子邮件附件
【发布时间】:2012-05-06 05:46:44
【问题描述】:

我创建了一个网络电子邮件应用程序,我如何查看保存附件?

我使用的是OpenPop,第三方dll,可以发送带附件的邮件,也可以阅读不带附件的邮件。

这很好用:

Pop3Client pop3Client = (Pop3Client)Session["Pop3Client"]; // Creating newPopClient 
int messageNumber = int.Parse(Request.QueryString["MessageNumber"]);
Message message = pop3Client.GetMessage(messageNumber);
MessagePart messagePart = message.MessagePart.MessageParts[1];
lblFrom.Text = message.Headers.From.Address; // Writeing message. 
lblSubject.Text = message.Headers.Subject;
lblBody.Text=messagePart.BodyEncoding.GetString(messagePart.Body);

第二部分代码显示附件的内容,但只有在它是文本文件时才有用。我需要能够保存附件。此外,我在此处的代码的底部部分会覆盖我的邮件正文,因此如果我收到附件,我将无法查看我的邮件正文。

if (messagePart.IsAttachment == true) { 
    foreach (MessagePart attachment in message.FindAllAttachments()) { 
        if (attachment.FileName.Equals("blabla.pdf")) { // Save the raw bytes to a file
            File.WriteAllBytes(attachment.FileName, attachment.Body); //overwrites MessagePart.Body with attachment 
        } 
    } 
}

【问题讨论】:

    标签: c# email save attachment openpop


    【解决方案1】:
        private KeyValuePair<byte[], FileInfo> parse(MessagePart part)
        {
            var _steam = new MemoryStream();
            part.Save(_steam);
            //...
            var _info = new FileInfo(part.FileName);
            return new KeyValuePair<byte[], FileInfo>(_steam.ToArray(), _info);
        }
    
        //... How to use
        var _attachments = message 
            .FindAllAttachments()
            .Select(a => parse(a))
        ;
    

    【讨论】:

      【解决方案2】:

      如果有人仍在寻找答案,这对我来说很好。

      var client = new Pop3Client();
      try
      {            
          client.Connect("MailServerName", Port_Number, UseSSL); //UseSSL true or false
          client.Authenticate("UserID", "password");   
      
          var messageCount = client.GetMessageCount();
          var Messages = new List<Message>(messageCount);
      
          for (int i = 0;i < messageCount; i++)
          {
              Message getMessage = client.GetMessage(i + 1);
              Messages.Add(getMessage);
          }
      
          foreach (Message msg in Messages)
          {
              foreach (var attachment in msg.FindAllAttachments())
              {
                  string filePath = Path.Combine(@"C:\Attachment", attachment.FileName);
                  if(attachment.FileName.Equals("blabla.pdf"))
                  {
                      FileStream Stream = new FileStream(filePath, FileMode.Create);
                      BinaryWriter BinaryStream = new BinaryWriter(Stream);
                      BinaryStream.Write(attachment.Body);
                      BinaryStream.Close();
                  }
              }
          }
      }
      catch (Exception ex)
      {
          Console.WriteLine("", ex.Message);
      }
      finally
      {
          if (client.Connected)
              client.Dispose();
      }
      

      【讨论】:

      • 此代码将 UTF-8 附件中的重音字符替换为两个问号。如何解决这个问题?我将此作为单独的问题发布在stackoverflow.com/questions/27949470/…
      • 谢谢你 - Mange tak - Gracie - Perfecto :-)
      【解决方案3】:
       List<Message> lstMessages = FetchAllMessages("pop.mail-server.com", 995, true,"Your Email ID", "Your Password");
      

      上面的代码行使用相应的弹出邮件服务器从您的电子邮件中获取所有消息的列表。

      例如,要获取列表中最新(或第一封)电子邮件的附件,您可以编写以下代码。

       List<MessagePart> lstAttachments = lstMessages[0].FindAllAttachments();  //Gets all the attachments associated with latest (or first) email from the list.
       for (int attachment = 0; attachment < lstAttachments.Count; attachment++)
       {
               FileInfo file = new FileInfo("Some File Name");
               lstAttachments[attachment].Save(file);
       } 
      

      【讨论】:

        【解决方案4】:

        以防万一有人想要 VB.NET 的代码:

        For Each emailAttachment In client.GetMessage(count).FindAllAttachments
            AttachmentName = emailAttachment.FileName
            '----// Write the file to the folder in the following format: <UniqueID> followed by two underscores followed by the <AttachmentName>
            Dim strmFile As New FileStream(Path.Combine("C:\Test\Attachments", EmailUniqueID & "__" & AttachmentName), FileMode.Create)
            Dim BinaryStream = New BinaryWriter(strmFile)
            BinaryStream.Write(emailAttachment.Body)
            BinaryStream.Close()
        Next
        

        【讨论】:

          【解决方案5】:

          对于未来的读者来说,更新版本的 Pop3 有更简单的方法

          using( OpenPop.Pop3.Pop3Client client = new Pop3Client())
                  {
                      client.Connect("in.mail.Your.Mailserver.com", 110, false);
                      client.Authenticate("usernamePop3", "passwordPop3", AuthenticationMethod.UsernameAndPassword);
                      if (client.Connected)
                      {
                          int messageCount = client.GetMessageCount();
                          List<Message> allMessages = new List<Message>(messageCount);
                          for (int i = messageCount; i > 0; i--)
                          {
                              allMessages.Add(client.GetMessage(i));
                          }
                          foreach (Message msg in allMessages)
                          {
                              var att = msg.FindAllAttachments();
                              foreach (var ado in att)
                              {
                                  ado.Save(new System.IO.FileInfo(System.IO.Path.Combine("c:\\xlsx", ado.FileName)));
                              }
                          }
                      }
                     }
          

          【讨论】:

            【解决方案6】:

            这是我很久以前写的,但请看一下我用来在 POP 服务器上的电子邮件消息中保存 XML 附件的这段代码:

            OpenPOP.POP3.POPClient client = new POPClient("pop.yourserver.co.uk", 110, "your@email.co.uk", "password_goes_here", AuthenticationMethod.USERPASS); 
            if (client.Connected) {
            int msgCount = client.GetMessageCount();
            
            /* Cycle through messages */
            for (int x = 0; x < msgCount; x++)
                {
                    OpenPOP.MIMEParser.Message msg = client.GetMessage(x, false);
                    if (msg != null) {
                        for (int y = 0; y < msg.AttachmentCount; y++)
                        {
                            Attachment attachment = (Attachment)msg.Attachments[y];
            
                            if (string.Compare(attachment.ContentType, "text/xml") == 0)
                            {
                                System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            
                                string xml = attachment.DecodeAsText();
                                doc.LoadXml(xml);
                                doc.Save(@"C:\POP3Temp\test.xml");
                            }
                        }
                    }
                }
            }
            

            【讨论】:

            • 另外,请参阅 www.codeproject.com/Answers/181619/How-i-can-extract-attachment-file-from-MessageRaw#answer1 和 codingrage.blogspot.com/2008/04/…
            • 是的@AYS,那是我的博客。 :)
            【解决方案7】:

            OpenPop.Mime.Message 类具有 ToMailMessage() 方法,可将 OpenPop 的 Message 转换为 System.Net.Mail.MailMessage,该 System.Net.Mail.MailMessage 具有 Attachments 属性。尝试从那里提取附件。

            【讨论】:

            • 我已经尝试过了,但它不起作用,OpenPop 将整个消息视为附件,但我想它有点正确,所以你可以得到我的赏金,我不妨买一个袋子给它你因为你是唯一的答案,并且会以任何方式得到它:\
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-22
            • 1970-01-01
            • 1970-01-01
            • 2014-07-12
            • 2021-06-26
            • 1970-01-01
            相关资源
            最近更新 更多