简体   繁体   English

通过 apache common java api 转发带有附件的电子邮件(使用 JavaMailApi 读取)

[英]Forward an email(read using JavaMailApi) with Attachments by apache common java api

I'm reading messages from an Outlook webmail and getting a list of Messages('javax.mail.Message').我正在阅读来自 Outlook 网络邮件的邮件并获取邮件列表('javax.mail.Message')。 Now I want to forward these Messages to another email address using a java program.现在我想使用 java 程序将这些消息转发到另一个 email 地址。

    private void sendTestMail(String from, String subject, String sentDate, Object object, Message message)
            throws EmailException, Exception {

        MultiPartEmail email = new MultiPartEmail();
        email.setHostName(forwardHost);

        email.addTo(mailRecipients(to));
        email.setFrom(emailFrom);
        email.setSubject(subject);
        email.setMsg("Testing email by sahil.");

        EmailAttachment attachment = new EmailAttachment();
        attachment.setPath("c:\\sahil\\test.jpg");
        attachment.setDisposition(EmailAttachment.ATTACHMENT);
        attachment.setDescription("Picture_of_John");
        attachment.setName("John.jpg");
        email.attach(attachment);  


        MimeMultipart multiPart = getMimeMultipart(message);
        email.addPart(multiPart);

        email.send();
    }   

If I comment below two lines in above code then it works fine.如果我在上面的代码中的两行下面评论,那么它工作正常。

MimeMultipart multiPart = getMimeMultipart(message);
email.addPart(multiPart);

But with these two line I'm getting exception.但是有了这两行,我得到了例外。

2020-04-20 15:41:44,271 ERROR com.st.ict.ols.service.impl.ReplyToMessageServiceImpl [main]  Inner Exception occurred while processing individual message. Error stacktrace is[org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtpapp1.sgp.st.com:25
    at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1421)
    at org.apache.commons.mail.Email.send(Email.java:1448)
    at com.st.ict.ols.service.impl.ReplyToMessageServiceImpl.sendTestMail(ReplyToMessageServiceImpl.java:342)
    at com.st.ict.ols.service.impl.ReplyToMessageServiceImpl.processMessage(ReplyToMessageServiceImpl.java:167)
    at com.st.ict.ols.service.impl.MessageServiceImpl.processMessage(MessageServiceImpl.java:22)
    at com.st.ict.ols.OlsMailSenderApplication.run(OlsMailSenderApplication.java:36)
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:732)
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:716)
    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:703)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:304)
    at com.st.ict.ols.OlsMailSenderApplication.main(OlsMailSenderApplication.java:27)
Caused by: javax.mail.MessagingException: IOException while sending message;
  nested exception is:
    java.io.IOException: Exception writing Multipart
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1308)
    at javax.mail.Transport.send0(Transport.java:255)
    at javax.mail.Transport.send(Transport.java:124)
    at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1411)
    ... 10 more
Caused by: java.io.IOException: Exception writing Multipart
    at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:83)
    at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:884)
    at javax.activation.DataHandler.writeTo(DataHandler.java:317)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1652)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:961)
    at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:553)
    at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:81)
    at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:884)
    at javax.activation.DataHandler.writeTo(DataHandler.java:317)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1652)
    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1850)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1259)
    ... 13 more
Caused by: javax.mail.MessagingException: Empty multipart: multipart/mixed; 
    boundary="----=_Part_1_1176580790.1587377502798"
    at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:548)
    at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:81)
    ... 24 more

