0

我正在使用 JavaMail APi 发送电子邮件,而我的 android 应用程序没有意图。我正在关注这个问题: 使用 JavaMail API 在 Android 中发送电子邮件而不使用默认/内置应用程序

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();
}

课程如下:

公共类邮件 { 私人字符串 _user; 私有字符串_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)

我错过了什么吗?

4

1 回答 1

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);
        }
    }
于 2012-06-12T21:40:33.133 回答