Sending Email in Android without using the default / built-in app

It is very easy to programmatically send email without using default email application in android. We can send email by using gmail, hotmail, yahoo or your domain email like info@wisdomitsol.com

In comming example I will show you exact code to send email programmatically using android code. Before continue download following jar files and include these libarares into your android project.

activation.jar

mail.jar

additionnal.jar

How to add external jar file in eclipse

Now create a class GMailSender.java

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

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
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 android.util.Log;

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

	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");// 587
		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);
			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) {
			Log.e("GMailSender exception", e.getMessage());
		}
	}

	public synchronized void sendMail(String subject, String body,
			String senderEmail, String recipients, String filePath,
			String logFilePath) throws Exception {
		boolean fileExists = new File(filePath).exists();
		if (fileExists) {

			String from = senderEmail;
			String to = recipients;
			String fileAttachment = filePath;

			// Define message
			MimeMessage message = new MimeMessage(session);
			message.setFrom(new InternetAddress(from));
			message.addRecipient(Message.RecipientType.TO, new InternetAddress(
					to));
			message.setSubject(subject);

			// create the message part
			MimeBodyPart messageBodyPart = new MimeBodyPart();

			// fill message
			messageBodyPart.setText(body);

			Multipart multipart = new MimeMultipart();
			multipart.addBodyPart(messageBodyPart);

			// Part two is attachment
			messageBodyPart = new MimeBodyPart();
			DataSource source = new FileDataSource(fileAttachment);
			messageBodyPart.setDataHandler(new DataHandler(source));
			messageBodyPart.setFileName("screenShoot.jpg");
			multipart.addBodyPart(messageBodyPart);

			// part three for logs
			messageBodyPart = new MimeBodyPart();
			DataSource sourceb = new FileDataSource(logFilePath);
			messageBodyPart.setDataHandler(new DataHandler(sourceb));
			messageBodyPart.setFileName("logs.txt");
			multipart.addBodyPart(messageBodyPart);

			// Put parts in message
			message.setContent(multipart);

			// Send the message
			Transport.send(message);
		} else {
			sendMail(subject, body, senderEmail, recipients);
		}
	}

	public synchronized void sendMail(String subject, String body,
			String senderEmail, String recipients, String logFilePath)
			throws Exception {
		
		File file= new File(logFilePath);
		boolean fileExists =file.exists();
		if (fileExists) {

			String from = senderEmail;
			String to = recipients;

			// Define message
			MimeMessage message = new MimeMessage(session);
			message.setFrom(new InternetAddress(from));
			message.addRecipient(Message.RecipientType.TO, new InternetAddress(
					to));
			message.setSubject(subject);

			// create the message part
			MimeBodyPart messageBodyPart = new MimeBodyPart();

			// fill message
			messageBodyPart.setText(body);

			Multipart multipart = new MimeMultipart();
			multipart.addBodyPart(messageBodyPart);

			// part three for logs
			messageBodyPart = new MimeBodyPart();
			DataSource sourceb = new FileDataSource(logFilePath);
			messageBodyPart.setDataHandler(new DataHandler(sourceb));
			messageBodyPart.setFileName(file.getName());
			multipart.addBodyPart(messageBodyPart);

			// Put parts in message
			message.setContent(multipart);

			// Send the message
			Transport.send(message);
		} else {
			sendMail(subject, body, senderEmail, recipients);
		}
	}

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

Note: You can change port accourding your requirement. Port could be 465 or 587

props.put("mail.smtp.port", "465");// 587
props.put("mail.smtp.socketFactory.port", "465");

We must change mail host accouring to sender email.

private String mailhost = "smtp.gmail.com";

For your own domain it could be smtp.yourdomain.com

Now create other class JSSEProvider.java

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

public final class JSSEProvider extends Provider {

	private static final long serialVersionUID = 3821760047343914156L;

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

How to send email from your activity, button click or from background service etc.

Thread thread=new Thread(){
	@Override
	public void run() {

		GMailSender sender = new GMailSender("sender_email@gmail.com","sender password");
		try {
			sender.sendMail("Email Subject", "<b>Hi</b><br/>Complete msg with html tags.", "sender_email@gmail.com", "receiver_email@gmail.com", "");
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
};
thread.start();

You can use AsyncTask to send email.

Don’t forget to add internet permission in AndroidManifest.xml

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

 

Leave a comment

Your email address will not be published. Required fields are marked *