使用Redemption 6.3转换日文.msg为.eml时字符编码错误问题
解决方案:修复ISO-2022-JP编码.msg转.eml的字符异常问题
1. 手动设置会话默认代码页
Redemption默认可能未正确识别ISO-2022-JP编码的.msg文件,加载消息前可将RDOSession.DefaultCodePage设为ISO-2022-JP对应的代码页(50220),强制会话用指定编码解析内容:
RDOSession session = getRDOSessionForCurrentThread(); // 指定ISO-2022-JP编码对应的代码页 session.DefaultCodePage = 50220; try { using (SafeRDOMail message = new SafeRDOMail(session.GetMessageFromMsgFile(msgFilePath))) { message.RDOMail.SaveAs(emlFilePath, rdoSaveAsType.olRFC822_Redemption); } } catch (Exception ex) { throw new Exception(String.Format("Error converting {0} to eml file.", emlFilePath), ex); }
2. 直接使用RDOMail.EML属性写入文件
若SaveAs方法仍有编码问题,可跳过该方法,直接读取EML属性返回的原始字节流写入文件,避免中间编码转换环节:
RDOSession session = getRDOSessionForCurrentThread(); session.DefaultCodePage = 50220; try { using (SafeRDOMail message = new SafeRDOMail(session.GetMessageFromMsgFile(msgFilePath))) { // 获取原始EML字节数组 byte[] emlBytes = message.RDOMail.EML; // 直接写入文件,保留原始编码格式 File.WriteAllBytes(emlFilePath, emlBytes); } } catch (Exception ex) { throw new Exception(String.Format("Error converting {0} to eml file.", emlFilePath), ex); }
3. 手动修正MIME头编码
如果发件人等字段仍显示异常,可手动提取字段内容,按照RFC 2047标准用ISO-2022-JP重新编码后替换EML中的对应字段:
RDOSession session = getRDOSessionForCurrentThread(); session.DefaultCodePage = 50220; try { using (SafeRDOMail message = new SafeRDOMail(session.GetMessageFromMsgFile(msgFilePath))) { // 用ISO-2022-JP编码解析原始EML内容 string emlContent = Encoding.GetEncoding(50220).GetString(message.RDOMail.EML); // 提取发件人名称并按RFC2047格式编码 string senderName = message.RDOMail.Sender.Name; string encodedSenderName = $"=?ISO-2022-JP?B?{Convert.ToBase64String(Encoding.GetEncoding(50220).GetBytes(senderName))}?="; // 替换EML中的发件人行(匹配"From: 名称 <邮箱>"格式) emlContent = Regex.Replace(emlContent, @"From: .* <(.*)>", $"From: {encodedSenderName} <$1>"); // 保存修正后的EML文件 File.WriteAllText(emlFilePath, emlContent, Encoding.GetEncoding(50220)); } } catch (Exception ex) { throw new Exception(String.Format("Error converting {0} to eml file.", emlFilePath), ex); }
4. 升级Redemption版本
Redemption 6.3可能存在ISO-2022-JP编码的已知处理问题,尝试升级到最新稳定版本,新版本通常会修复特定编码的兼容逻辑。
内容的提问来源于stack exchange,提问作者Mitanshu Bhoot
相关产品推荐
相关产品推荐

