2

我构建了一个电子邮件解析器,它从两个不同的传真提供商 RingCentral 和 eFax 发送的电子邮件中提取 TIFF 附件。

应用程序使用 Pop3 将电子邮件作为文本流检索,然后解析文本以识别表示 Tiff 图像的部分。

通过将该文本部分转换为字节数组并使用BinaryWriter,我可以在本地硬盘驱动器上创建 TIFF 文件。

public void SaveToFile(string filepath)
{
    BinaryWriter bw = new BinaryWriter(new FileStream(filepath, FileMode.Create));

    bw.Write(this.Data);
    bw.Flush();
    bw.Close();
}

问题是 eFax 电子邮件附件在将文本转换为字节数组时会导致运行时错误。

//_data is a byte array
//RawData is a string
_data = Convert.FromBase64String(RawData);  //fails on this line

我收到以下错误:

输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或填充字符中的非空白字符。

我认为它与字符串的编码/解码有关,但我尝试了各种编码类型,但仍然出现错误。

一些附加信息:

  • 编程语言:C#
  • 电子邮件主机:GMail
  • 如果我手动将电子邮件转发回给自己,解析器可以工作,但不会对原始邮件起作用。
  • 我什至尝试在 GMail 中自动转发,但这不起作用。

我在这里回复下面的第一条评论,感谢您的回复。

TIFF 文件是通过从电子邮件中获取与 TIFF 文件附件关联的文本部分、将其转换为字节数组并使用.tiff文件扩展名保存文件来创建的。这适用于所有 RingCentral 电子邮件。例如,RingCentral 电子邮件部分标题如下所示:

------=_NextPart_3327195283162919167883
Content-Type: image/tiff; name="18307730038-0803-141603-326.tif"
Content-Transfer-Encoding: base64
Content-Description: 18307730038-0803-141603-326.tif
Content-Disposition: attachment; filename="18307730038-0803-141603-326.tif"

请注意 base64 的 Content-Transfer-Encoding 值。这解释了为什么我使用以下 C# 转换代码:

_data = Convert.FromBase64String(tiffEmailString);

_data是私有变量,在上面的SaveToFile方法中用作返回值(即_data使用this.Data属性值时返回)。

现在对于 eFax(失败的电子邮件)部分标题:

Content-Type: image/tiff; name=FAX_20130802_1375447833_61.tif
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="FAX_20130802_1375447833_61.tif"
Content-MD5: 1B2M2Y8AsgTpgAmY7PhCfg==

它也显示base64。那么Convert.FromBase64String()方法调用不应该起作用吗?

我还将检查我的解析器是否正在获取其他文本。但如果我遗漏了什么,请指出。谢谢。

最近更新:

事实证明,问题不在于编码,而在于我的解析器!我无意中在附件文本中包含了一个额外的标题值。它现在正在工作。谢谢。

4

0 回答 0