2013-03-22 4 views
2

Я получаю эту ошибку при попытке подключиться к SMTPОтправка электронной почты без взаимодействия с пользователем в андроиде с помощью OAuth

javax.mail.MessagingException: 334 eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoiQmVhcmVyIiwic2NvcGUiOiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ== 

Вот мой код

public class GMailOauthSender 
{ 
    private Session session; 

    public SMTPTransport connectToSmtp(String host, int port, String userEmail, String oauthToken, boolean debug) throws Exception { 

     Properties props = new Properties(); 
     props.put("mail.smtp.starttls.enable", "true"); 
     props.put("mail.smtp.starttls.required", "true"); 
     props.put("mail.smtp.sasl.enable", "false"); 
     session = Session.getInstance(props); 
     session.setDebug(debug); 

     final URLName unusedUrlName = null; 
     SMTPTransport transport = new SMTPTransport(session, unusedUrlName); 
     // If the password is non-null, SMTP tries to do AUTH LOGIN. 
     final String emptyPassword = null; 
     transport.connect(host, port, userEmail, emptyPassword); 

     byte[] response = String.format("user=%s\1auth=Bearer %s\1\1", userEmail, oauthToken).getBytes(); 
     response = BASE64EncoderStream.encode(response); 

     transport.issueCommand("AUTH XOAUTH2 " + new String(response), 235); 

     return transport; 
    } 

    public synchronized void sendMail(String subject, String body, String user, String oauthToken, String recipients) { 
     try { 
      SMTPTransport smtpTransport = connectToSmtp("smtp.gmail.com",587,user,oauthToken,true); 

      MimeMessage message = new MimeMessage(session); 
      DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain")); 
      message.setSender(new InternetAddress(user)); 
      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)); 

      smtpTransport.sendMessage(message, message.getAllRecipients()); 
     } catch (Exception e) { 
      Log.d("test", e.getMessage()); 
     } 
    } 
} 

Я получил этот код от некоторых где в переполнение стека. любая помощь ??

+0

Попробуйте, это может помочь вам. [Отправить почту с помощью smtp] (http://hasmukhbhadani.blogspot.in/search/label/Gmail%20integration%20in%20Android) Сообщите мне, даже если у вас возникли проблемы. – Hasmukh

+0

привет Хашмух благодарит за ответ. это нормально, но я хочу отправить электронное письмо с учетной записи, где пользователь уже установил на мобильном телефоне. в этом случае, как я могу получить пароль здесь ..? – praveen

+0

Это означает, что Google играет Ac, пароль при настройке AC в Mobile? – Hasmukh

ответ

0

Ошибка вы получаете

eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoiQmVhcmVyIiwic2NvcGUiOiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ== 

декодирует к следующему с помощью Base64 Decoder

{"status":"400","schemes":"Bearer","scope":"https://mail.google.com/"} 

Что это выливается смысл (как зашифрованное как сообщение есть) является то, что маркер аутентификации, вы используете, истек. Вам необходимо аннулировать его, а затем получить новый (просто попросите токен снова).

Вы аннулированию маркер, как это:

mAccountManager.invalidateAuthToken("con.google", mAuthenticationToken); 

Я надеюсь, что это полезно :)

Смежные вопросы

 Смежные вопросы