1

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

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

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

  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.

Now, I will compare the Content Message using Successfully Telnet method...

In the Left Side using Telnet directly method, in the rigth Side my Java code.

Comparing the inital snippet with the HTML Body Content enter image description here Comparing the final snippet of HTML Body Content enter image description here Some part of the images separation using Telnet Method on left Side enter image description here The final part using Telnet Method! enter image description here

The Email with attached images enter image description here

How fix my code in order to show the images inserted in my HTML code and that the images are displayed too?

joseluisbz
  • 1,491
  • 1
  • 36
  • 58

1 Answers1

1

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. I do think that you cannot attach a raw binary image, it has to be converted to base64 inline encoding prior to being sent. 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 …..

}