尝试使用 Javamail 解析带有外来字符的电子邮件时出现奇怪的输出
Getting weird output when trying to parse email with foreign characters using Javamail
我们正在使用 javamail 从电子邮件帐户中获取电子邮件,最近我们收到了带有中文、日文字符的电子邮件。
例如,这里有一些日语内容:
限定クリエイティブツールのコレクションを含む高速写真編集ソフトウェア。
它可能会像这样输出:
<div>=1B$B$"=1B(B =1B$B$$=1B(B =1B$B$&=1B(B =1B$B$(=1B(B =1B$B$*=1B(B =1B$B=
$+=1B(B =1B$B$-=1B(B =1B$B$/=1B(B =1B$B=1B(B =1B$B=1B(B =1B$B=1B(B =
=1B$B=1B(B =1B$B=1B(B =1B$B$;=1B(B =1B$B$=3D=1B(B =1B$B$,=1B(B =1B$B$.=
=1B(B =1B$B[=11=]=1B(B =1B$B=1B(B =1B$B=1B(B =1B$B$Q=1B(B =1B$B$T=1B(B =1B$=
B$W=1B(B =1B$B$Z=1B(B =1B$B$]=1B(B</div>
而content-type
通常是text/html; charset=UTF-8
。
我们正在使用 writeTo
方法获取所有 headers 和内容。
我尝试执行以下操作但没有成功:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
m.writeTo(baos);
pm.setUnProcessedMessage(baos.toString("UTF-8")); //Here I am explicitly stating the encoding
此外,我认为问题可能是因为我们使用的是旧版本的 JavaMail (1.5.0)。
我们这里可以做什么来处理外来字符?
使用 writeTo 方法为您提供邮件的 MIME 编码内容。听起来您想要 decoded 内容,为此您应该使用 getContent 或 getInputStream 方法。 getContent 方法会 return 一个 Unicode 字符的 String,你可以直接使用。 getInputStream 方法将 return 一个字节字符串,其字符编码由 charset 参数指定;您需要用 Reader 将其包装起来以获得 Unicode 字符。
如果您还想要 headers,例如,将它们与消息内容一起显示,您应该使用 getSubject、getRecipients 等方法,这将再次 return 您解码的内容.您可以使用 getHeader 方法获取其他 headers,但您需要使用 MimeUtility 方法自行解码内容。
我们正在使用 javamail 从电子邮件帐户中获取电子邮件,最近我们收到了带有中文、日文字符的电子邮件。
例如,这里有一些日语内容:
限定クリエイティブツールのコレクションを含む高速写真編集ソフトウェア。
它可能会像这样输出:
<div>=1B$B$"=1B(B =1B$B$$=1B(B =1B$B$&=1B(B =1B$B$(=1B(B =1B$B$*=1B(B =1B$B=
$+=1B(B =1B$B$-=1B(B =1B$B$/=1B(B =1B$B=1B(B =1B$B=1B(B =1B$B=1B(B =
=1B$B=1B(B =1B$B=1B(B =1B$B$;=1B(B =1B$B$=3D=1B(B =1B$B$,=1B(B =1B$B$.=
=1B(B =1B$B[=11=]=1B(B =1B$B=1B(B =1B$B=1B(B =1B$B$Q=1B(B =1B$B$T=1B(B =1B$=
B$W=1B(B =1B$B$Z=1B(B =1B$B$]=1B(B</div>
而content-type
通常是text/html; charset=UTF-8
。
我们正在使用 writeTo
方法获取所有 headers 和内容。
我尝试执行以下操作但没有成功:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
m.writeTo(baos);
pm.setUnProcessedMessage(baos.toString("UTF-8")); //Here I am explicitly stating the encoding
此外,我认为问题可能是因为我们使用的是旧版本的 JavaMail (1.5.0)。
我们这里可以做什么来处理外来字符?
使用 writeTo 方法为您提供邮件的 MIME 编码内容。听起来您想要 decoded 内容,为此您应该使用 getContent 或 getInputStream 方法。 getContent 方法会 return 一个 Unicode 字符的 String,你可以直接使用。 getInputStream 方法将 return 一个字节字符串,其字符编码由 charset 参数指定;您需要用 Reader 将其包装起来以获得 Unicode 字符。
如果您还想要 headers,例如,将它们与消息内容一起显示,您应该使用 getSubject、getRecipients 等方法,这将再次 return 您解码的内容.您可以使用 getHeader 方法获取其他 headers,但您需要使用 MimeUtility 方法自行解码内容。