2012-06-12 74 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

相关问题