2

我有下面的 groovy 代码,它检查字节 [] 的 mime 类型,下面的 apache 引用是apache-mime4j-0.6.jar

import org.apache.james.mime4j.message.Message
import org.apache.james.mime4j.message.Multipart
import org.apache.james.mime4j.message.BodyPart

def processFiledata(filedata){
    Message file = new Message(new ByteArrayInputStream(fileData));
    for (BodyPart part : ((Multipart) file.getBody()).getBodyParts()) {
        if (part.getMimeType().equalsIgnoreCase("text/plain")) { //exception is thrown from this line
            //some logic
        }
}

这段代码曾经可以工作,但我不确定为什么现在它会抛出异常

    java.lang.ClassCastException: org.apache.james.mime4j.field.UnstructuredField cannot be cast to org.apache.james.mime4j.field.ContentTypeField
    at org.apache.james.mime4j.message.Entity.getMimeType(Entity.java:289)

下面是我的示例 mime 消息,正在读取ByteArrayInputStream并尝试解析其 mime 类型

MIME-Version: 1.0
Date: Tue, 28 Feb 2017 21:54:17 +1
Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg="SHA256"; boundary="b2971ac914bc41038c7e8412fee3c44c"


--b2971ac914bc41038c7e8412fee3c44c
Content-Type: text/plain; charset=us-ascii

LEDES98BI V2[]
INVOICE_DATE|INVOICE_NUMBER|CLIENT_ID|LAW_FIRM_MATTER_ID|INVOICE_TOTAL|BILLING_START_DATE|BILLING_END_DATE|INVOICE_DESCRIPTION|LINE_ITEM_NUMBER|EXP/FEE/INV_ADJ_TYPE|LINE_ITEM_NUMBER_OF_UNITS|LINE_ITEM_ADJUSTMENT_AMOUNT|LINE_ITEM_TOTAL|LINE_ITEM_DATE|LINE_ITEM_TASK_CODE|LINE_ITEM_EXPENSE_CODE|LINE_ITEM_ACTIVITY_CODE|TIMEKEEPER_ID|LINE_ITEM_DESCRIPTION|LAW_FIRM_ID|LINE_ITEM_UNIT_COST|TIMEKEEPER_NAME|TIMEKEEPER_CLASSIFICATION|CLIENT_MATTER_ID|PO_NUMBER|CLIENT_TAX_ID|MATTER_NAME|INVOICE_TAX_TOTAL|INVOICE_NET_TOTAL|INVOICE_CURRENCY|TIMEKEEPER_LAST_NAME|TIMEKEEPER_FIRST_NAME|ACCOUNT_TYPE|LAW_FIRM_NAME|LAW_FIRM_ADDRESS_1|LAW_FIRM_ADDRESS_2|LAW_FIRM_CITY|LAW_FIRM_STATEorREGION|LAW_FIRM_POSTCODE|LAW_FIRM_COUNTRY|CLIENT_NAME|CLIENT_ADDRESS_1|CLIENT_ADDRESS_2|CLIENT_CITY|CLIENT_STATEorREGION|CLIENT_POSTCODE|CLIENT_COUNTRY|LINE_ITEM_TAX_RATE|LINE_ITEM_TAX_TOTAL|LINE_ITEM_TAX_TYPE|INVOICE_REPORTED_TAX_TOTAL|INVOICE_TAX_CURRENCY[]
19990225|96542|00711|0528|1684.45|19990101|19990131|For services rendered|1|F|2.00|-70|630|19990115|L510||A102|22547|Research Attorney's fees, Set off claim|24-6437381|350|Arnsley, Robert|PARTNR|423-987|77654|76-1235|Merten Merger|694.20|22240.25|GBP|Arnsley|Robert|O|||||||||||||||.16|100.80|VAT|100.80|[]
--b2971ac914bc41038c7e8412fee3c44c
Content-Transfer-Encoding: base64
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Disposition: attachment; filename="smime.p7s"

有人可以帮我解决吗?

4

1 回答 1

1

对我来说,这看起来像是一个 mime4j 错误,因此按照评论中的要求,我建议升级到非常不同的“新”版本 0.7.2(还有一个即将推出的 0.8 版本),这是一个示例。

您不再构建对象,如使用页面Message中所述,有 2 种不同的样式,我选择了第二种,因为我更清楚如何获取身体部位的 mime 类型:

def fileInputStream = new FileInputStream("/path/to/message.msg");
def parser = new MimeStreamParser();
parser.setContentHandler(new AbstractContentHandler() {
    void body(BodyDescriptor bd, InputStream is) {
        if ("text/plain".equals(bd.getMimeType())) {
            println("Body: " + is.text);
        }
    }
})
parser.parse(fileInputStream);

如果我在以下示例消息文件上运行它(由MSDN提供):

From: John Doe <example@example.com>
MIME-Version: 1.0
Content-Type: multipart/mixed;
        boundary="XXXXboundary text"

This is a multipart message in MIME format.

--XXXXboundary text 
Content-Type: text/plain

this is the body text

--XXXXboundary text 
Content-Type: text/plain;
Content-Disposition: attachment;
        filename="test.txt"

this is the attachment text

--XXXXboundary text--

我得到:

Body: this is the body text

Body: this is the attachment text

希望该版本中修复了该错误(如果有)。如果您仍然遇到问题,我们将需要获取有关文件结构内容的更多信息。

编辑:使用您提供的输入,上述工作,并给出:

Body: LEDES98BI V2[]
INVOICE_DATE|INVOICE_NUMBER|CLIENT_ID|LAW_FIRM_MATTER_ID|INVOICE_TOTAL|BILLING_START_DATE|BILLING_END_DATE|INVOICE_DESCRIPTION|LINE_ITEM_NUMBER|EXP/FEE/INV_ADJ_TYPE|LINE_ITEM_NUMBER_OF_UNITS|LINE_ITEM_ADJUSTMENT_AMOUNT|LINE_ITEM_TOTAL|LINE_ITEM_DATE|LINE_ITEM_TASK_CODE|LINE_ITEM_EXPENSE_CODE|LINE_ITEM_ACTIVITY_CODE|TIMEKEEPER_ID|LINE_ITEM_DESCRIPTION|LAW_FIRM_ID|LINE_ITEM_UNIT_COST|TIMEKEEPER_NAME|TIMEKEEPER_CLASSIFICATION|CLIENT_MATTER_ID|PO_NUMBER|CLIENT_TAX_ID|MATTER_NAME|INVOICE_TAX_TOTAL|INVOICE_NET_TOTAL|INVOICE_CURRENCY|TIMEKEEPER_LAST_NAME|TIMEKEEPER_FIRST_NAME|ACCOUNT_TYPE|LAW_FIRM_NAME|LAW_FIRM_ADDRESS_1|LAW_FIRM_ADDRESS_2|LAW_FIRM_CITY|LAW_FIRM_STATEorREGION|LAW_FIRM_POSTCODE|LAW_FIRM_COUNTRY|CLIENT_NAME|CLIENT_ADDRESS_1|CLIENT_ADDRESS_2|CLIENT_CITY|CLIENT_STATEorREGION|CLIENT_POSTCODE|CLIENT_COUNTRY|LINE_ITEM_TAX_RATE|LINE_ITEM_TAX_TOTAL|LINE_ITEM_TAX_TYPE|INVOICE_REPORTED_TAX_TOTAL|INVOICE_TAX_CURRENCY[]
19990225|96542|00711|0528|1684.45|19990101|19990131|For services rendered|1|F|2.00|-70|630|19990115|L510||A102|22547|Research Attorney's fees, Set off claim|24-6437381|350|Arnsley, Robert|PARTNR|423-987|77654|76-1235|Merten Merger|694.20|22240.25|GBP|Arnsley|Robert|O|||||||||||||||.16|100.80|VAT|100.80|[]
于 2017-05-16T07:10:29.437 回答