我构建了一个电子邮件解析器,从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字符串,因为它包含非基本64个字符,两个以上的填充字符或填充字符中的非空白字符 .

我假设它与字符串的编码/解码有关,但我尝试了各种编码类型并仍然得到错误 .

一些其他信息:

  • 编程语言:C#

  • 电子邮件主持人:GMail

  • 如果我手动将电子邮件转发给自己,解析器可以正常工作,但不会对原始电子邮件起作用 .

  • 我甚至尝试过GMail中的自动转发,但这不起作用 .

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

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

------=_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方法中用作返回值(即使用this.Data属性值时返回 _data ) .

现在为eFax(电子邮件失败)部分 Headers :

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() 方法调用工作?

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

最近更新:

事实证明问题不是编码而是我的解析器!我无意中在附件文本中包含了额外的标头值 . 它现在正在运作 . 谢谢 .