【问题标题】:Mime Message could not be parsed无法解析 Mime 消息
【发布时间】:2015-11-07 18:12:12
【问题描述】:

我有以下 mime 消息:

Return-Path: <some@adress.com>
X-Original-To: some@adress.com
Delivered-To: some@adress.com
Received: from localhost [127.0.0.1]
    by unify-prod with POP3 (fetchmail-6.3.21)
    for <other@localhost> (single-drop); Mon, 03 Aug 2015 12:42:24+0000 (UTC)
Received: from testdomain.com (testdomain.com [192.69.176.183])
    by unify.test.com (Postfix) with ESMTPS id AA3874330B
    for <test@test.com>; Mon,  3 Aug 2015 12:42:23 +0000 (UTC)
 Received: from test.call (test.call [10.3.1.49])
    by test.com (Postfix) with ESMTP id 56EC73BA8C4
    for <test@test.com>; Mon,  3 Aug 2015 12:42:23 +0000 (UTC)
Date: Mon, 3 Aug 2015 12:42:23 +0000 (UTC)
From: test@test.com
To: test@test.com
Message-ID: <385098705.398991.1438605743348.JavaMail.sd@sdapp04>
Subject: Update
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit



|0004625641|
|630805367|
|NA14220388|
|03.08.2015 14:42:23|


||

我想用这段代码解析 grails 中的消息:

InputStream mailFileInputStream = new FileInputStream("/home/peter/test.msg");
    Properties props = new Properties();
    Session session = Session.getDefaultInstance(props, null);
    MimeMessage message = new MimeMessage(session, mailFileInputStream);

    MimeMessageParser parser = new MimeMessageParser(message)
    parser.parse()


    def data = [:]
    data.from = parser.getFrom()
    data.to = parser.getTo()
    data.replyTo = parser.getReplyTo()
    data.html = parser.getHtmlContent()
    data.plain = parser.getPlainContent()
    data.subject = parser.getSubject()
    data.attachments = parser.getAttachmentList()

但是消息没有被正确解析。整个消息都是纯内容。这条消息有什么问题?

最好的问候, 彼得

【问题讨论】:

    标签: grails mime-mail


    【解决方案1】:

    当我试图解析消息时,我得到了这个异常:

    java.lang.ClassCastException: javax.mail.util.SharedByteArrayInputStream cannot be cast to java.lang.String
        at org.apache.commons.mail.util.MimeMessageParser.parse(MimeMessageParser.java:181)
        at org.apache.commons.mail.util.MimeMessageParser.parse(MimeMessageParser.java:96)
        at org.apache.commons.mail.util.MimeMessageParser$parse.call(Unknown Source)
    

    问题在于MimeMessageParser 试图将Object 强制转换为String。您可以在第 181 行的 source code 中看到这一点。该对象是 javax.mail.util.SharedByteArrayInputStream 的一个实例,它不会通过强制返回内容。我的示例使用 StringBufferInputStream 作为输入,因此这可能会导致问题。

    解决方法

    为了解决这个问题,我覆盖了 MimeMessage.getContent() 以便它返回纯文本内容。所以很明显,不要对非纯文本内容执行此操作。这是完整的脚本:

    @Grab('org.apache.commons:commons-email:1.4')
    
    import javax.mail.Session
    import javax.mail.internet.MimeMessage
    import org.apache.commons.mail.util.MimeMessageParser
    
    def input = '''Return-Path: <some@adress.com>
    X-Original-To: some@adress.com
    Delivered-To: some@adress.com
    Received: from localhost [127.0.0.1]
        by unify-prod with POP3 (fetchmail-6.3.21)
        for <other@localhost> (single-drop); Mon, 03 Aug 2015 12:42:24+0000 (UTC)
    Received: from testdomain.com (testdomain.com [192.69.176.183])
        by unify.test.com (Postfix) with ESMTPS id AA3874330B
        for <test@test.com>; Mon,  3 Aug 2015 12:42:23 +0000 (UTC)
     Received: from test.call (test.call [10.3.1.49])
        by test.com (Postfix) with ESMTP id 56EC73BA8C4
        for <test@test.com>; Mon,  3 Aug 2015 12:42:23 +0000 (UTC)
    Date: Mon, 3 Aug 2015 12:42:23 +0000 (UTC)
    From: test@test.com
    To: test@test.com
    Message-ID: <385098705.398991.1438605743348.JavaMail.sd@sdapp04>
    Subject: Update
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 7bit
    
    
    
    |0004625641|
    |630805367|
    |NA14220388|
    |03.08.2015 14:42:23|
    
    
    ||'''
    
    // Creates a MimeMessage that makes MimeMessageParser happy.
    MimeMessage createMimeMessage(InputStream stream) {
        def getContent = MimeMessage.metaClass.getMetaMethod('getContent')
        def message = new MimeMessage(
            Session.getDefaultInstance(new Properties()), 
            stream)
    
        /*
         * Override MimeMessage.getContent()
         * to coerce SharedByteArrayInputStream
         * into a String. Groovy does it automatically :)
         */
        message.metaClass.getContent = {
            getContent.invoke(delegate)
        }
    
        return message
    }
    
    def message = createMimeMessage(new StringBufferInputStream(input))
    def parser = new MimeMessageParser(message)
    
    parser.parse()
    
    def data = parser.with {
        [
            from: from,
            to: to,
            replyTo: replyTo,
            html: htmlContent,
            plain: plainContent,
            subject: subject,
            attachments: attachmentList,
        ]
    }
    
    assert data.from == 'test@test.com'
    assert data.to instanceof List
    assert data.replyTo == 'test@test.com'
    assert data.html == null
    assert data.attachments == []
    assert data.plain instanceof String
    

    数据地图包含以下内容:

    [from:test@test.com, to:[test@test.com], replyTo:test@test.com, html:null, plain:
    
    |0004625641|
    |630805367|
    |NA14220388|
    |03.08.2015 14:42:23|
    
    
    ||, subject:Update, attachments:[]]
    

    【讨论】:

      【解决方案2】:

      从 java 邮件 api 试试下面:

      import javax.mail.internet.*;
      import javax.mail.*;
      
      def message = '''Return-Path: <some@adress.com>
      X-Original-To: some@adress.com
      Delivered-To: some@adress.com
      Received: from localhost [127.0.0.1]
          by unify-prod with POP3 (fetchmail-6.3.21)
          for <other@localhost> (single-drop); Mon, 03 Aug 2015 12:42:24+0000 (UTC)
      Received: from testdomain.com (testdomain.com [192.69.176.183])
      
          by unify.test.com (Postfix) with ESMTPS id AA3874330B
          for <test@test.com>; Mon,  3 Aug 2015 12:42:23 +0000 (UTC)
       Received: from test.call (test.call [10.3.1.49])
          by test.com (Postfix) with ESMTP id 56EC73BA8C4
          for <test@test.com>; Mon,  3 Aug 2015 12:42:23 +0000 (UTC)
      Date: Mon, 3 Aug 2015 12:42:23 +0000 (UTC)
      From: test@test.com
      To: test@test.com
      Message-ID: <385098705.398991.1438605743348.JavaMail.sd@sdapp04>
      Subject: Update
      MIME-Version: 1.0
      Content-Type: text/plain; charset=UTF-8
      Content-Transfer-Encoding: 7bit
      
      
      
      |0004625641|
      |630805367|
      |NA14220388|
      |03.08.2015 14:42:23|
      
      
      ||'''
      
      InputStream mailFileInputStream = new FileInputStream(message);    
      Properties props = new Properties();     
      Session session = Session.getDefaultInstance(props, null);    
      MimeMessage message1 = new MimeMessage(session, mailFileInputStream);     
      
      message1.getFrom()println "-----data--${message1.getRecipients()}----${message1.getAllHeaders()}"​​​​​​​​​​​
      

      这一定是给的

      java.security.AccessControlException: access denied ("java.io.FilePermission" 
      

      关注java.security.AccessControlException: Access denied (java.io.FilePermission即可解决

      【讨论】:

        猜你喜欢
        • 2011-01-06
        • 2010-11-05
        • 2013-02-09
        • 2012-02-24
        • 2012-06-19
        • 2012-02-21
        • 2014-10-29
        • 1970-01-01
        相关资源
        最近更新 更多