简体   繁体   English

使用 MimeMultipart、Java 8 发送带有多个嵌入图像的邮件

[英]sending mail with multiple embedded images using MimeMultipart, Java 8

I'm trying to send mails with multiple images embedded into the body.... I was reding this Sending mail along with embedded image using javamail , but unfortunately I can't get works我试图发送带有嵌入全身多处图像....我雷丁此邮件一起嵌入图像使用JavaMail发送邮件,但遗憾的是我不能让作品

Creating the Message创建消息

javax.mail.Message message = new javax.mail.internet.MimeMessage(Session.getInstance(mailingSettings.getProperties()));
message.setFrom(new InternetAddress(mailingSettings.getCorreoOrigen(), mailingSettings.getNombreOrigen()));
message.setSentDate(new Date());
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(mailDTO.getCorreoDestino()));
message.addHeader("Content-type", "text/HTML; charset=iso-8859-1");
message.addHeader("Content-Transfer-Encoding", "8bit");
message.setSubject(mailDTO.getAsunto() + mailDTO.getCodigoDocumento() + "-sendOneMail");

Now I create Multipart现在我创建 Multipart

MimeMultipart multipart = new MimeMultipart();

// Ini Add the Body
BodyPart mimeBodyPart = new PreencodedMimeBodyPart("8bit");
mimeBodyPart.setContent(contenidoCorreo /*The HTML with multiple images*/, "text/html");
multipart.addBodyPart(mimeBodyPart);
// End Add the Body


addImages2(mailDTO, multipart, contenidoCorreo);
try {
  message.setContent(multipart);        //Add the Multipart to the Message 
  Transport.send(message);              //Send the Message
} catch (Exception e) {
  e.printStackTrace();
  throw e;
}

