2013-02-27 31 views
9

Tôi muốn gửi e-mail trong ứng dụng của mình bằng bất kỳ nhà cung cấp thư mặc định nào mà người dùng đã thiết lập. Có thể gửi e-mail mà không yêu cầu bất kỳ sự tương tác nào của người dùng. Nếu tôi có thể tránh hiển thị bất kỳ giao diện người dùng nào, đó sẽ là giải pháp tốt nhất. Một điều không thể chấp nhận là mã hóa hoặc yêu cầu người dùng nhập thông tin đăng nhập e-mail của họ. Người dùng phải đã thiết lập tài khoản của họ như Gmail với thông tin đăng nhập của họ. Tất cả ứng dụng của tôi là sử dụng nhà cung cấp e-mail hiện có đã được thiết lập.Gửi e-mail trong Android mà không cần người dùng tương tác

Hầu hết các bài viết tôi đã tìm thấy ở đây sử dụng Intent nhưng từ những gì tôi hiểu, sẽ hiển thị giao diện người dùng e-mail và yêu cầu người dùng nhấn nút Gửi.

+3

Tôi đã tìm kiếm này trong một thời gian dài. Mặc dù nó có vẻ rất hợp lý để làm điều này, thực sự không có cách nào. Trong thực tế, tất cả những gì bạn có thể làm là kích hoạt mục đích email để người dùng tự gửi email hoặc nhập thông tin đăng nhập của riêng bạn, ngay cả khi bạn không muốn. – Alpay

+0

Bạn sẽ nghĩ rằng Google, để bảo vệ người dùng, sẽ cung cấp một API đơn giản nếu người dùng cấp quyền cho ứng dụng, cho phép ứng dụng gửi e-mail bằng thiết lập tài khoản mà không yêu cầu quyền truy cập vào tên người dùng và mật khẩu của người dùng. – AndroidDev

+0

@ChintanRathod Nó _could_ có thể gửi email mà không cần sự tương tác của người dùng, sau khi nhận được sự cho phép. Nó không phải là vô lý để nghĩ theo cách đó. Có thể có một cách để làm điều này mà tôi không biết tuy nhiên. Tôi chỉ không thể đạt được điều này và chia sẻ kinh nghiệm của tôi. – Alpay

Trả lời

8

Sau khi tìm hiểu thêm, tôi nghĩ có một giải pháp. Google hiện đã thêm hỗ trợ cho xác thực Gmail bằng OAuth 2.0 giúp tránh truy cập tên người dùng và mật khẩu của người dùng. Vì ứng dụng của tôi sẽ yêu cầu người dùng có tài khoản Gmail, đây có thể là giải pháp. Tất nhiên điều này sẽ không hoạt động đối với bất kỳ nhà cung cấp e-mail nào khác không hỗ trợ OAuth nhưng vì Google lo lắng về việc bảo vệ tên người dùng/mật khẩu, cách tiếp cận này có vẻ đúng. Cần phải xem xét cách sử dụng OAuth từ bên trong ứng dụng của tôi, nhưng về lý thuyết thì điều đó là có thể. Sau khi người dùng cấp quyền cho một dịch vụ của Google, ứng dụng sẽ nhận được mã thông báo được sử dụng suốt đời mà quyền đó vẫn còn. Câu hỏi đó vẫn còn chưa được giải quyết là liệu Gmail hỗ trợ gửi e-mail bằng 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

"Câu hỏi vẫn chưa được giải quyết là liệu Gmail có hỗ trợ gửi e-mail bằng OAuth" Tại sao không? Xem tại đây: https://developers.google.com/google-apps/gmail/xoauth2_protocol#smtp_protocol_exchange – user1050755

0

Hãy thử mã này ...

public class SendAttachment{ 
         public static void main(String [] args){ 
       //to address 
         String to="[email protected]";//change accordingly 
         //from address 
         final String user="[email protected]";//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();} 
         } 
        } 
+0

Thêm các tệp jar activation.jar, additionn.all.jal, javax.mail.jar – Rashid

Các vấn đề liên quan