MimeMessageParser 无法从地址获取
MimeMessageParser unable to fetch from address
我们已经被这个问题困扰了很长一段时间 now.In 我们的项目正在尝试解析写入文件的电子邮件并将数据导入 pojo。它适用于大多数情况,但是当电子邮件 ID 太长时,邮件 ID 会转到下一行,因为发件人地址未被提取,而是名称为 fetched.We are using commons-email- 1.4.
包含电子邮件的输入文件有
case1:
From: "def, abc [CCC-OT]" <abc.def@test.com> //here it fetches the mail id properly
如果邮件 ID 较长,则文件有
case2:
From: "defxacdhf, abc [CCC-OT]"
<abc.defxacdhf@test.com>// here the mail id jumps to the next line so the from address fetched contains the name
这里是示例代码
ByteArrayInputStream byteArrayStream = new ByteArrayInputStream(FileUtils.getStreamAsByteArray(buffInStream,
lengthOfFile));
// MimeMessage message = new MimeMessage(mailSession, byteArrayStream);
MimeMessageParser mimeParser = new MimeMessageParser(MimeMessageUtils.createMimeMessage(mailSession,
byteArrayStream));
MimeMessageParser parsedMessage = mimeParser.parse();
当我们尝试获取发件人地址时
emailData.setFromAddress(parsedMessage.getFrom());
案例 1 returns abc.def@test.com
案例 2 returns "defxacdhf, abc [CCC-OT]"
。在此感谢任何帮助。
编辑 脚本文件如下所示读写。
while read line
do
echo "$line" >> /directory/$FILE_NAME
done
正如所讨论的:
这不是任何使用的库中的错误,而是不符合 RFC 的输入。
引用自RFC-822:
3.1.1. LONG HEADER FIELDS
Each header field can be viewed as a single, logical line of
ASCII characters, comprising a field-name and a field-body.
For convenience, the field-body portion of this conceptual
entity can be split into a multiple-line representation; this
is called "folding". The general rule is that wherever there
may be linear-white-space (NOT simply LWSP-chars), a CRLF
immediately followed by AT LEAST one LWSP-char may instead be
inserted.
我不明白你为什么要使用 shell while 循环来读取数据,而不是只使用 cat 或类似的东西,但问题在于你使用 "read" .默认情况下,读取将输入行拆分为字段,由 shell IFS 环境变量指定的字段分隔符分隔。前导字段分隔符将被忽略,因此当您读取以白色 space 开头的行时,白色 space 将被忽略。
将循环更改为:
while IFS= read -r line
do
echo "$line" >> /directory/$FILE_NAME
done
在每次读取之前将 IFS 设置为空字符串,并指定 "raw" 读取以便反斜杠字符不特殊。
但是除非你在那个读取循环中做其他事情,否则只做
会简单得多
cat > /directory/$FILE_NAME
我们已经被这个问题困扰了很长一段时间 now.In 我们的项目正在尝试解析写入文件的电子邮件并将数据导入 pojo。它适用于大多数情况,但是当电子邮件 ID 太长时,邮件 ID 会转到下一行,因为发件人地址未被提取,而是名称为 fetched.We are using commons-email- 1.4.
包含电子邮件的输入文件有
case1:
From: "def, abc [CCC-OT]" <abc.def@test.com> //here it fetches the mail id properly
如果邮件 ID 较长,则文件有
case2:
From: "defxacdhf, abc [CCC-OT]"
<abc.defxacdhf@test.com>// here the mail id jumps to the next line so the from address fetched contains the name
这里是示例代码
ByteArrayInputStream byteArrayStream = new ByteArrayInputStream(FileUtils.getStreamAsByteArray(buffInStream,
lengthOfFile));
// MimeMessage message = new MimeMessage(mailSession, byteArrayStream);
MimeMessageParser mimeParser = new MimeMessageParser(MimeMessageUtils.createMimeMessage(mailSession,
byteArrayStream));
MimeMessageParser parsedMessage = mimeParser.parse();
当我们尝试获取发件人地址时
emailData.setFromAddress(parsedMessage.getFrom());
案例 1 returns abc.def@test.com
案例 2 returns "defxacdhf, abc [CCC-OT]"
。在此感谢任何帮助。
编辑 脚本文件如下所示读写。
while read line
do
echo "$line" >> /directory/$FILE_NAME
done
正如所讨论的:
这不是任何使用的库中的错误,而是不符合 RFC 的输入。
引用自RFC-822:
3.1.1. LONG HEADER FIELDS
Each header field can be viewed as a single, logical line of ASCII characters, comprising a field-name and a field-body. For convenience, the field-body portion of this conceptual entity can be split into a multiple-line representation; this is called "folding". The general rule is that wherever there may be linear-white-space (NOT simply LWSP-chars), a CRLF immediately followed by AT LEAST one LWSP-char may instead be inserted.
我不明白你为什么要使用 shell while 循环来读取数据,而不是只使用 cat 或类似的东西,但问题在于你使用 "read" .默认情况下,读取将输入行拆分为字段,由 shell IFS 环境变量指定的字段分隔符分隔。前导字段分隔符将被忽略,因此当您读取以白色 space 开头的行时,白色 space 将被忽略。
将循环更改为:
while IFS= read -r line
do
echo "$line" >> /directory/$FILE_NAME
done
在每次读取之前将 IFS 设置为空字符串,并指定 "raw" 读取以便反斜杠字符不特殊。
但是除非你在那个读取循环中做其他事情,否则只做
会简单得多 cat > /directory/$FILE_NAME