16

Hi I am developing an android app which will send mail on click of a button. Code worked at first but due to some reason its not working now. Could anyone please help me with this? xyz@outlook.com is the recipient. abc@gmail.com is the sender. I have hard coded the subject and the body of the mail.

package com.example.clc_construction;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import android.app.Activity;
import android.app.ProgressDialog;  
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;


public class Email extends Activity
{
public String jobNo;
public String teamNo;
private static final String username = "abc@gmail.com";
private static final String password = "000000";
private static final String emailid = "xyz@outlook.com";
private static final String subject = "Photo";
private static final String message = "Hello";
private Multipart multipart = new MimeMultipart();
private MimeBodyPart messageBodyPart = new MimeBodyPart();
public File mediaFile;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera_screen);
    Intent intent = getIntent();
    jobNo = intent.getStringExtra("Job_No");
    teamNo = intent.getStringExtra("Team_No"); 
    sendMail(emailid,subject,message);

}
private void sendMail(String email, String subject, String messageBody)
 {
        Session session = createSessionObject();

        try {
            Message message = createMessage(email, subject, messageBody, session);
            new SendMailTask().execute(message);
        }
        catch (AddressException e)
        {
            e.printStackTrace();
        }
        catch (MessagingException e)
        {
            e.printStackTrace();
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
    }


private Session createSessionObject()
{
    Properties properties = new Properties();
    properties.put("mail.smtp.auth", "true");
    properties.put("mail.smtp.starttls.enable", "true");
    properties.put("mail.smtp.host", "smtp.gmail.com");
    properties.put("mail.smtp.port", "587");

    return Session.getInstance(properties, new javax.mail.Authenticator()
    {
        protected PasswordAuthentication getPasswordAuthentication()
        {
            return new PasswordAuthentication(username, password);
        }
    });
}

private Message createMessage(String email, String subject, String messageBody, Session session) throws 

MessagingException, UnsupportedEncodingException
{
    Message message = new MimeMessage(session);
    message.setFrom(new InternetAddress("xzy@outlook.com", "Naveed Qureshi"));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(email, email));
    message.setSubject(subject);
    message.setText(messageBody);
    return message;
}



public class SendMailTask extends AsyncTask<Message, Void, Void>
{
    private ProgressDialog progressDialog;

    @Override
    protected void onPreExecute()
    {
        super.onPreExecute();
        progressDialog = ProgressDialog.show(Email.this, "Please wait", "Sending mail", true, false);
    }

    @Override
    protected void onPostExecute(Void aVoid)
    {
        super.onPostExecute(aVoid);
        progressDialog.dismiss();
    }

    protected Void doInBackground(javax.mail.Message... messages)
    {
        try
        {
            Transport.send(messages[0]);
        } catch (MessagingException e)
        {
            e.printStackTrace();
        }
        return null;
    }
}
}
King of Masses
  • 18,405
  • 4
  • 60
  • 77
Naveed
  • 177
  • 1
  • 1
  • 7

6 Answers6

23

Put in your manifest file,

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

check if you have internet connection,

public boolean isOnline() {
    ConnectivityManager cm =
        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    }
    return false;
}

and finnaly use this code to send email

final String username = "username@gmail.com";
final String password = "password";

Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");

Session session = Session.getInstance(props,
  new javax.mail.Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password);
    }
  });
    try {
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("from-email@gmail.com"));
        message.setRecipients(Message.RecipientType.TO,
            InternetAddress.parse("to-email@gmail.com"));
        message.setSubject("Testing Subject");
        message.setText("Dear Mail Crawler,"
            + "\n\n No spam to my email, please!");

        MimeBodyPart messageBodyPart = new MimeBodyPart();

        Multipart multipart = new MimeMultipart();

        messageBodyPart = new MimeBodyPart();
        String file = "path of file to be attached";
        String fileName = "attachmentName"
        DataSource source = new FileDataSource(file);
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName(fileName);
        multipart.addBodyPart(messageBodyPart);

        message.setContent(multipart);

        Transport.send(message);

        System.out.println("Done");

    } catch (MessagingException e) {
        throw new RuntimeException(e);
    }
João Marcos
  • 3,872
  • 1
  • 19
  • 14
  • 1
    Thank you Joao :) it worked. Just a quick question how would i proceed with adding an image which is of type file as an attachment? – Naveed Aug 05 '14 at 11:08
  • Could you help me if possible? – Naveed Aug 05 '14 at 11:44
  • 13
    just an extra note for newbs like myself - this code requires the javamail library and Net Beans Activation Framework be added to the project – duggulous May 14 '15 at 23:19
  • Thanks @duggulous , your hint really helped – Milad Metias Jan 11 '16 at 08:03
  • in `isOnline`, is it really advisable to expect the `isConnectedOrConnecting` status? I've used `isConnected` because there is no guarantee that the connect*ing* status ever completes, or completes fast enough that by the time the smtp handshake is initiated, the connection is actually available. – Cee McSharpface Jul 28 '17 at 12:29
  • Is there any way to send to multiple e-mail IDs in TO and multiple e-mail IDs in CC – Anish Kumar May 06 '18 at 16:58
2

config gradle as per below define get reference from Here

repositories { 
     jcenter()
     maven {
         url "https://maven.java.net/content/groups/public/"
     }
}

dependencies {
     compile 'com.sun.mail:android-mail:1.5.5'
     compile 'com.sun.mail:android-activation:1.5.5'
}

android {
   packagingOptions {
       pickFirst 'META-INF/LICENSE.txt' // picks the JavaMail license file
   }
}

Add this async task to send mail

 public class sendemail extends AsyncTask<String, Integer, Integer> {

    ProgressDialog progressDialog;
    private StringBuilder all_email;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog = new ProgressDialog(GetuserActivity.this);
        progressDialog.setMessage("Uploading, please wait...");
        progressDialog.show();
        if (selecteduser_arr != null) {
            all_email = new StringBuilder();
            for (int i = 0; i < selecteduser_arr.size(); i++) {
                if (i == 0) {
                    all_email.append(selecteduser_arr.get(i));
                } else {
                    String temp = "," + selecteduser_arr.get(i);
                    all_email.append(temp);
                }
            }
        }
    }

    @Override
    protected Integer doInBackground(String... strings) {

        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");

        Session session = Session.getDefaultInstance(props,
                new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication("enterhereyouremail", "enterherepassword");
                    }
                });

        try {

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("enterhereyouremail"));
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse("sendermail@gmail.com,sendermail2@gmail.com"));
            message.setSubject("Testing Subject");
            message.setText("Dear Mail Crawler," +
                    "\n\n No spam to my email, please!");

            Transport.send(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
        return 1;
    }

    @Override
    protected void onPostExecute(Integer integer) {
        super.onPostExecute(integer);
        progressDialog.dismiss();
    }
}
Manthan Patel
  • 1,784
  • 19
  • 23
0

Since you say it worked previously, your app should already be having internet permission and other necessary permissions.

  1. Check if the current phone you are trying has proper mobile Data /Internet
  2. If connected via wi-fi, check if any new firewall restriction is not allowing the mail to be sent.
ngrashia
  • 9,869
  • 5
  • 43
  • 58
0

Try to use port 465

 private Session createSessionObject()
    {
        Properties properties = new Properties();
        properties.setProperty("mail.smtp.auth", "true");
        properties.setProperty("mail.smtp.starttls.enable", "true");
        properties.setProperty("mail.smtp.host", "smtp.gmail.com");
        properties.setProperty("mail.smtp.port", "465");

        return Session.getInstance(properties, new javax.mail.Authenticator()
        {
            protected PasswordAuthentication getPasswordAuthentication()
            {
                return new PasswordAuthentication(username, password);
            }
        });
    }
Ariles
  • 333
  • 1
  • 14
Ludger
  • 362
  • 3
  • 16
0

I don't think you have to bombard your android source code with SMTP logic.

Here is what you can do instead :

  1. Create a web service in php using PHP MAILER

  2. Use retrofit to call the webservice.

  3. Email sent succesfully!

Php mailer is really easy to use and send your emails.Here are some examples:

Tutorial 1

Tutorial 2

  • The bad news is that you need a web server for doing this!
Kwnstantinos Nikoloutsos
  • 1,832
  • 4
  • 18
  • 34
  • Sending email via authenticated SMTP is very lightweight. No need to complicate things unnecessarily. – rustyx Jun 27 '20 at 16:38
  • @rustyx I would not say that it complicates things but in my opinion this way may be useful for someone reading this post! Also you can reuse that webservice in different applications! – Kwnstantinos Nikoloutsos Jun 27 '20 at 19:07
0

Here's the code in Kotlin.
Make sure to enable less secure app access in Gmail. To use secure access you will need to use OAUTH 2.
read more at: OAuth 2.0 Mechanism

    val username = "username"
    val password = "email@gmail.com"
    try {
        val props = Properties()
        props["mail.smtp.auth"] = "true"
        props["mail.smtp.starttls.enable"] = "true"
        props["mail.smtp.host"] = "smtp.gmail.com"
        props["mail.smtp.port"] = "587"

        val session = Session.getInstance(props, object : Authenticator() {
            override fun getPasswordAuthentication(): PasswordAuthentication? {
                return PasswordAuthentication(username, password)
            }
        })

        val message = MimeMessage(session)
        message.setFrom(username)
        message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("email@gmail.com"))
        message.subject = "Automated Violation Detection Email";
        message.setText(
            "Your Text"
                    
        )

        Thread {
            Transport.send(message)
        }.start()
    } catch (e: Exception) {
        println("Error: $e")
        showToastLong("Oops! Something Went Wrong! Please Try Again")
    }
Kasun Thilina
  • 1,523
  • 2
  • 14
  • 20