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
How do I solve this? I need to send something simple like "any text" with few characters.
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)