电子邮件未发送|使用适用于Android的JavaMail API

时间:2012-06-12 20:40:46

标签: android javamail

我正在使用JavaMail APi发送电子邮件而没有来自我的Android应用程序的意图。我正在关注这个问题: Sending Email in Android using JavaMail API without using the default/built-in app

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 = {"sender@gmail.com"}; 
                      m.setTo(toArr); 
                      m.setFrom("wooo@wooo.com"); 
                      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();
}

课程如下:

public class Mail {          private String _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 个答案:

答案 0 :(得分: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);
        }
    }