以字符串形式获取 MimeMessage 内容

Posted

技术标签:

【中文标题】以字符串形式获取 MimeMessage 内容【英文标题】:Get MimeMessage Content as String 【发布时间】:2016-02-20 05:59:47 【问题描述】:

我一直在寻找和尝试这个,所以我需要你的帮助。 我有一个接收 html 电子邮件的服务器。在那之后,我想得到它的部分(标题、主题和正文部分)。 获取标题和主题是没有问题的,但是内容是。

这是我获取 SmtpMessage 的代码:

private SmsItem getEmailData(SmtpMessage msg) throws MessagingException, IOException 
        String to = msg.getHeaderValue("To");
        String from = msg.getHeaderValue("From");
        String content = null;
        LOG.info("Mail from: " + from + " to: " + to);

        String toNr;
        Pattern mobileNr = Pattern.compile("(\\+?[0-9]+)@*");
        Matcher matcher = mobileNr.matcher(to);
        if (matcher.find()) 
            toNr = Utils.processAddress(matcher.group(1));
         else 
            throw new RuntimeException("Illegal address to send SMS from mail: " + to);
        

        Pattern fromMail = Pattern.compile("\\<+([a-zA-Z0-9@.-]*)\\>+");
        matcher = fromMail.matcher(from);
        if(matcher.find())
            from = matcher.group(1);
            LOG.info(from);
        else
            throw new RuntimeException("Ilegal From Address: " + from);
        

现在我正在获取内容本身:

Session s = Session.getDefaultInstance(new Properties());
        String ip = msg.toString();
        ip = MimeUtility.decodeText(ip);
        InputStream is = new ByteArrayInputStream(ip.getBytes("ISO-8859-1"));
        MimeMessage mi = new MimeMessage(s, is);

        Object message = mi.getContent();
        String test = mi.getContent().toString();
        test.toString();

现在我有一个如下所示的字符串: javax.mail.internet.MimeMultipart@4edfc9bb

但是当我这样写出来时:

((Multipart) message).writeTo(System.out);

我在可以看到我想要的内容的地方得到这个:

This is a multi-part message in MIME format.--------------010600010509000401060604Content-Type: text/plain; charset=utf-8; format=flowedContent-Transfer-Encoding: 7bit
*asdasd ad asd asddfgdfgsdfsd:-)*
  asdsad
javax.mail.MessagingException: Empty multipart: multipart/alternative;
    at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:548)
    at ...

但它不能为空对吧? 我正在尝试获取这样的内容:

if (message instanceof String)
        
            message = (String)message;
            LOG.info("String");
        
        else if (message instanceof Multipart)
           
            Multipart mp = (Multipart)message;
            LOG.info("Count: " + mp.getCount() + mp.getParent() + test.toString());
            for (int i = 0; i < mp.getCount(); i++)
                LOG.info("Multipart");
                LOG.info(i + ". " + mp.getBodyPart(i).toString());
                BodyPart bp = mp.getBodyPart(i);
                String dp = bp.getDisposition();

                if(dp != null)
                    LOG.error("Something's wrong");
                else if(dp.equalsIgnoreCase("ATTACHMENT"))
                    LOG.error("Attachment dürfen nicht mitgegeben werden!");
                else
                    content = bp.getContent().toString();
                
            
        

我真的需要完成这件事,我在互联网上搜索了很长时间..

【问题讨论】:

【参考方案1】:

使用commons-email可以得到如下内容

MimeMessageParser parser = new MimeMessageParser(yourMimeMessage);
parser.parse();

String htmlContent = parser.getHtmlContent();
// or
String plainContent = parser.getPlainContent();

【讨论】:

这将是一个好主意,谢谢。但最好还是用我有的东西来做 我没有使用 gradle 将 commons-email 添加到我的 android 项目中的这种方法。我将此添加到我的项目中:编译“commons-io:commons-io:+” @DineshVG 将来自 Apache Commons 的 commons-email 添加到您的依赖项中。见:mvnrepository.com/artifact/org.apache.commons/commons-email/1.4 嗨@Daniel,谢谢你,但我遇到了在使用WSO2时定义解析器类的问题。 message.writeTo(System.out);这解决了我的问题【参考方案2】:

您可以使用Simple Java Mail(开源)将 MimeMessage 转换为电子邮件对象,然后访问所有内容,包括附件和嵌入的图像、收件人、html、文本和标题:

Email email = EmailConverter.mimeMessageToEmail(mimeMessage);

从这里您可以轻松访问电子邮件的所有不同项目。

【讨论】:

以上是关于以字符串形式获取 MimeMessage 内容的主要内容,如果未能解决你的问题,请参考以下文章

来自 Gmail API 流的 MimeMessage.Load

MimeMessage 正文更长 76 个字符

js 获取表单内容

我以元组形式获取 SELECT mysql 值。如何以字符串形式获取它?

以字符串形式获取对象属性名称

以 JSON 字符串数组形式获取 AFNetworking 响应的结果