在Android中发送电子邮件,无需用户交互

时间:2013-02-27 07:52:57

标签: android email

我想使用用户已设置的任何默认邮件提供商在我的应用中发送电子邮件。必须可以发送电子邮件而无需任何用户交互。如果我可以避免显示任何UI,那将是最好的解决方案。不可接受的一件事是硬编码或请求用户输入他们的电子邮件凭证。用户必须已使用凭据设置其帐户,例如Gmail。我的所有应用程序都使用已设置的现有电子邮件提供商。

我在这里找到的大部分帖子都使用了Intent,但据我所知,这将显示电子邮件用户界面,并要求用户按发送按钮。

2 个答案:

答案 0 :(得分:8)

经过多次挖掘后,我认为有一个解决方案。 Google现在已经添加了对使用OAuth 2.0进行Gmail身份验证的支持,这样就无需访问用户的用户名和密码。由于我的应用需要用户拥有Gmail帐户,因此这可能是解决方案。当然,这不适用于任何其他不支持OAuth的电子邮件提供商,但由于Google担心保护用户名/密码,这种方法似乎是正确的。需要研究如何在我的应用程序中使用OAuth,但理论上应该是可能的。用户授予对Google服务的权限后,该应用会收到一个令牌,该令牌用于该权限保留的有效期。尚未解决的问题是Gmail是否支持使用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

答案 1 :(得分:0)

试试这段代码......

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