Code I've written to retrieve MimeMultipart from JavaMailApi's Message object to set in apache common's org.apache.commons.mail.MultiPartEmail Object using attach function. Code I've written to retrieve MimeMultipart from JavaMailApi's Message object to set in apache common's org.apache.commons.mail.MultiPartEmail Object using attach function.

    public MimeMultipart getMimeMultipart(Message message) throws Exception {
        Object content = message.getContent();
        if (content instanceof String)
            return null;        

        if (content instanceof MimeMultipart) {
            MimeMultipart multiPartResult = new MimeMultipart();
            MimeMultipart multiPart = (MimeMultipart) content;

            List<BodyPart> result = new ArrayList<>();
            for (int i = 0; i < multiPart.getCount(); i++) {
                BodyPart bodyPart = (BodyPart) multiPart.getBodyPart(i);
                result.addAll(getMimeMultipart(bodyPart));
            }
            for(BodyPart part:result) {
                multiPart.addBodyPart(part);
            }
            return multiPartResult;

        }
        return null;
    }

    private List<BodyPart> getMimeMultipart(BodyPart part) throws Exception{
        List<BodyPart> result = new ArrayList<>();
        Object content = part.getContent();

        if (content instanceof InputStream || content instanceof String) {
            if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition()) || StringUtils.isNotBlank(part.getFileName())) {
                result.add(part);
            }
            return result;
        }

        if (content instanceof MimeMultipart) {
                MimeMultipart multipart = (MimeMultipart) content;
                for (int i = 0; i < multipart.getCount(); i++) {
                    BodyPart bodyPart =  (BodyPart) multipart.getBodyPart(i);
                    result.addAll(getMimeMultipart(bodyPart));
                }
        }
        return result;
    }

I was able to forward email excluding attachments but facing issues forwarding with attachments/inline images.我能够转发 email 不包括附件,但在转发附件/内联图像时遇到问题。
Please help me with this issue.请帮我解决这个问题。

I'm able to forward the complete message as an attachment, how to forward the message as it is.我能够将完整的邮件作为附件转发,如何按原样转发邮件。

MultiPartEmail email = new MultiPartEmail();
MimeMultipart mp = new MimeMultipart();
MimeBodyPart fmbp = new MimeBodyPart();
fmbp.setContent(message, "message/rfc822");
fmbp.setDisposition(Part.INLINE);
mp.addBodyPart(fmbp);
email.setContent(mp);

or if I use code或者如果我使用代码

MimeMultipart mp = (MimeMultipart) message.getContent();
email.setContent(mp, message.getContentType());

I'm getting forwarded email like this screenshot of forwarded encoded mail我正在转发 email 就像转发编码邮件的截图一样

Here the situation is reading mail from one mail server and sending the same message to another email id, within same application.这里的情况是从一个邮件服务器读取邮件并将相同的消息发送到同一应用程序中的另一个 email id。

To achieve this, I used Java Mail API for both reading and sending.为此,我使用 Java 邮件 API 进行读取和发送。 Make sure to update the properties if you're using different host for both steps.如果您在两个步骤中使用不同的主机,请确保更新属性。

    private void sendMailJavax(Message oldMessage) {
        try { 
            // creating a new message using the older message
            MimeMessage message = new MimeMessage((MimeMessage)oldMessage);
            // updating properties as per sender Mailing API
            message.getSession().getProperties().clear();
            message.getSession().getProperties().setProperty("mail.smtp.host", forwardHost);

            // setting appropriate headers. // make sure you don't append using .add methods.
            message.setFrom(new InternetAddress(emailFrom));
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
            message.setReplyTo(new Address[] { new InternetAddress(replyToEmail)});

            Transport.send(message); 
            System.out.println("Email Sent  successfully...."); 
            } catch (MessagingException mex) { 
                mex.printStackTrace(); 
            } 
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用Python转发带有附件的电子邮件 - How to forward an email with attachments using Python 无法使用imap和smtplib转发带有附件的电子邮件 - Cannot forward an email with attachments using imap and smtplib 如何使用 OutputStream 在 Java 中向电子邮件添加附件? - How to add attachments to email in Java using OutputStream? 使用带有 HTML 正文和电子邮件附件的 imaplib 在 python 3.7 中阅读电子邮件 - Read email in python 3.7 using imaplib with HTML body and attachments in the email 在Java中下载电子邮件附件 - Downloading email attachments in java Python-转发带有附件的IMAP电子邮件(imaplib,smtplib) - Python - Forward IMAP Email with Attachments (imaplib, smtplib) 使用apache通用电子邮件使用“代表”发送电子邮件 - Send email using “on behalf of” using apache common Email 想在android中使用JavaMailAPI发送电子邮件。 代码工作正常,所有信息都显示在日志中 - want to send Email using JavaMailAPI in android. The code works fine & all info is shown in Log Sending email with plain text, attachments and html using gmail api in reactjs - Sending email with plain text, attachments and html using gmail api in reactjs Gmail API for JAVA - Eclipse项目阅读附件下载 - Gmail API for JAVA - Eclipse project - Read new mails and download attachments
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM