2013-02-27 13 views
9

Chciałbym wysłać wiadomość e-mail w mojej aplikacji za pomocą dowolnego domyślnego dostawcy poczty, który użytkownik już skonfigurował. Musi istnieć możliwość wysłania wiadomości e-mail bez interwencji użytkownika. Jeśli uda mi się uniknąć wyświetlania dowolnego interfejsu użytkownika, byłoby to najlepsze rozwiązanie. Jedyne, co jest niedopuszczalne, to albo użyć kodu twardego, albo poprosić użytkownika o podanie swoich danych uwierzytelniających. Użytkownik musiał już skonfigurować swoje konto, takie jak Gmail, za pomocą swoich poświadczeń. Cała moja aplikacja używa istniejącego dostawcy poczty e-mail, który został skonfigurowany.Wysyłaj wiadomości e-mail w systemie Android bez interakcji użytkownika

Większość znalezionych tutaj pozycji używa intencji, ale z tego, co rozumiem, wynika, że ​​interfejs użytkownika poczty e-mail wymaga naciśnięcia przycisku Wyślij.

+3

I już szukał tego przez długi czas. Chociaż wydaje się to bardzo logiczne, w rzeczywistości nie ma mowy. W rzeczywistości wystarczy, że wyślesz wiadomość e-mail z zamiarem wysłania wiadomości e-mail lub wprowadzenia własnych danych uwierzytelniających, nawet jeśli tego nie chcesz. – Alpay

+0

Można by pomyśleć, że Google, aby chronić użytkowników, dostarczy prosty interfejs API, który pozwoli użytkownikowi przesłać wiadomość e-mail z konfiguracją konta bez konieczności uzyskiwania dostępu do nazwy użytkownika i hasła. – AndroidDev

+0

@ChintanRathod It _może być możliwe wysyłanie wiadomości e-mail bez interakcji użytkownika po uzyskaniu pozwolenia. Myślenie w ten sposób nie jest absurdem. Może być na to sposób, ale nie wiem. Po prostu nie mogłem tego osiągnąć i podzieliłem się swoim doświadczeniem. – Alpay

Odpowiedz

8

Po głębszym rozkopaniu, myślę, że istnieje rozwiązanie. Firma Google dodała teraz obsługę uwierzytelniania Gmaila za pomocą protokołu OAuth 2.0, dzięki czemu nie trzeba uzyskiwać dostępu do nazwy użytkownika i hasła. Ponieważ moja aplikacja będzie wymagać od użytkownika posiadania konta Gmail, może to być rozwiązanie. Oczywiście to nie zadziała dla żadnego innego dostawcy poczty e-mail, który nie obsługuje OAuth, ale ponieważ Google jest zaniepokojony ochroną nazwy użytkownika/haseł, to podejście wydaje się być właściwe. Musisz sprawdzić, jak używać OAuth w mojej aplikacji, ale teoretycznie powinno to być możliwe. Gdy użytkownik przyzna zezwolenie na usługę Google, aplikacja otrzymuje token, który jest używany przez całe życie, na które pozwolenie pozostaje. Pytanie, które jest nadal nierozwiązana, czy Gmail obsługuje wysyłanie wiadomości e-mail przy użyciu protokołu 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

"Pytanie, które wciąż pozostaje nierozwiązane, dotyczy tego, czy Gmail obsługuje wysyłanie wiadomości e-mail przy użyciu protokołu OAuth" Dlaczego? Zajrzyj tutaj: https://developers.google.com/google-apps/gmail/xoauth2_protocol#smtp_protocol_exchange – user1050755

0

Spróbuj tego kodu ...

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

Dodaj pliki jar activation.jar, additionnal.jar, javax.mail.jar – Rashid

Powiązane problemy