【问题标题】:MimeMessageParser unable to fetch from addressMimeMessageParser 无法从地址获取
【发布时间】:2016-03-14 09:53:52
【问题描述】:

我们已经被这个问题困扰了很长一段时间了。在我们的项目中,我们试图解析写入文件的电子邮件并将数据放入 pojo。它适用于大多数情况,但是当电子邮件 ID 太长时,邮件 ID 会转到下一行,因此不会获取发件人地址,而是获取名称。我们使用的是 commons-email-1.4.

包含电子邮件的输入文件有

案例1:

From: "def, abc [CCC-OT]" <abc.def@test.com> //here it fetches the mail id properly

如果邮件ID较长,则文件具有

案例2:

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());

在 case1 中,它返回 abc.def@test.com,在 case2 中,它返回 "defxacdhf, abc [CCC-OT]"。感谢您提供任何帮助。

EDIT脚本文件的读写如下。

while read line
        do
            echo "$line" >> /directory/$FILE_NAME
        done

【问题讨论】:

  • 如果我没记错 RFC,在
  • @Jan 是的,"def, abc [CCC-OT]" 和 之间有空格在正常情况下,如果电子邮件 id 较长,则 id 会跳转到文件中的下一行。
  • 在以
  • 不,case2 下一行的开头没有空格。
  • 然后库按照 rfc 工作。你从哪里得到的线?

标签: java email jakarta-mail apache-commons-email


【解决方案1】:

我不明白您为什么要使用 shell while 循环来读取数据,而不是仅使用 cat 或类似的东西,但问题在于您使用“read”。默认情况下, read 将输入行拆分为字段,由 shell IFS 环境变量指定的字段分隔符分隔。前导字段分隔符被忽略,因此当您读取以空格开头的行时,空格将被忽略。

将循环更改为:

    while IFS= read -r line
    do
        echo "$line" >> /directory/$FILE_NAME
    done

在每次读取之前将 IFS 设置为空字符串,并指定“原始”读取,以便反斜杠字符不特殊。

但除非你在那个读取循环中做其他事情,否则这样做会简单得多

    cat > /directory/$FILE_NAME

【讨论】:

【解决方案2】:

如上所述:

不是所使用的任何库中的错误,而是不符合 RFC 的输入。

引用RFC-822:

3.1.1。长标题字段

   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.  

【讨论】:

  • 你能检查给出的脚本代码吗?我只是逐行读取并回显到文件任何想法如何解决这个输入问题?
  • 我愿意 - 但那是什么语言?您可能应该考虑编写一个新问题,以便该特定脚本语言的专家也会看到这一点。
  • 您能指定如何读取该行以及从哪里读取吗?这是连接到邮箱还是sendmail中的脚本?
  • 此脚本由 sendmail 调用。它是一个 Unix 脚本。
  • 哦——不是我最擅长的领域。你能提供你为什么这样做的背景吗?如果您刚刚将邮件发送到本地 mbox,则可以使用 JavaMail 访问它并获取所有消息。或者这就像每封收到的邮件的副本?
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 2021-06-12
  • 1970-01-01
相关资源
最近更新 更多