2012-06-12 131 views
0

我使用JavaMail APi從我的android應用程序發送沒有意圖的電子郵件。我下面的問題: Sending Email in Android using JavaMail API without using the default/built-in app電子郵件未發送|使用Android的JavaMail API

http://www.jondev.net/articles/Sending_Emails_without_User_Intervention_(no_Intents)_in_Android

這裏是我的代碼。點擊按鈕下面是代碼:

public void onClick(View v){ 
    Runnable runnable = new Runnable(){ 

       @Override 
       public void run() { 
        Mail m = new Mail("MY Gmail Address", "My password"); 

         String[] toArr = {"[email protected]"}; 
         m.setTo(toArr); 
         m.setFrom("[email protected]"); 
         m.setSubject("This is an email sent using my Mail JavaMail wrapper from an Android device."); 
         m.setBody("Email body."); 

         try { 
         m.addAttachment("/sdcard/filelocation"); 

         if(m.send()) { 
          Toast.makeText(MyActivity.this, "Email was sent successfully.", Toast.LENGTH_LONG).show(); 
         } else { 
          Toast.makeText(MyActivity.this, "Email was not sent.", Toast.LENGTH_LONG).show(); 
         } 
         } catch(Exception e) { 
         //Toast.makeText(MailApp.this, "There was a problem sending the email.", Toast.LENGTH_LONG).show(); 
         Log.e("MailApp", "Could not send email", e); 
         } 


       } 

      }; 
      new Thread(runnable).start(); 
} 

類如下:

公共類郵件{ 私人字符串_user; private String _pass;

 private String _to; 
     private String _from; 

     private String _port; 
     private String _sport; 

     private String _host; 

     private String _subject; 
     private String _body; 

     private boolean _auth; 

     private boolean _debuggable; 

     private Multipart _multipart; 


     public Mail() { 
     _host = "smtp.gmail.com"; // default smtp server 
     _port = "465"; // default smtp port 
     _sport = "465"; // default socketfactory port 

     _user = "My mail id"; // username 
     _pass = "My Password"; // password 
     _from = ""; // email sent from 
     _subject = "Hi"; // email subject 
     _body = "how are you"; // email body 

     _debuggable = false; // debug mode on or off - default off 
     _auth = true; // smtp authentication - default on 

     _multipart = new MimeMultipart(); 

     // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. 
     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); 
     } 

     public void setFrom(String string) { 
     // TODO Auto-generated method stub 
      _from="from email address"; 


    } 

    public void setSubject(String string) { 
     // TODO Auto-generated method stub 
     _subject="Hi"; 
    } 

    public void setTo(String[] toArr) { 
     // TODO Auto-generated method stub 
     _to = "to email address"; 
    } 

    public Mail(String user, String pass) { 
     this(); 

     _user = user; 
     _pass = pass; 
     } 

     public boolean send() throws Exception { 
     Properties props = _setProperties(); 

     if(!_user.equals("") && !_pass.equals("") && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
      Session session = Session.getInstance(props); 

      MimeMessage msg = new MimeMessage(session); 

      msg.setFrom(new InternetAddress(_from)); 

      //InternetAddress[] addressTo = new InternetAddress[_to.toString()]; 
      /*for (int i = 0; i < _to.length; i++) { 
      addressTo[i] = new InternetAddress(_to[i]); 
      }*/ 
      msg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(_to)); 

      msg.setSubject(_subject); 


      // setup message body 
      BodyPart messageBodyPart = new MimeBodyPart(); 
      messageBodyPart.setText(_body); 
      _multipart.addBodyPart(messageBodyPart); 

      // Put parts in message 
      msg.setContent(_multipart); 

      // send email 
      Transport.send(msg); 

      return true; 
     } else { 
      return false; 
     } 
     } 

     public void addAttachment(String filename) throws Exception { 
     BodyPart messageBodyPart = new MimeBodyPart(); 
     DataSource source = new FileDataSource(filename); 
     messageBodyPart.setDataHandler(new DataHandler(source)); 
     messageBodyPart.setFileName(filename); 

     _multipart.addBodyPart(messageBodyPart); 
     } 


     public PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication(_user, _pass); 
     } 

     private Properties _setProperties() { 
     Properties props = new Properties(); 

     props.put("mail.smtp.host", _host); 

     if(_debuggable) { 
      props.put("mail.debug", "true"); 
     } 

     if(_auth) { 
      props.put("mail.smtp.auth", "true"); 
     } 

     props.put("mail.smtp.port", _port); 
     props.put("mail.smtp.socketFactory.port", _sport); 
     props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
     props.put("mail.smtp.socketFactory.fallback", "false"); 

     return props; 
     } 

     // the getters and setters 
     public String getBody() { 
     return _body; 
     } 

     public void setBody(String _body) { 
     this._body = _body; 
     } 

,當我點擊我的Android設備上的按鈕,它給了我下面的錯誤:

06-12 13:26:42.523: E/MailApp(8579): Could not send email 
06-12 13:26:42.523: E/MailApp(8579): java.lang.NullPointerException 
06-12 13:26:42.523: E/MailApp(8579): at com.MyApp.MyActivity$Mail.send(MyActivity.java:280) 
06-12 13:26:42.523: E/MailApp(8579): at com.MyApp.MActivity$1.run(MActivity.java:146) 
06-12 13:26:42.523: E/MailApp(8579): at java.lang.Thread.run(Thread.java:1019) 

我缺少的東西?

回答

1

你班上哪條線是280線?它應該在你的Mail.send()函數中。那是空指針的位置。知道這是什麼會有所幫助。

看起來_TO從未初始化...

哈哈不用擔心男人,我花了幾個月得到一個工作郵件客戶端進行的JavaMail的。當您創建的會話,你應該通過該認證的對象..

SMTPAuthenticator auth = new SMTPAuthenticator(); 
session = Session.getDefaultInstance(props,auth); 


private class SMTPAuthenticator extends javax.mail.Authenticator { 
     public PasswordAuthentication getPasswordAuthentication() { 
      String username = "your_username"; 
      String password = "your_password"; 
      return new PasswordAuthentication(username, password); 
     } 
    } 
+0

是_TO未初始化。我做到了,但仍然無法使用此代碼發送電子郵件。我已經更新了代碼。 – Nerd

+0

那麼你現在得到什麼錯誤?哪裏出現錯誤?另外,在上面的代碼中,_to仍然爲空,因爲'public void setTo(String [] toArr)'仍未實現。不知道你是否打算改變或不改變。 – Joel

+0

它說「AuthenticationFailed」。我檢查了我的電子郵件和密碼是否正確。而且我已經更新了我的代碼。 – Nerd

相關問題