gsb
gsb

Reputation: 5640

Email not sent | Using JavaMail API for Android

I am using JavaMail APi for sending email without the intent from my android app. i am following the question: Sending Email in Android using JavaMail API without using the default/built-in app

and

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

Here is my code. On the button click following is the code:

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

The class is as follows:

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

When i click the button on my android device, it gives me the following errors:

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)

Am I missing something?

Upvotes: 0

Views: 1615

Answers (1)

Joel
Joel

Reputation: 4772

Which line is line 280 in your class? It should be in your Mail.send() function. That is where the null pointer is. It would be helpful to know what that is.

It looks like _to was never initialized...

Haha no worries man it took me months to get a working email client out of javamail. When you create your session, you should pass it an authentication object..

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

Upvotes: 1

Related Questions