Could not send email - java.lang.Nullpointerexception Android

Asked

Viewed 197 times

0

I’m following this tutorial

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

after I ran on my Android phone it generated this error on Logcat;

02-27 08:47:14.592: D/ActivityThread(27680): setTargetHeapUtilization:0.25
02-27 08:47:14.592: D/ActivityThread(27680): setTargetHeapIdealFree:8388608
02-27 08:47:14.592: D/ActivityThread(27680): setTargetHeapConcurrentStart:2097152
02-27 08:47:15.522: D/libEGL(27680): loaded /system/lib/egl/libEGL_adreno200.so
02-27 08:47:15.642: D/libEGL(27680): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
02-27 08:47:15.642: D/libEGL(27680): loaded /system/lib/egl/libGLESv2_adreno200.so
02-27 08:47:15.702: I/Adreno200-EGL(27680): <qeglDrvAPI_eglInitialize:299>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_JB_REL_2.0.3.04.01.02.21.119_msm8625_JB_REL_2.0.3_CL3357771_release_AU (CL3357771)
02-27 08:47:15.702: I/Adreno200-EGL(27680): Build Date: 04/04/13 Thu
02-27 08:47:15.702: I/Adreno200-EGL(27680): Local Branch: 
02-27 08:47:15.702: I/Adreno200-EGL(27680): Remote Branch: m/jb_rel_2.0.3
02-27 08:47:15.702: I/Adreno200-EGL(27680): Local Patches: NONE
02-27 08:47:15.702: I/Adreno200-EGL(27680): Reconstruct Branch: AU_LINUX_ANDROID_JB_REL_2.0.3.04.01.02.21.119 +  NOTHING
02-27 08:47:15.802: D/OpenGLRenderer(27680): Enabling debug mode 0
02-27 08:47:27.672: E/MailApp(27680): Could not send email
02-27 08:47:27.672: E/MailApp(27680): java.lang.NullPointerException
02-27 08:47:27.672: E/MailApp(27680):   at com.sofblue.activity.Mail.send(Mail.java:83)
02-27 08:47:27.672: E/MailApp(27680):   at com.sofblue.activity.Login.enviar(Login.java:47)
02-27 08:47:27.672: E/MailApp(27680):   at java.lang.reflect.Method.invokeNative(Native Method)
02-27 08:47:27.672: E/MailApp(27680):   at java.lang.reflect.Method.invoke(Method.java:511)
02-27 08:47:27.672: E/MailApp(27680):   at android.view.View$1.onClick(View.java:3675)
02-27 08:47:27.672: E/MailApp(27680):   at android.view.View.performClick(View.java:4191)
02-27 08:47:27.672: E/MailApp(27680):   at android.view.View$PerformClick.run(View.java:17229)
02-27 08:47:27.672: E/MailApp(27680):   at android.os.Handler.handleCallback(Handler.java:615)
02-27 08:47:27.672: E/MailApp(27680):   at android.os.Handler.dispatchMessage(Handler.java:92)
02-27 08:47:27.672: E/MailApp(27680):   at android.os.Looper.loop(Looper.java:137)
02-27 08:47:27.672: E/MailApp(27680):   at android.app.ActivityThread.main(ActivityThread.java:4960)
02-27 08:47:27.672: E/MailApp(27680):   at java.lang.reflect.Method.invokeNative(Native Method)
02-27 08:47:27.672: E/MailApp(27680):   at java.lang.reflect.Method.invoke(Method.java:511)
02-27 08:47:27.672: E/MailApp(27680):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
02-27 08:47:27.672: E/MailApp(27680):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
02-27 08:47:27.672: E/MailApp(27680):   at dalvik.system.NativeStart.main(Native Method)

my Login class

package com.sofblue.activity;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.example.login1.R;

public class Login extends Activity {
    private Button btnEnviar;

