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.
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" />