2015-04-16 12 views
1

Мое приложение запускает службу, которая отправляет и отправляет электронную почту, это должно быть прозрачно для пользователя, поэтому я использую javax.mail.Отправка почты с помощью smtp

Эти классы я реализую:

JSSEProvider.java

public final class JSSEProvider extends Provider { 
    private static final long serialVersionUID = 1L; 

    public JSSEProvider() { 
     super("HarmonyJSSE", 1.0, "Harmony JSSE Provider"); 
     AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() { 
      @Override 
      public Void run() { 
       put("SSLContext.TLS", 
        "org.apache.harmony.xnet.provider.jsse.SSLContextImpl"); 
       put("Alg.Alias.SSLContext.TLSv1", "TLS"); 
       put("KeyManagerFactory.X509", 
        "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl"); 
      put("TrustManagerFactory.X509", 
        "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl"); 
      return null; 
      } 
     }); 
    } 
} 

MailSender.java

public class MailSender extends javax.mail.Authenticator { 
    private final String mailhost = "smtp.gmail.com"; 
    private final String user; 
    private final String password; 
    private final Session session; 

    static { 
     Security.addProvider(new JSSEProvider()); 
    } 

    public MailSender(String user, String password) { 
     this.user = user; 
     this.password = password; 

     Properties props = new Properties(); 
     props.setProperty("mail.transport.protocol", "smtp"); 
     props.setProperty("mail.host", mailhost); 
     props.put("mail.smtp.auth", "true"); 
     props.put("mail.smtp.port", "465"); 
     props.put("mail.smtp.socketFactory.port", "465"); 
     props.put("mail.smtp.socketFactor.class", "javax.net.ssl.SSLSocketFactory"); 
     props.put("mail.smtp.socketFactory.fallback", "false"); 
     props.setProperty("mail.smtp.quitwait", "false"); 

     session = Session.getDefaultInstance(props, this); 
    } 

    @Override 
    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication(user, password); 
    } 

    public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception { 
     MimeMessage message = new MimeMessage(session); 
     DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain")); 

     message.setSender(new InternetAddress(sender)); 
     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)); 

     Transport.send(message); 
    } 

    public class ByteArrayDataSource implements DataSource { 
     private final byte[] data; 
     private String type; 

     public ByteArrayDataSource(byte[] data, String type) { 
      super(); 
      this.data = data; 
      this.type = type; 
     } 

     public ByteArrayDataSource(byte[] data) { 
      super(); 
      this.data = data; 
     } 

     public void setType(String type) { 
      this.type = type; 
     } 

     @Override 
     public String getContentType() { 
      if (type == null) 
       return "application/octet-stream"; 
      else 
       return type; 
     } 

     @Override 
     public InputStream getInputStream() throws IOException { 
      return new ByteArrayInputStream(data); 
     } 

     @Override 
     public String getName() { 
      return "ByteArrayDataSource"; 
     } 

     @Override 
     public OutputStream getOutputStream() throws IOException { 
      throw new IOException("Not Supported"); 
     } 
    } 
} 

И, наконец, это то, как я посылаю письмо от услуги:

private void sendEmail(String email) { 
    String from = "[email protected]"; 
    String pass = "mypass"; 
    String to = email; 
    String subject = getString(R.string.email_subject); 
    String body = text_i_want_to_send; 

    MailSender mail = new MailSender(from, pass); 

    try { 
     mail.sendMail(subject, body, from, to); 
     Log.d("EMAIL", "Email sent!"); 
    } catch (Exception e) { 
     Log.d("EMAIL", "Error: " + e.getMessage()); 
    } 
} 

Теперь проблема заключается в том, что, когда он должен отправить по электронной почте, я могу видеть в LogCat исключение refered на заявление поймать, но он не дает никаких подробностей, он просто говорит:

EMAIL Error: null 

Должен сказать, что я получил JSSEProvider и клан MailSender из разных учебников по сети об использовании javax.mail для отправки писем с помощью smtp.

Итак, я понятия не имею, о том, что я делаю неправильно

EDIT -

Я chaught исключение, и это было связано с делать работу сети в основном потоке. Поэтому я использую AsyncTask, и эта часть решена.

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

ответ

1

Можете ли вы добавить улов для исключения NullPointerException? (и добавить бросок e). Я предполагаю, что у вас есть нулевая указатель где-то, и вы можете получить больше данных. Для этого есть плохая привычка ловить «Исключение», поскольку все будет поймано.

+0

Где? в методе sendEMail() службы или методе sendMail() класса MailSender? – masmic

+0

В sendEmail(). : вы попробовали {} catch (исключение) {}. Сделать это: try {} catch (Nullpointerexception e) {throw e;} catch (Exception e) {} Или не ловить «Исключение» –

+0

Да, у меня были проблемы с затмением, но я нахожусь на нем. Я опубликую результаты в ближайшее время – masmic

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