    Mail m = new Mail("[email protected]", "password");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        btnEnviar = (Button) findViewById(R.id.btnEnviar);
    }

    public void enviar(View view) {

        new Thread(new Runnable() {

            @Override
            public void run() {

                String[] toArr = { "[email protected]", "[email protected]" };
                m.set_to(toArr);
                m.set_from("[email protected]");
                m.set_subject("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(this, "Email was sent successfully.",
                        Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(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);
        }
    }

}

my Mail class

package com.sofblue.activity;

import java.util.Date; 
import java.util.Properties; 

import javax.activation.CommandMap; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.activation.MailcapCommandMap; 
import javax.mail.BodyPart; 
import javax.mail.Multipart; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 



public class Mail extends javax.mail.Authenticator {

    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 = ""; // username 
        _pass = ""; // password 
        _from = ""; // email sent from 
        _subject = ""; // email subject 
        _body = ""; // 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 Mail(String user, String pass) { 
        this(); 

        this._user = user; 
        this._pass = pass; 
      } 


    public boolean send() throws Exception { 
        Properties props = _setProperties(); 

        if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
          Session session = Session.getInstance(props, this); 

          MimeMessage msg = new MimeMessage(session); 

          msg.setFrom(new InternetAddress(_from)); 

          InternetAddress[] addressTo = new InternetAddress[_to.length]; 
          for (int i = 0; i < _to.length; i++) { 
            addressTo[i] = new InternetAddress(_to[i]); 
          } 
            msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 

          msg.setSubject(_subject); 
          msg.setSentDate(new Date()); 

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

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

    public String get_user() {
        return _user;
    }

    public void set_user(String _user) {
        this._user = _user;
    }

    public String get_pass() {
        return _pass;
    }

    public void set_pass(String _pass) {
        this._pass = _pass;
    }

    public String[] get_to() {
        return _to;
    }

    public void set_to(String[] _to) {
        this._to = _to;
    }

    public String get_from() {
        return _from;
    }

    public void set_from(String _from) {
        this._from = _from;
    }

    public String get_port() {
        return _port;
    }

    public void set_port(String _port) {
        this._port = _port;
    }

    public String get_sport() {
        return _sport;
    }

    public void set_sport(String _sport) {
        this._sport = _sport;
    }

    public String get_host() {
        return _host;
    }

    public void set_host(String _host) {
        this._host = _host;
    }

    public String get_subject() {
        return _subject;
    }

    public void set_subject(String _subject) {
        this._subject = _subject;
    }

    public String get_body() {
        return _body;
    }

    public void set_body(String _body) {
        this._body = _body;
    }

    public boolean is_auth() {
        return _auth;
    }

    public void set_auth(boolean _auth) {
        this._auth = _auth;
    }

    public boolean is_debuggable() {
        return _debuggable;
    }

    public void set_debuggable(boolean _debuggable) {
        this._debuggable = _debuggable;
    }

    public Multipart get_multipart() {
        return _multipart;
    }

    public void set_multipart(Multipart _multipart) {
        this._multipart = _multipart;
    } 






}

all indicates that the error is here in the Login class

   if (m.send()) {
                Toast.makeText(this, "Email was sent successfully.",
                        Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(this, "Email was not sent.", Toast.LENGTH_LONG)
                        .show();
            }
        } catch (Exception e) {
             Toast.makeText(this,
             "There was a problem sending the email.",
             Toast.LENGTH_LONG).show();
            Log.e("MailApp", "Could not send email", e);
        }

and in the Main class

public boolean send() throws Exception { 
        Properties props = _setProperties(); 

        if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
          Session session = Session.getInstance(props, this); 

          MimeMessage msg = new MimeMessage(session); 

          msg.setFrom(new InternetAddress(_from)); 

          InternetAddress[] addressTo = new InternetAddress[_to.length]; 
          for (int i = 0; i < _to.length; i++) { 
            addressTo[i] = new InternetAddress(_to[i]); 
          } 
            msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 

          msg.setSubject(_subject); 
          msg.setSentDate(new Date()); 

          // setup message body 
          BodyPart messageBodyPart = new MimeBodyPart(); 
          messageBodyPart.setText(_body); 
          _multipart.addBodyPart(messageBodyPart); 

but I don’t know how to fix it.

accept suggestions;

  • It seems that the Mail m is null, check if it is being created properly...

1 answer

1

It seems the attribute _to is void.

You try to use it on this line:

if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 

This causes a Nullpointerexception.

The problem seems to be in class Login, more precisely in the method enviar. You’re creating a thread to fill in the email recipient, sender, and subject, but you never run the thread.

To resolve, replace this code snippet:

new Thread(new Runnable() {

    @Override
    public void run() {

        String[] toArr = { "[email protected]", "[email protected]" };
        m.set_to(toArr);
        m.set_from("[email protected]");
        m.set_subject("This is an email sent using my Mail JavaMail wrapper from an Android device.");
        m.setBody("Email body.");

    }
});

For this:

String[] toArr = { "[email protected]", "[email protected]" };
m.set_to(toArr);
m.set_from("[email protected]");
m.set_subject("This is an email sent using my Mail JavaMail wrapper from an Android device.");
m.setBody("Email body.");
  • How should this IF look? Why didn’t _to >>look here && _to.length > 0 &&

  • The if is right. The problem is that in it you test the attribute _to, but he is null

  • how to initialize it?

  • Actually you’re initiating the attribute _to in the method enviar class Login. Only you’re doing it inside another thread, which never runs. I edited my answer, see there.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.