当前位置:首页 > Windows程序 > 正文

Firefox中文显示正常,网页打开邮件附件中文名乱码

2021-05-24 Windows程序

首先通过CDO.Message来获取邮件EML相关数据:邮件标题、邮件内容、邮件附件、发件人、收件人、CC主要就这么几个,其次通过MailMessage来组织邮件通过Python来发送邮件!

就这么简简单单的需求!!问题出现了,中文附件名!Web打开始终是乱码!使用邮件客户端FireFox是OK的,查看了FireFox源码发现是乱码,这点说明FireFox的强大,非常强大!

    

Content-Type: application/octet-stream; name=鎶ラ攢鍗昪s.xlsx Content-Transfer-Encoding: base64 Content-Disposition: attachment

见图见图

技术分享

……

二、折腾中

出了问题想办法,一定要抱着始终相信一定可以解决的尤其是搞IT的一定有方法!大事化小,小事化无。先找卧底!第一个想到的便是CDO.Message那就从他下手。最后发现他是平民!

先说说走的路,干货的路,其他摸索的方法想了下数数应该有4,5种了:

读取EML转换成流,再获取附件再解码,发现中文名OK

先看结果

技术分享

再看看代码

public class AttachmentExtractor { private static int imageCount; public static void Method(string path) { StreamReader reader = null; try { reader = new StreamReader(path); string line; StringBuilder sb = new StringBuilder(); while ((line = reader.ReadLine()) != null) { sb.Append(line.ToLower()); if (line.ToLower().StartsWith("content-disposition:attachment;") || line.ToLower().StartsWith("content-disposition: attachment;")) // found attachment { string fileName = GetAttachment(reader, line); fileName = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(fileName.Replace("=?utf-8?B?", "").Replace("?=", ""))); } if (line.ToLower().StartsWith("content-type:image/")) // found embedded image { ExtractContent(reader, GetImage(reader, line)); } } } catch (IOException) { Console.WriteLine("找不到文件!"); } finally { if (reader != null) reader.Close(); } } private static string GetAttachment(TextReader reader, string line) { if (!line.Contains("filename")) { line = reader.ReadLine(); // Thunderbird: filename start at //second line } return GetFilenameNew(reader, line); } private static string GetImage(TextReader reader, string line) { if (!line.Contains("name")) { line = reader.ReadLine(); // Thunderbird: filename start at //second line } if (!line.Contains("name")) // embedded image does not have name { AdvanceToEmptyLine(reader); return "image" + imageCount++ + ".jpg"; // default to jpeg } return GetFilename(reader, line); } private static string GetFilename(TextReader reader, string line) { string filename; int filenameStart = line.IndexOf(") + 1; if (filenameStart > 0) { filename = line.Substring(filenameStart, line.Length - filenameStart - 1); } else // filename does not have quote { filenameStart = line.IndexOf(=) + 1; filename = line.Substring(filenameStart, line.Length - filenameStart); } AdvanceToEmptyLine(reader); return filename; } private static string GetFilenameNew(TextReader reader, string line) { string filename; int filenameStart = line.IndexOf(") + 1; if (filenameStart > 0) { filename = line.Substring(filenameStart, line.Length - filenameStart - 1); } else // filename does not have quote { filenameStart = line.IndexOf(=) + 1; filename = line.Substring(filenameStart, line.Length - filenameStart); } return filename; } private static void AdvanceToEmptyLine(TextReader reader) { string line; while ((line = reader.ReadLine()) != null) { if (String.IsNullOrEmpty(line)) break; } } private static void ExtractContent(TextReader reader, string filename) { string line; var content = new StringBuilder(); while ((line = reader.ReadLine()) != null) { if (String.IsNullOrEmpty(line)) break; content.Append(line); } if (content.Length > 0) { byte[] buffer = Convert.FromBase64String(content.ToString()); #region 7.7 if (!File.Exists(filename)) { return; } #endregion using (Stream writer = new FileStream(filename, FileMode.Create)) { writer.Write(buffer, 0, buffer.Length); } } } }

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70030.html