Android Programming - Send mail
Asked Answered
L

2

6

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?

Lichter answered 26/4, 2010 at 13:44 Comment(0)
T
6

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);
Towroy answered 26/4, 2010 at 14:24 Comment(6)
Android already has "GMail" app. How can I use the same account to send a mail instead of alerting user to provide those details?Lichter
I guess you can't: either you ask user's password, or you ask gmail app to send the mail for you.Beware
assuming the user has their credentials stored in the gmail app you may be able to retrieve them via a content provider if they are exposed. Otherwise you have to either ask for credentials or use a gmail account which you've set up for your application to send mail. I use the above class to report uncaught exceptions.Towroy
From where is this "JSSEProvider" coming from? i cant find it in the "security" package...Poteet
That is the concrete implementation of the abstract Provider class I've edited the post above to show a valid implementation. sorry for the late reply to your comment i havent been on this site in a whileTowroy
Where i can find "java mail library"?Consult
A
3

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.

Acis answered 26/4, 2010 at 14:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.