当前位置: 首页 > 知识库问答 >
问题:

Apache Camel:MailMessage电子邮件头为空

钮鸿煊
2023-03-14

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

路由配置

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

共有1个答案

权兴为
2023-03-14

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

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

mvn dependency:tree -Dverbose

输出片段:

[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

既然您已经找到了哪个依赖项导入了冲突的传递依赖项,请将排除添加到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>
 类似资料:
  • 查看以下,详细了解如何处理与 iPhone 手机配对的 M600 上的电子邮件。 阅读您的 M600 上的电子邮件 如果您在手机上使用电子邮件通知,那么在您收到新邮件时会在您的 M600 看到通知。 阅读电子邮件 轻触通知。 利用您的 M600 回复电子邮件 您可以利用您的手腕表回复邮件。 回复电子邮件 轻触通知查看所有邮件 从屏幕底部向上滑动,查看您可以执行的操作。 轻触 Reply(回复),并

  • Email的历史比Web还要久远,直到现在,Email也是互联网上应用非常广泛的服务。 几乎所有的编程语言都支持发送和接收电子邮件,但是,先等等,在我们开始编写代码之前,有必要搞清楚电子邮件是如何在互联网上运作的。 我们来看看传统邮件是如何运作的。假设你现在在北京,要给一个香港的朋友发一封信,怎么做呢? 首先你得写好信,装进信封,写上地址,贴上邮票,然后就近找个邮局,把信仍进去。 信件会从就近的小

  • Email的历史比Web还要久远,直到现在,Email也是互联网上应用非常广泛的服务。 几乎所有的编程语言都支持发送和接收电子邮件,但是,先等等,在我们开始编写代码之前,有必要搞清楚电子邮件是如何在互联网上运作的。 我们来看看传统邮件是如何运作的。假设你现在在北京,要给一个香港的朋友发一封信,怎么做呢? 首先你得写好信,装进信封,写上地址,贴上邮票,然后就近找个邮局,把信仍进去。 信件会从就近的小

  • 问题内容: 我正在使用sendgrid发送电子邮件,并且使用以下代码可以正常工作,但没有附件。 但是我需要发送附件,因此我搜索了github源和Web文档API,由于某种原因,没有javadocs,但是有一个示例GitHub sendgrid, 所以我一直在尝试直到它起作用为止,我缩小了一些异常和响应代码,起初我是被禁止的未经授权,最好是响应202,表示有效且已排队(在此处检查),这是我的代码发送

  • 要使用Erlang发送电子邮件,您需要使用github提供的相同包。 github链接是 - https://github.com/Vagabond/gen_smtp 此链接包含一个smtp utility ,可用于从Erlang应用程序发送电子邮件。 按照步骤,可以从Erlang发送电子邮件 Step 1 - 从github site下载erl files 。 应将这些文件下载到hellowor

  • 问题内容: 我在应用程序中使用了android-parse服务器。下面是解析email列的db屏幕截图。电子邮件列在数据库中隐藏密码列之后。 我的问题是 当我将电子邮件ID检索到电子邮件客户端时,即使电子邮件列中包含电子邮件,电子邮件也为null 。 注意:在另一个地方(另一个表)的应用程序中,我以相同的方式将电子邮件ID拉到电子邮件客户端,但是邮件显示得很好..仅在这里出现问题。 如果有人知道请