Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Programming - Send mail

Tags:

android

email

mms

I'm using the following piece of code in Android to send a mail:

 Intent emailIntent = new Intent(Intent.ACTION_SEND);
 emailIntent.setType("text/html");
 emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,sendTo );

 emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "test" );
 emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "msg" );

When code is compiled and run, its asking me options of selecting applications like "GMail", "BlueTooth" etc. But I want the mail to be sent without user intervention. Even sending it by MMS will be much better for me. Can some one suggest me how to do it?

like image 601
Satyam Avatar asked Apr 26 '10 13:04

Satyam


2 Answers

You need to include the java mail library and dependencies in your project and then write a helper class like the one below.


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

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

the JSSEProvider class


@SuppressWarnings("serial")
public final class JSSEProvider extends Provider {
 public JSSEProvider() {
  super("HarmonyJSSE", 1.0, "Harmony JSSE Provider");
  AccessController.doPrivileged(new java.security.PrivilegedAction() {
   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;
   }
  });
 }
}

Sending the email is then as simple as


GMailSender sender = new GMailSender("username", "password");
sender.sendMail("subject", body, "sender", recipients);
like image 109
Dave.B Avatar answered Nov 05 '22 12:11

Dave.B


You can't send an email or sms using the built-in apps without user intervention. You have to use an external mail library like the other answer mentions.

like image 39
Robby Pond Avatar answered Nov 05 '22 11:11

Robby Pond