Now the method to Add Images to the Multipart现在是将图像添加到 Multipart 的方法

  private void addImages2(MailDTO mailDTO, final Multipart multipart, String contenidoCorreo) throws Exception {
    //Check the 'cid' words and get the image names....

    Set<String> setImagenes = Arrays.stream(contenidoCorreo.split("cid:")).collect(Collectors.toSet());
    setImagenes.stream().forEach(stringCid -> {
      String imagenCid = (stringCid.split("\""))[0];
      String pathImage = /path/to/Images/Directory + "/" + imagenCid;
      if (new File(pathImage).exists()) {
        BodyPart imagenMimeBodyPart = new MimeBodyPart();
        try {
          DataSource source = new FileDataSource(pathImage);
          imagenMimeBodyPart.setDataHandler(new DataHandler(source));
          imagenMimeBodyPart.setFileName(imagenCid);
          imagenMimeBodyPart.setHeader("Content-ID", imagenCid);
          multipart.addBodyPart(imagenMimeBodyPart);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    });

  }

All images are sent like atachment, but not inserted into HTML .所有图像都像附件一样发送,但不会插入到 HTML 中

Now, I will compare the Content Message using Successfully Telnet method...现在,我将使用成功的 Telnet 方法比较内容消息...

In the Left Side using Telnet directly method, in the rigth Side my Java code.在左侧使用 Telnet 直接方法,在右侧我的 Java 代码。

Comparing the inital snippet with the HTML Body Content将初始片段与 HTML 正文内容进行比较在此处输入图片说明 Comparing the final snippet of HTML Body Content比较 HTML 正文内容的最终片段在此处输入图片说明 Some part of the images separation using Telnet Method on left Side左侧使用Telnet方法分离部分图像在此处输入图片说明 The final part using Telnet Method!最后一部分使用 Telnet 方法! 在此处输入图片说明

The Email with attached images附有图片的电子邮件在此处输入图片说明

How fix my code in order to show the images inserted in my HTML code and that the images are displayed too?如何修复我的代码以显示插入到我的 HTML 代码中的图像并显示图像?

I extended the java mail class to add and read attachments, you will have to modify the code for your purposes, but it will attach a file to the email.我扩展了 java 邮件类来添加和读取附件,您必须根据自己的目的修改代码,但它会将文件附加到电子邮件中。 I do think that you cannot attach a raw binary image, it has to be converted to base64 inline encoding prior to being sent.我确实认为您不能附加原始二进制图像,它必须在发送之前转换为 base64 内联编码。 and decoded when received.并在收到时解码。

public class Mail extends javax.mail.Authenticator {
private String _user;
private String _pass;

private String[] _to;
private String _from;

private String _port;
private String _sport;

private String _host;

private String _subject;
private String _body;

private boolean _auth;

private boolean _debuggable;

private Multipart _multipart;


public Mail() {
    _host = "smtp.gmail.com"; // default smtp server
    _port = "465"; // default smtp port
    _sport = "465"; // default socketfactory port

    _user = ""; // username
    _pass = ""; // password
    _from = ""; // email sent from
    _subject = ""; // email subject
    _body = ""; // email body

    _debuggable = false; // debug mode on or off - default off
    _auth = true; // smtp authentication - default on

    _multipart = new MimeMultipart();

    // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added.
    MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
    mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
    mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
    mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
    mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
    mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
    CommandMap.setDefaultCommandMap(mc);
}

public Mail(String user, String pass) {
    this();

    _user = user;
    _pass = pass;
}

public String GetMail(){
    try {

        Properties props = System.getProperties();
        String mailhost = "imap.gmail.com";
        Session session;
        Store store;
        if (props == null){
            //Log.e(DEBUG, "Properties are null !!");
        }else{
            props.setProperty("mail.store.protocol", "imaps");

            /*Log.d(TAG, "Transport: "+props.getProperty("mail.transport.protocol"));
            Log.d(TAG, "Store: "+props.getProperty("mail.store.protocol"));
            Log.d(TAG, "Host: "+props.getProperty("mail.imap.host"));
            Log.d(TAG, "Authentication: "+props.getProperty("mail.imap.auth"));
            Log.d(TAG, "Port: "+props.getProperty("mail.imap.port"));*/
        }
        try {
            session = Session.getDefaultInstance(props, null);
            store = session.getStore("imaps");
            store.connect(mailhost, _user, _pass);
            //Log.i(TAG, "Store: "+store.toString());
            //create the folder object and open it
            Folder emailFolder = store.getFolder("INBOX");
            emailFolder.open(Folder.READ_ONLY);

            // retrieve the messages from the folder in an array and print it
            Message[] messages = emailFolder.getMessages();
            String contentType = messages[messages.length-1].getContentType();
            String messageContent = "";

            // store attachment file name, separated by comma
            String attachFiles = "";

            if (contentType.contains("multipart")) {
                // content may contain attachments
                Multipart multiPart = (Multipart) messages[messages.length-1].getContent();
                int numberOfParts = multiPart.getCount();
                for (int partCount = 0; partCount < numberOfParts; partCount++) {
                    MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(partCount);
                    if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
                        InputStream is = part.getInputStream();

                        byte[] buf = new byte[1024];
                        Arrays.fill(buf, (byte) 0);
                        int bytesRead;
                        bytesRead =is.read(buf);
                        byte[] nBuf = new byte[bytesRead];
                        for (int i = 0; i < bytesRead; i++) {
                            nBuf[i] = buf[i];
                        }


                        //byte[bytesRead] bytearr = buf;
                        //fos.write(buf, 0, bytesRead);
                        if ( bytesRead > 0 ) {
                            String sBuf = new String(nBuf,"UTF-8");
                            int test = 0;
                            return ( sBuf );
                        }

                        // this part is attachment
                        String fileName = part.getFileName();
                        attachFiles += fileName + ", ";
                        //part.saveFile(saveDirectory + File.separator + fileName);
                    } else {
                        // this part may be the message content
                        messageContent = part.getContent().toString();
                    }
                }

                if (attachFiles.length() > 1) {
                    attachFiles = attachFiles.substring(0, attachFiles.length() - 2);
                }
            } else if (contentType.contains("text/plain")
                    || contentType.contains("text/html")) {
                Object content = messages[0].getContent();
                if (content != null) {
                    messageContent = content.toString();
                }
            }

            return( messages[0].getSubject());
        }  catch (MessagingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    } catch  (Exception e) {
        e.printStackTrace();
    }
    String nullstring ="";
    return( nullstring);
}
public boolean send() throws Exception {
    Properties props = _setProperties();

    if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) {
        Session session = Session.getInstance(props, this);
        Log.e("MailApp", "session started");
        final MimeMessage msg = new MimeMessage(session);
        Log.e("MailApp", "mime");
        msg.setFrom(new InternetAddress(_from));
        Log.e("MailApp", "setfrom");
        InternetAddress[] addressTo = new InternetAddress[_to.length];
        for (int i = 0; i < _to.length; i++) {
            addressTo[i] = new InternetAddress(_to[i]);
        }
        msg.setRecipients(MimeMessage.RecipientType.TO, addressTo);

        msg.setSubject(_subject);
        msg.setSentDate(new Date());

        // setup message body
        BodyPart messageBodyPart = new MimeBodyPart();
        messageBodyPart.setText(_body);
        _multipart.addBodyPart(messageBodyPart);

        // Put parts in message
        msg.setContent(_multipart);

        Thread thread = new Thread(new Runnable(){
            @Override
            public void run() {
                try {
                    Transport.send(msg);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        thread.start();


        return true;
    } else {
        return false;
    }
}

public void addAttachment(String filename) throws Exception {
    BodyPart messageBodyPart = new MimeBodyPart();
    DataSource source = new FileDataSource(filename);
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName(filename);

    _multipart.addBodyPart(messageBodyPart);
}

@Override
public PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(_user, _pass);
}

private Properties _setProperties() {
    Properties props = new Properties();

    props.put("mail.smtp.host", _host);

    if(_debuggable) {
        props.put("mail.debug", "true");
    }

    if(_auth) {
        props.put("mail.smtp.auth", "true");
    }

    props.put("mail.smtp.port", _port);
    props.put("mail.smtp.socketFactory.port", _sport);
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.socketFactory.fallback", "false");

    return props;
}

// the getters and setters
public String getBody() {
    return _body;
}

public void setBody(String _body) {
    this._body = _body;
}
public void setFrom( String _from ){
    this._from = _from;
}
public void setSubject( String _subject ){
    this._subject = _subject;
}
public void setTo( String[] _to ){
    this._to = _to;
}
// more of the getters and setters …..

} }

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM