【问题标题】:Apache Camel: MailMessage email Headers are emptyApache Camel:MailMessage 电子邮件标头为空
【发布时间】:2014-02-04 17:11:05
【问题描述】:

我是 Apache 骆驼的新手。我们正在使用 Apache camel 2.11.0 轮询 microsoft exchange Indox,使用 POP3 作为 FROM 端点,并创建一个 bean 类来处理路由中的电子邮件消息,然后再将其发送到目标端点。我遇到的问题是从处理器方法中的 Exchange.getIn(MailMessage.class).getMessage() 返回的 MailMessage 对象没有任何电子邮件标头。当我在 FROM 端点上放置一个调试选项时,我可以在 Apache 骆驼跟踪中看到接收电子邮件的电子邮件标头。非常感谢您的帮助。

路由配置

<!-- Route email exchange-->
    <route id="gateMail">
        <from uri="pop3://MyUser@MyMailServer.com?password=MyPassword&amp;debugMode=true&amp;contentType=multipart/alternative" />
        <bean ref="MailProcessor" />            
        <to uri="file:D:/Mail" /></route>

在本地主机 [Apache Tomcat] c:\Program Files\Java\jdk1.7.0_21\bin\Javaw.exe 的 Tomcat v7.0 Server 控制台中输出

DEBUG POP3: pipeline message size 2243 S: +OK Received: by MyMailServer.com id <01CF1183.AA71B3C0@MyMailServer.com>; Wed, 15 Jan 2014 10:52:21 +1100 x-protective-marking: VER=2005.6, NS=com.au, SEC=UNCLASSIFIED:AUDIT, ORIGIN=MyUser@MyMailServer.com x-titus-version: 3.3.8.1 x-tituslabs-classifications-30: TLPropertyRoot=Titus;Classification=UNCLASSIFIED;Precedence=ROUTINE;Privacy=AUDIT; x-tituslabs-classificationhash-30: YifyyqlCDo9l8ySQLTGzHX5c15nHvPqznjIb8keFNu8UEVGWAssd6R0LjeoelHoKfBmfwLv3tDicWe12NsuQFLTSJLlcdr56aL59f1GzpTBosa6XLoHlIutAnNQcPA+xRA5fzirrVFmPv2jTtl8Bqp30thtdKQvwpzqD/KcGI3vS033ldtUOzAF1+/gwx9zL+SBDwxSwUor1ihlW6uCx36tFLjtDF7M9GjKi5Cd/jUFyjCypZnCyZkCmSjvL9iG/ Content-class: urn:content-classes:message Subject: Test Design [SEC=UNCLASSIFIED:AUDIT] MIME-Version: 1.0 Content-Type: multipart/alternative;

Bean 类代码

 public class MailProcessor implements Processor {

public void process(Exchange exch) throws Exception {
    String filename = exch.getIn().getHeader(Exchange.BREADCRUMB_ID,String.class);
    POP3Message mailMSG = (POP3Message)exch.getIn(MailMessage.class).getMessage();
    String mailTo = getRecipients(mailMSG);
    String from = this.getFrom(mailMSG);`enter code here`
    String subject = mailMSG.getSubject();
    String headers = GetHeaders(mailMSG);
    String body = this.getText(mailMSG);
    Map<String, DataHandler> attachments = exch.getIn().getAttachments();
    String attFileName = "";
    if(attachments.size() > 0)
    {
        for(String name: attachments.keySet())
        {
            DataHandler dh = attachments.get(name);
            attFileName = attFileName + "; " + dh.getName();
        }
    }
    String strMessage = (" ----------- From:" + from  + " ----------- To:" + mailTo  
            + " ----------- Subject:" + subject + " ----------- Attchements:" + attFileName + 
            " ----------- Header:" + headers +" ----------- Body:" + body);
    File mailFile = new File("D:\\IOI\\Mail\\" + filename + ".txt");
    BufferedWriter writer = new BufferedWriter(new FileWriter(mailFile));
    writer.write(strMessage);
    writer.close();
}

private String getText(Part p) throws
    MessagingException, IOException 
{

if (p.isMimeType("text/*")) {
String s = (String)p.getContent();
return s;
}

if (p.isMimeType("multipart/alternative")) {
// prefer html text over plain text
Multipart mp = (Multipart)p.getContent();
String text = null;
Part bp = null; 
for (int i = 0; i < mp.getCount(); i++) {
    bp = mp.getBodyPart(i);
    if (bp.isMimeType("text/plain")) {
        if (text == null)
            text = getText(bp);
        continue;
    } else if (bp.isMimeType("text/html")) {
        String s = getText(bp);
        if (s != null)
            return s;
    } else {
        return getText(bp);
    }
}
return text;
} else if (p.isMimeType("multipart/*")) {
Multipart mp = (Multipart)p.getContent();
for (int i = 0; i < mp.getCount(); i++) {
    String s = getText(mp.getBodyPart(i));
    if (s != null)
        return s;
}
}
return null;
}

private String GetHeaders(Part p) 
        throws MessagingException
{
    Enumeration<?> headers = p.getAllHeaders();
        //Get the mail Header
        String strHeader = "";
        while(headers.hasMoreElements())
            {
                Header h = (Header)headers.nextElement();   
                strHeader = strHeader + "-" + h.getName() + " : " + h.getValue();
            }
        return strHeader;
}
private String getRecipients(Message msg)
        throws MessagingException
      {
        javax.mail.Address[] addrs = msg.getRecipients(Message.RecipientType.TO);
        if (addrs == null || addrs.length == 0)
            return null;

        String str = "";
        for (int i = 0; i < addrs.length; i++) {
            if (i != 0)
                str += ", ";
            String text = addrs[i].toString();
            str += removeChars(text);
        }

        return str;
      }
private String getFrom(Message msg)
        throws MessagingException
      {
        javax.mail.Address[] addrs = msg.getFrom();
        if (addrs == null || addrs.length == 0)
            return null;

        String str = "";
        for (int i = 0; i < addrs.length; i++) {
            if (i != 0)
                str += ", ";
            String text = addrs[i].toString();
            str += removeChars(text);
        }

        return str;
      }
private String removeChars(String text)
  {
    if (text == null)
        return null;

    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < text.length(); i++) {
        char c = text.charAt(i);
        if (c == '<' || c == '>' || c == '\'' || c == '\"' || c == '&')
            buf.append(' ');
        else
            buf.append(c);
    }
    return buf.toString();
  }}

谢谢 苏尼尔

【问题讨论】:

  • 你试过exchange.getIn(MailMessage.class).getAllHeaders()吗?
  • 感谢您的快速回复,我在 exchange.getIn(MailMessage.class) 中找不到 getAllHeaders() 方法,所以我使用了 getHeaders() 并且观察输出仅显示一个标题 {breadcrumbId=ID -MyServer-2394-1389906921689-0-1} 。我已经更新了帖子,提供了一些可能有助于您调试问题的更多信息。

标签: apache-camel


【解决方案1】:

我遇到了同样的问题,原因是库 javax.mail 的冲突,这是 camel-mail 的传递依赖,也是我项目中的另一个库的传递依赖。
要解决此问题,您必须排除冲突的依赖项。

查找与 Maven 冲突的依赖项

运行以下命令并检查 javax.mail 是否被列为另一个依赖项的传递依赖项。
请注意,其他依赖项可能会导入 javax.mail 上存在的相同类,但依赖项不同,这可能会导致相同的问题。
就我而言,这发生在org.apache.geronimo.specs:geronimo-javamail_1.4_spec

mvn dependency:tree -Dverbose

输出sn-p:

[INFO] +- org.apache.neethi:neethi:jar:2.0.4:compile
[INFO] |  +- org.apache.ws.commons.axiom:axiom-api:jar:1.2.7:compile
[INFO] |  |  +- org.apache.geronimo.specs:geronimo-javamail_1.4_spec:jar:1.2:compile

用 Maven 排除依赖

现在您已经找到了哪个依赖项导入了冲突的传递依赖项,请将排除项添加到您的 pom。

    <dependency>
      <groupId>org.apache.neethi</groupId>
      <artifactId>neethi</artifactId>
      <version>${version}</version>
      <exclusions>
        <exclusion>
          <groupId>org.apache.geronimo.specs</groupId>
          <artifactId>geronimo-javamail_1.4_spec</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2019-02-04
    • 2016-12-18
    • 2017-09-01
    • 2020-11-23
    • 2014-08-23
    • 2014-10-07
    相关资源
    最近更新 更多