电子邮件包含UTF-8编码的XML文件附件。 我正在寻找一种方法来阅读ASP.NET /Mono MVC4应用程序中的这个。 我尝试使用openpop,如How to save email attachment using OpenPop中所述使用代码
using (OpenPop.Pop3.Pop3Client client = new Pop3Client())
{
client.Connect("mail.company.com", 110, false);
client.Authenticate("user", "pass", AuthenticationMethod.UsernameAndPassword);
if (client.Connected)
{
int messageCount = client.GetMessageCount();
List<Message> allMessages = new List<Message>(messageCount);
for (int i = messageCount; i > 0; i--)
{
var msg = client.GetMessage(i);
var att = msg.FindAllAttachments();
foreach (var ado in att)
{
var xml = ado.GetBodyAsText();
结果xml字符串重音字符被转换为丝束?分数。
下面的消息中的XXXLTEC O=C3=9C
在xml变量中显示为XXXLTEC O??
。
正确的结果是XXXLTEC OÜ
如何正确阅读UTF-8附件? 我没有在OpenPop中找到任何选项来正确转换它。
消息中的XML附件显示为
------=_NextPart_000_0066_01D0302C.83D6EFA0
Content-Type: text/xml;
name="tapitolemas.xml"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="tapitolemas.xml"
<?xml version=3D"1.0" encoding=3D"UTF-8"?>
<E-Document>
<Header>
<DateIssued>2015-01-02T13:27</DateIssued>
<SenderID>-</SenderID>
<ReceiverID>1COL</ReceiverID>
</Header>
<Document>
<DocumentType>invoice</DocumentType>
<DocumentFunction>original</DocumentFunction>
<DocumentParties>
<BuyerParty context=3D"partner">
<PartyCode>1COL</PartyCode>
<Name>XXXLTEC O=C3=9C</Name>
答案 0 :(得分:1)
这可以通过将MessagePrt.cs GetBodyAsText()方法更改为
来解决 public string GetBodyAsText()
{
return Encoding.UTF8.GetString(Body);
// Original gets ?? characters instead of unicode ones
//return BodyEncoding.GetString(Body);
}
答案 1 :(得分:0)
使用OpenPOP.NET可能无法解决这个问题,因此您唯一真正的选择就是使用另一个没有此问题的POP3库,例如MailKit。
问题是OpenPOP假设charset是US-ASCII,因为Content-Type头中没有charset参数,并且它错误地强制文本使用该charset编码进行转换(而不是在它接受的内容中是自由的)。
另一方面,MailKit使用字符集回退逻辑来尝试确定它是哪个字符集。但即使默认情况下它出错(即TextPart.Text
属性,您仍然可以使用TextPart.GetText (System.Text.Encoding encoding)
覆盖内容。