Search code examples
androidemailgmail

Android GmailSender error on body message


When you try to send an email using the GmailSender class, the email arrives as without body text, and have checked the parameters and all were filled only with text.

My Method

private static Boolean SendMail(ArrayList<Contato> colecao, String localFile, String subject, String body)
{
    Boolean ret = false;

    final GMailSender sender = new GMailSender("[email protected]", "mypass");

    try
    {
        (colecao.size() < 1) return false;
        else
        {
            String recipients = GetRecipients(colecao);

            if(localFile != "")
                sender.addAttachment(localFile,"");//Anexo

            sender.sendMail(subject, body, "[email protected]", recipients);
            Log.d("EMAIL SENDER", "email Enviado com sucesso");
            ret = true;
        }
    }
    catch (Exception e)
    {
        ret = false;
        Log.e("SendMail", e.getMessage(), e);
    }

    return ret;
}

GmailSender Class

public class GMailSender extends javax.mail.Authenticator {   
private String mailhost = "smtp.gmail.com";   
private String user;   
private String password;   
private Session session;   
private Multipart _multipart; 

static {   
    Security.addProvider(new com.prologica.smart_detection.JSSEProvider());   
}  

public GMailSender(String user, String password) {   
    this.user = user;   
    this.password = password;   

    Properties props = new Properties();   
    props.setProperty("mail.transport.protocol", "smtp");   
    props.setProperty("mail.host", mailhost);   
    props.put("mail.smtp.auth", "true");   
    props.put("mail.smtp.port", "465");   
    props.put("mail.smtp.socketFactory.port", "465");   
    props.put("mail.smtp.socketFactory.class",   
            "javax.net.ssl.SSLSocketFactory");   
    props.put("mail.smtp.socketFactory.fallback", "false");   
    props.setProperty("mail.smtp.quitwait", "false");   

    session = Session.getDefaultInstance(props, this);   

    _multipart = new MimeMultipart(); 
}   

protected PasswordAuthentication getPasswordAuthentication() {   
    return new PasswordAuthentication(user, password);   
}   

public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception {   
    try{
    MimeMessage message = new MimeMessage(session);   
    DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));   
    message.setSender(new InternetAddress(sender));   
    message.setSubject(subject);   
    message.setDataHandler(handler);

    message.setContent(_multipart);

    if (recipients.indexOf(',') > 0)   
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));   
    else  
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));   
    Transport.send(message);   
    }catch(Exception e){

    }
}

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

    BodyPart messageBodyPart2 = new MimeBodyPart(); 
    messageBodyPart2.setText(subject); 

    _multipart.addBodyPart(messageBodyPart2); 
} 

public class ByteArrayDataSource implements DataSource {   
    private byte[] data;   
    private String type;   

    public ByteArrayDataSource(byte[] data, String type) {   
        super();   
        this.data = data;   
        this.type = type;   
    }   

    public ByteArrayDataSource(byte[] data) {   
        super();   
        this.data = data;   
    }   

    public void setType(String type) {   
        this.type = type;   
    }   

    public String getContentType() {   
        if (type == null)   
            return "application/octet-stream";   
        else  
            return type;   
    }   

    public InputStream getInputStream() throws IOException {   
        return new ByteArrayInputStream(data);   
    }   

    public String getName() {   
        return "ByteArrayDataSource";   
    }   

    public OutputStream getOutputStream() throws IOException {   
        throw new IOException("Not Supported");   
    }   
}   

}

Empty Body Mail Result enter image description here

How do I solve this? I need to send something simple like "any text" with few characters.


Solution

  • Modify the sendMail function of GmailSender class as below:

    message.setDataHandler(handler);
    
    - message.setContent(_multipart);
    + if(_multipart.getCount() > 0) {
    +    BodyPart messageBodyPart = new MimeBodyPart();
    +    messageBodyPart.setText(body);
    +    _multipart.addBodyPart(messageBodyPart);
    +    message.setContent(_multipart);
    +}
    
    if (recipients.indexOf(',') > 0)