0

i am creating android application that send email in background without user interaction i had downloaded the three .jar files as the examples said and added to the manifest file the permission of INTERNET .

but the system display errors can anyone help me to fix this errors

its my first time dealing with email application

logcat

01-13 23:05:20.028: E/MailApp(4357): Could not send email
01-13 23:05:20.028: E/MailApp(4357): android.os.NetworkOnMainThreadException
01-13 23:05:20.028: E/MailApp(4357):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
01-13 23:05:20.028: E/MailApp(4357):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
01-13 23:05:20.028: E/MailApp(4357):    at java.net.InetAddress.getLocalHost(InetAddress.java:365)
01-13 23:05:20.028: E/MailApp(4357):    at javax.mail.internet.InternetAddress.getLocalAddress(InternetAddress.java:517)
01-13 23:05:20.028: E/MailApp(4357):    at javax.mail.internet.UniqueValue.getUniqueMessageIDValue(UniqueValue.java:99)
01-13 23:05:20.028: E/MailApp(4357):    at javax.mail.internet.MimeMessage.updateMessageID(MimeMessage.java:2054)
01-13 23:05:20.028: E/MailApp(4357):    at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2076)
01-13 23:05:20.028: E/MailApp(4357):    at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2042)
01-13 23:05:20.028: E/MailApp(4357):    at javax.mail.Transport.send(Transport.java:117)
01-13 23:05:20.028: E/MailApp(4357):    at com.devleb.emaildemoinbackground.GMailSender.send(GMailSender.java:105)
01-13 23:05:20.028: E/MailApp(4357):    at com.devleb.emaildemoinbackground.MainActivity$1.onClick(MainActivity.java:36)
01-13 23:05:20.028: E/MailApp(4357):    at android.view.View.performClick(View.java:4240)
01-13 23:05:20.028: E/MailApp(4357):    at android.view.View$PerformClick.run(View.java:17721)
01-13 23:05:20.028: E/MailApp(4357):    at android.os.Handler.handleCallback(Handler.java:730)
01-13 23:05:20.028: E/MailApp(4357):    at android.os.Handler.dispatchMessage(Handler.java:92)
01-13 23:05:20.028: E/MailApp(4357):    at android.os.Looper.loop(Looper.java:137)
01-13 23:05:20.028: E/MailApp(4357):    at android.app.ActivityThread.main(ActivityThread.java:5103)
01-13 23:05:20.028: E/MailApp(4357):    at java.lang.reflect.Method.invokeNative(Native Method)
01-13 23:05:20.028: E/MailApp(4357):    at java.lang.reflect.Method.invoke(Method.java:525)
01-13 23:05:20.028: E/MailApp(4357):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
01-13 23:05:20.028: E/MailApp(4357):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-13 23:05:20.028: E/MailApp(4357):    at dalvik.system.NativeStart.main(Native Method)

MainActivity.java

package com.devleb.emaildemoinbackground;


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

public class MainActivity extends Activity {

     @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);

            Button addImage = (Button) findViewById(R.id.btn);
            addImage.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view) {


                    GMailSender mailsender = new GMailSender("sender@gmail.com", ".........");

                    String[] toArr = { "receiver@gmail.com"};
                    mailsender.set_to(toArr);
                    mailsender.set_from("sender@gmail.com");
                    mailsender.set_subject("This is an email sent using my Mail JavaMail wrapper from an Android device.");
                    mailsender.setBody("Email body.");

                    try {
                        //mailsender.addAttachment("/sdcard/filelocation");

                        if (mailsender.send()) {
                            Toast.makeText(MainActivity.this,
                                    "Email was sent successfully.",
                                    Toast.LENGTH_LONG).show();
                        } else {
                            Toast.makeText(MainActivity.this, "Email was not sent.",
                                    Toast.LENGTH_LONG).show();
                        }
                    } catch (Exception e) {

                        Log.e("MailApp", "Could not send email", e);
                    }
                }
            });

        }
    }

GmailSender.java

package com.devleb.emaildemoinbackground;



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.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 GMailSender 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 GMailSender() {
        _host = "smtp.gmail.com"; // default smtp server
        _port = "465"; // default smtp port
        _sport = "465"; // default socketfactory port

        _user = "sender@gmail.com"; // username
        _pass = "..........."; // password
        _from = "receive@gmail.com"; // email sent from
        _subject = ""; // email subject
        _body = "test email message sended!!"; // 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 GMailSender(String user, String pass) {
        this();

        _user = user;
        _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 javax.mail.PasswordAuthentication getPasswordAuthentication() {
        return  new javax.mail.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_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_subject() {
        return _subject;
    }

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

    }
Christoph Wintersteiger
  • 8,234
  • 1
  • 16
  • 30
user3006788
  • 165
  • 1
  • 14
  • 30

1 Answers1

0

NetworkOnMainThreadException: The exception that is thrown when an application attempts to perform a networking operation on its main thread.

Simply saying the tutorial you have followed is quite dated appears to be from 2010. Either find a tutorial which uses async for email sending or modify the code yourself so that it uses async. Async has been introduced quite some time ago and as a result everything dealing with network has to be implemented using it.

here is link that illustrates how to use asynctask

NetworkOnMainThreadException Reference Post

Possible Answer Post
Sending Email Tutorial August 2013

Community
  • 1
  • 1
f78xd23
  • 117
  • 2
  • 15