0

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

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?

Community
  • 1
  • 1
gsb
  • 5,520
  • 8
  • 49
  • 76

1 Answers1

1

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);
        }
    }
Joel
  • 4,732
  • 9
  • 39
  • 54
  • yes _to was not initialized. I did that but still i am not able to send emails using this code. I have updated the code. – gsb Jun 12 '12 at 22:04
  • Well what error are you getting now? And what is on the line where the error is occurring? Also, in the code above, _to is still null because 'public void setTo(String[] toArr)' is still not implemented. Not sure if you meant to change that or not. – Joel Jun 12 '12 at 22:10
  • It says "AuthenticationFailed". I checked and my email and password are correct. And i have updated my code again. – gsb Jun 12 '12 at 22:25
  • that worked too. Thanks a lot. Now it says "failed to connect to smtp at port 465. Connection refused" Do you think it is because my firewall is blocking it? – gsb Jun 12 '12 at 23:16
  • Yes that is most likely the case. I know this is a pain, if you would like to look at a class I wrote for this I would be glad to email it to you. – Joel Jun 13 '12 at 02:53
  • if you can do that, it wold be great! can you email it to internatmint[at]gmail[dot]com – gsb Jun 13 '12 at 17:17
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/12506/discussion-between-ghbhatt-and-joel) – gsb Jun 13 '12 at 18:31