Java – Automatically sends mail in the Android background

Automatically sends mail in the Android background… here is a solution to the problem.

Automatically sends mail in the Android background

When I press the send button in the log, it shows that the message was sent but the message was not actually sent. Please help my code below.
Why wasn’t the message sent?

GMailSender.java

package com.example.sendmail;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Security;
import java.util.Properties;

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 = new MimeMultipart();
    static {
        Security.addProvider(new com.example.sendmail.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);
    }

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);
            BodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setText(body);
            _multipart.addBodyPart(messageBodyPart);

 Put parts in message
            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) throws Exception {
        BodyPart messageBodyPart = new MimeBodyPart();
        DataSource source = new FileDataSource(filename);
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName("download image");

_multipart.addBodyPart(messageBodyPart);
    }

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");
        }
    }
}

JSSEProvider.java

package com.example.sendmail;

import java.security.AccessController;
import java.security.Provider;

public final class JSSEProvider extends Provider {

public JSSEProvider() {
        super("HarmonyJSSE", 1.0, "Harmony JSSE Provider");
        AccessController
                .doPrivileged(new java.security.PrivilegedAction<Void>() {
                    public Void run() {
                        put("SSLContext.TLS",
                                "org.apache.harmony.xnet.provider.jsse.SSLContextImpl");
                        put("Alg.Alias.SSLContext.TLSv1", "TLS");
                        put("KeyManagerFactory.X509",
                                "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl");
                        put("TrustManagerFactory.X509",
                                "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl");
                        return null;
                    }
                });
    }
}

MainActivity.java

package com.example.sendmail;

import android.os.Bundle;
import android.os.Environment;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
    Button send;
String filename = "/sdcard/mysdfile";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

send = (Button) findViewById(R.id.send);
        send.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {
                 TODO Auto-generated method stub
                new Thread(new Runnable() {
                    @SuppressLint("SdCardPath") public void run() {
                        try {
                            GMailSender sender = new GMailSender("[email protected]","**password***");
                            Toast.makeText(getApplicationContext(), "Connect", Toast.LENGTH_LONG).show();
                            sender.addAttachment(filename);
                            sender.addAttachment(Environment.getExternalStorageDirectory().getPath()+"/sdcard/mysdfile.txt");
                            sender.sendMail("Test mail", "This mail has been sent from android app along with attachment","[email protected]",
                                    "[email protected]");

Log.i("Mail", "Sent");
                            Toast.makeText(getApplicationContext(),"Your mail has been sent",Toast.LENGTH_LONG).show();

} catch (Exception e) {
                            runOnUiThread(new Runnable() 
                            {
                                public void run() 
                                {
                                    Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_SHORT).show();    
                                }
                            }); 

Log.i("Mail", "Failed"+e);
                            Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();

}
                    }
                }).start();

send.setText("Ok");
            }
        });

}

}

No errors occur, the sender message does not send the message, and the recipient mail inbox has no message.

Solution

You need to import lib BackgroundMailLibrary

 BackgroundMail bm = new BackgroundMail(PasswordChangeActivity.this);
                                            bm.setGmailUserName(mail id);
                                            bm.setGmailPassword(Utils.decryptIt(password)); 
                                            bm.setMailTo(ownerEmail);
                                            bm.setFormSubject(subject);
                                            bm.setFormBody(body);
                                            bm.send();

Related Problems and Solutions