9

I would like to send an e-mail in my app using whatever default mail provider the user already has setup. It must be possible to send the e-mail without requiring any user interaction. If I can avoid showing any UI, that would be the best solution. The one thing that is unacceptable is to either hardcode or request the user enter their e-mail credentials. The user had to have already setup their account such as Gmail with their credentials. All my app does is use an existing e-mail provider that has been setup.

Most of the posts I have found here use an Intent but from what I understand, that will show the e-mail UI and requires the user to press the Send button.

Johann
  • 27,536
  • 39
  • 165
  • 279
  • 3
    I' ve searched for this for a long time. Although it seems very logical to do this, actually there is no way. In fact, all you can do is fire off an email intent for the user to send the email himself, or enter your own credentials, even if you don' t want to. – Alpay Feb 27 '13 at 08:17
  • You would think that Google, out to protect users, would provide a simple API that if the user grants the app permission, lets the app send an e-mail with an account setup without requiring access to the user's username and password . – Johann Feb 27 '13 at 08:20
  • @ChintanRathod It _could_ be possible to send email without user' s interaction, after taking a permission. It is not absurd to think that way. There can be a way to do this that I don' t know however. I just couldn' t achieve this and shared my experience. – Alpay Feb 27 '13 at 08:44
  • then tell me some logic/way which you have thought.. – Chintan Rathod Feb 27 '13 at 08:51

2 Answers2

8

After some more digging around, I think there is a solution. Google has now added support for Gmail authentication using OAuth 2.0 which avoids the need to access the user's username and password. Since my app will require the user to have a Gmail account, this might be the solution. Of course this won't work for any other e-mail provider that doesn't support OAuth but since Google is concerned about protecting username/passwords, this approach seems to be right. Need to look into how to use OAuth from within my app, but theoretically it should be possible. Once a user grants permission to a Google service, the app receives a token that is used for the lifetime that the permission remains. The question that is still unresolved is whether Gmail supports sending an e-mail using OAuth:

Google Brings OAuth 2.0 Support To Gmail And Google Talk To Make Third-Party Apps More Secure

OAuth2 Support for Gmail

Google's sample code for Gmail support and OAuth2

Android app demonstrating how to send e-mail using OAuth

YouTube video showing how a mobile app uses 2 step verification in an app

Android docs on using OAuth 2.0

Code sample to send e-mail using OAuth2

Community
  • 1
  • 1
Johann
  • 27,536
  • 39
  • 165
  • 279
  • 1
    "The question that is still unresolved is whether Gmail supports sending an e-mail using OAuth" Why that? Look here: https://developers.google.com/google-apps/gmail/xoauth2_protocol#smtp_protocol_exchange – user1050755 Apr 06 '13 at 13:01
0

Try this code...

public class SendAttachment{
                        public static void main(String [] args){ 
                 //to address
                        String to="abc@abc.com";//change accordingly
                        //from address
                        final String user="efg@efg.com";//change accordingly
                        final String password="password";//change accordingly 
                         MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
                       mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
                      mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
                      mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
                      mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
                      mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
                      CommandMap.setDefaultCommandMap(mc); 
                      //1) get the session object   
                      Properties properties = System.getProperties();
                      properties.put("mail.smtp.port", "465"); 
                      properties.put("mail.smtp.host", "smtp.gmail.com");
                        properties.put("mail.smtp.socketFactory.port", "465");
                        properties.put("mail.smtp.socketFactory.class",
                                "javax.net.ssl.SSLSocketFactory");
                        properties.put("mail.smtp.auth", "true");
                        properties.put("mail.smtp.port", "465");

                      Session session = Session.getDefaultInstance(properties,
                       new javax.mail.Authenticator() {
                       protected PasswordAuthentication getPasswordAuthentication() {
                       return new PasswordAuthentication(user,password);
                       }
                      });

                      //2) compose message   
                      try{ 
                        MimeMessage message = new MimeMessage(session);
                        message.setFrom(new InternetAddress(user));
                        message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
                        message.setSubject("Hii"); 
                        //3) create MimeBodyPart object and set your message content    
                        BodyPart messageBodyPart1 = new MimeBodyPart();
                        messageBodyPart1.setText("How is This"); 
                        //4) create new MimeBodyPart object and set DataHandler object to this object    
                        MimeBodyPart messageBodyPart2 = new MimeBodyPart();
                    //Location of file to be attached
                        String filename = Environment.getExternalStorageDirectory().getPath()+"/R2832.zip";//change accordingly
                        DataSource source = new FileDataSource(filename);
                        messageBodyPart2.setDataHandler(new DataHandler(source));
                        messageBodyPart2.setFileName("Hello"); 
                        //5) create Multipart object and add MimeBodyPart objects to this object    
                        Multipart multipart = new MimeMultipart();
                        multipart.addBodyPart(messageBodyPart1);
                        multipart.addBodyPart(messageBodyPart2); 
                        //6) set the multiplart object to the message object
                        message.setContent(multipart ); 
                        //7) send message 
                        Transport.send(message); 
                       System.out.println("MESSAGE SENT....");
                       }catch (MessagingException ex) {ex.printStackTrace();}
                      }
                    }
Rashid
  • 492
  • 1
  • 8
  • 19