Sending email without user Interaction - Android Studio

Hassnain picture Hassnain · Apr 21, 2015 · Viewed 25.3k times · Source

Motivation: I am Creating a Signup Activity and I need to send an Automatic email under Button Click. I have Followed number of Blogs, stackoverflow questions and unable to send an email so-far.

Working Environment: Android Studio 1.2 Beta 3

Currently Followed Question :Sending Email in Android using JavaMail API without using the default/built-in app

Now Here is What I have Done :

Downloaded three Jar Files

  1. activation.jar
  2. additional.jar
  3. mail.jar

Then i copied three jar files in follwoing folder:

G:\Android Projects\Email\app\libs\

After Copying files i found my .jar files by pointing into "Project Explorer" in Android Studio and then changing my tree view from "Android" to "Project"

Then expanding the tree Project > app > libs >

After finding files; on each .jar file I did: Right click -> Add as Library

Once the graddle build was completed I then copied the code from above followed Question and run into my own project. It compiled without any errors.

Now the Problem is :

When i run a program it shows a toast Message "Email was Sent Successfully" but I never receive an email, Nor there is any sent mails in my account.

Here is all my code for all classes and .xml files

MainActivity.java

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

public class MainActivity extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button send = (Button)findViewById(R.id.send_email);
    send.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub

            try {
                GMailSender sender = new     GMailSender("[email protected]", "123abc-123abc");
                sender.sendMail("ARS",
                        "This is Body HEELO WORLD",
                        "[email protected]",
                        "[email protected]");
                Toast.makeText(MainActivity.this, "Email was sent successfully.", Toast.LENGTH_LONG).show();
            } catch (Exception e) {
                Log.e("SendMail", e.getMessage(), e);
                Toast.makeText(MainActivity.this, "There was a problem   sending the email.", Toast.LENGTH_LONG).show();
            }

        }
    });

}
}

GMailSender.java

package com.example.hassnainmunir.email;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Security;
import java.util.Properties;

class GMailSender extends javax.mail.Authenticator {
private String mailhost = "smtp.gmail.com";
private String user;
private String password;
private Session session;

static {
    Security.addProvider(new JSSEProvider());
}

public GMailSender(String user, String password) {
    this.user = user;
    this.password = password;

    Properties props = new Properties();
    props.setProperty("mail.transport.protocol", "smtp");
    props.setProperty("mail.host", mailhost);
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.port", "465");
    props.put("mail.smtp.socketFactory.port", "465");
    props.put("mail.smtp.socketFactory.class",
            "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.socketFactory.fallback", "false");
    props.setProperty("mail.smtp.quitwait", "false");

    session = Session.getDefaultInstance(props, this);
}

protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(user, password);
}

public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception {
    try{
        MimeMessage message = new MimeMessage(session);
        DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));
        message.setSender(new InternetAddress(sender));
        message.setSubject(subject);
        message.setDataHandler(handler);
        if (recipients.indexOf(',') > 0)
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));
        else
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));
        Transport.send(message);
    }catch(Exception e){
            e.printStackTrace();
    }
}

public class ByteArrayDataSource implements DataSource {
    private byte[] data;
    private String type;

    public ByteArrayDataSource(byte[] data, String type) {
        super();
        this.data = data;
        this.type = type;
    }

    public ByteArrayDataSource(byte[] data) {
        super();
        this.data = data;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getContentType() {
        if (type == null)
            return "application/octet-stream";
        else
            return type;
    }

    public InputStream getInputStream() throws IOException {
        return new ByteArrayInputStream(data);
    }

    public String getName() {
        return "ByteArrayDataSource";
    }

    public OutputStream getOutputStream() throws IOException {
        throw new IOException("Not Supported");
    }
}
}

JSSEProvider.java

package com.example.hassnainmunir.email;

import java.security.AccessController;
import java.security.Provider;

public final class JSSEProvider extends Provider {

public JSSEProvider() {
    super("HarmonyJSSE", 1.0, "Harmony JSSE Provider");
    AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() {
        public Void run() {
            put("SSLContext.TLS",
                    "org.apache.harmony.xnet.provider.jsse.SSLContextImpl");
            put("Alg.Alias.SSLContext.TLSv1", "TLS");
            put("KeyManagerFactory.X509",
                    "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl");
            put("TrustManagerFactory.X509",
                    "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl");
            return null;
        }
    });
}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button android:id="@+id/send_email"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/Send_Email" />
</LinearLayout>

AndroidMenifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.hassnainmunir.email" >
<uses-permission android:name="android.permission.INTERNET"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
</manifest>

Strings.xml

<resources>
<string name="app_name">Email</string>

<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="Send_Email">Send Email</string>
</resources>

build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 21
buildToolsVersion "22.0.0"

defaultConfig {
    applicationId "com.example.hassnainmunir.email"
    minSdkVersion 14
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.0.0'
compile files('libs/activation.jar')
}

Can you please Help me in identifying where i am doing Wrong.

Because its been three days i am stuck in there. And unable to receive an email.

Answer

Soroush picture Soroush · Apr 21, 2015

it's not the answer of your question , but i think it could be helpful

check this out https://mandrillapp.com/api/docs/

i use mandrill api to send email in my application

first of all you create account in mandrill site then you fill data that email should contain in json format like what you see in this link https://mandrillapp.com/api/docs/messages.html#method=send

and after that excute HTTP POST requests that contain your json to this uri : https://mandrillapp.com/api/1.0/messages/send.json

implementation

//**********Method to send email 
public void sendEmail(){ 
                new AsyncTask<Void, Void, Void>() {
                @Override
                protected void onPostExecute(Void result) {
                    Toast.makeText(MainActivity.this,
                            "Your message was sent successfully.",
                            Toast.LENGTH_SHORT).show();

                    super.onPostExecute(result);
                }

                @Override
                protected Void doInBackground(Void... params) {


                        String respond = POST(
                                URL,
                                makeMandrillRequest(fromEmail.getText()
                                        .toString(), toEmail.getText()
                                        .toString(), name.getText()
                                        .toString(), text.getText()
                                        .toString(), htmlText.getText()
                                        .toString()));
                        Log.d("respond is ", respond);


                    return null;
                }
            }.execute();
}

//*********method to post json to uri
    public String POST(String url , JSONObject jsonObject) {
    InputStream inputStream = null;
    String result = "";
    try {


        Log.d("internet json ", "In post Method");
        // 1. create HttpClient
        DefaultHttpClient httpclient = new DefaultHttpClient();
        // 2. make POST request to the given URL
        HttpPost httpPost = new HttpPost(url);
        String json = "";

        // 3. convert JSONObject to JSON to String
        json = jsonObject.toString();

        StringEntity se = new StringEntity(json);

        // 4. set httpPost Entity
        httpPost.setEntity(se);

        // 5. Set some headers to inform server about the type of the
        // content
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-type", "application/json");

        // 6. Execute POST request to the given URL
        HttpResponse httpResponse = httpclient.execute(httpPost);

        // 7. receive response as inputStream
        inputStream = httpResponse.getEntity().getContent();

        // 8. convert inputstream to string
        if(inputStream != null){
            result = convertStreamToString(inputStream);
        }else{
            result = "Did not work!";
            Log.d("json", "Did not work!" );
        }
    } catch (Exception e) {
        Log.d("InputStream", e.toString());
    }

    // 9. return result
    return result;
}





//*****************TO create email json
     private JSONObject makeMandrillRequest(String from, String to, String name,
        String text, String htmlText) {

    JSONObject jsonObject = new JSONObject();
    JSONObject messageObj = new JSONObject();
    JSONArray toObjArray = new JSONArray();
    JSONArray imageObjArray = new JSONArray();
    JSONObject imageObjects = new JSONObject();
    JSONObject toObjects = new JSONObject();

    try {
        jsonObject.put("key", "********************");

        messageObj.put("html", htmlText);
        messageObj.put("text", text);
        messageObj.put("subject", "testSubject");
        messageObj.put("from_email", from);
        messageObj.put("from_name", name);

        messageObj.put("track_opens", true);
        messageObj.put("tarck_clicks", true);
        messageObj.put("auto_text", true);
        messageObj.put("url_strip_qs", true);
        messageObj.put("preserve_recipients", true);

        toObjects.put("email", to);
        toObjects.put("name", name);
        toObjects.put("type", "to");

        toObjArray.put(toObjects);

        messageObj.put("to", toObjArray);
        if (encodedImage != null) {
            imageObjects.put("type", "image/png");
            imageObjects.put("name", "IMAGE");
            imageObjects.put("content", encodedImage);

            imageObjArray.put(imageObjects);
            messageObj.put("images", imageObjArray);
        }

        jsonObject.put("message", messageObj);

        jsonObject.put("async", false);



        Log.d("Json object is ", " " + jsonObject);

    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return jsonObject;
}

also check this library , it could make it easier to implement .