Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to send email in background in Android? [duplicate]

Tags:

android

email

For my app, I have retrieved my message inbox/sent. Now I want to send that retrieved data on my email address.how can it be? Is any authentication required for it? Also I have tried to download the authentication files (authentication.jar,mail.jar) but can't succeeded.

long currentTime = System.currentTimeMillis();
    long pastThreeHour = currentTime - (AlarmManager.INTERVAL_HOUR * 3);
    String[] selectionArgs = { "" + pastThreeHour, "" + currentTime };

    Cursor cursor = contentResolver.query(uri, null, selection, selectionArgs, "date DESC");

    if (cursor != null && cursor.getCount() > 0) {
        while (cursor.moveToNext()) {

            String number = cursor.getString(cursor.getColumnIndex("address")); // check for null
            String date = cursor.getString(cursor.getColumnIndex("date")); // convert to date its long
            String message_text = cursor.getString(cursor.getColumnIndex("body"));
            String type = cursor.getString(cursor.getColumnIndex("type")); // check type and get names

            // send email from here
            sendSMSEmail(number, date, message_text, type);
        }
    }
    cursor.close();
}
like image 221
Ashish Ranjan Avatar asked Nov 13 '13 07:11

Ashish Ranjan


2 Answers

Yes, it is possible to send email in background use following code, to send email

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 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 
    {   
        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);   

    }   

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

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

and

public final class JSSEProvider extends Provider 
{
    private static final long serialVersionUID = 1L;

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

You would be requiring activation.jar, additionnal.jar & mail.jar files

like image 94
Vigbyor Avatar answered Nov 03 '22 10:11

Vigbyor


There is a library for Sending Email in Background which is working efficient. You can get the library from here Background Mail Library

Now import this library in your eclipse, and then go to project properties and add this library to your project. After all this process, just put these code in your project, and it will send email in background.

BackgroundMail bm = new BackgroundMail(context);
bm.setGmailUserName("[email protected]");
bm.setGmailPassword("sender_email_password");
bm.setMailTo("[email protected]");
bm.setFormSubject("Subject");
bm.setFormBody("Body");
bm.send();

With this permissions

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/> 

Update 1: Updated the Library name

like image 29
Pir Fahim Shah Avatar answered Nov 03 '22 10:11

Pir Fahim Shah