9

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("ars@gmail.com", "123abc-123abc");
                sender.sendMail("ARS",
                        "This is Body HEELO WORLD",
                        "ars@gmail.com",
                        "reciever@gmail.com");
                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.

Community
  • 1
  • 1
Hassnain
  • 154
  • 1
  • 2
  • 17
  • 5
    im not quite sure what the problem is, but just a heads up you should never hardcode passwords in your app. im not sure if thats what you were going to do, but just letting you know its very easy for people to find that stuff. – Tomer Shemesh Apr 21 '15 at 18:59
  • I have added a followed question link, the code is same and is working for many people as mentioned over there. The problem is may be with adding the .jar files in android studio. If you think the problem is in there. Can you kindly rectify it. But in case if the problem is some other thing. Please help me in that as well. I am dying solving this issue :( – Hassnain Apr 21 '15 at 19:03
  • Your jar files should be correct because otherwise it shouldn't compile if they were missing. You can post your app modules build.gradle file if you want that verified though. – Nicholas Hall Apr 21 '15 at 19:08
  • I have added build.gradle in my question as well.. Kindly verify it if my .jar are correct or not – Hassnain Apr 21 '15 at 19:15
  • I have also tried to post the screen shots of how i added my .jar files. But stackoverflow doesn't allow to to post images under 10 points reputation. :( – Hassnain Apr 21 '15 at 19:17
  • The relevant part of your build.gradle file is: compile fileTree(dir: 'libs', include: ['*.jar']) This will include all jar files in app/libs correctly. This line is added by default, but sometimes people remove it, so you should be good in that regard. – Nicholas Hall Apr 21 '15 at 19:33
  • So, it means there is no problem with my .jar files.. Now what i think is may be the problem is with "JSSEProvider.java".. If you follow the Link question. It is not mentioned anywhere that you should create this class. But because of its first line i.e. "public final class JSSEProvider extends Provider" .. i presumed that it should be a class. So i made a class.. And it compiled with no error.. This could be a problem ? – Hassnain Apr 21 '15 at 19:40
  • Your JSSEProvider.java appears to be correct from a purely syntax and structure perspective as I do not have any experience sending emails through Gmail like this. – Nicholas Hall Apr 21 '15 at 20:37
  • It is creating mess for me .. Please help me either. If you have any clue. – Hassnain Apr 21 '15 at 20:50

3 Answers3

4

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 .

Soroush
  • 116
  • 7
  • It would be lovable if you could tell me any tutorial video link etc; to do that in android studio. Because I am an absolute beginner. – Hassnain Apr 21 '15 at 19:26
  • Mandrill provide a support to be used in Android Studio? – Hassnain Apr 21 '15 at 19:48
  • @hunny Android studio is just IDE , mandrill provide you an API that you can send your request to it from android , php , python and whatever you what :) – Soroush Apr 21 '15 at 19:53
  • @hunny20006 I edit my answer to show you how implement this , if it helps you please vote up and if also it resolves you problem mark me accepted answer :) – Soroush Apr 21 '15 at 19:55
  • O.k let me work on it .. If it works for me ... But please let me know.. Does it require any imports or not ? or should i use your code as it with with modifications ? – Hassnain Apr 21 '15 at 19:59
  • @hunny20006 yes , you can use my code with modifications , but remember before doing anything you should sign up in mandrill site and get key to put it in this statment `jsonObject.put("key", "********************");` – Soroush Apr 21 '15 at 20:05
  • I have created an account and got my key as well. But when i use your code. I indicates jsonObject errors.. Many errors infact. Is there any .jar file to include or what? I am confused in using it. – Hassnain Apr 21 '15 at 20:49
  • no you dont need to add any extra .jar file to do this , you just need to correctly create your jsonObject and send it , by the way my code is work fine for me and i dont use any additional jar file or lib :) @hunny20006 – Soroush Apr 22 '15 at 08:15
  • Hey brother can you please give me a working code under button click to send an email. Please please please.. Its been a week .. I am in big big trouble now :( :( :( ... please.. – Hassnain Apr 23 '15 at 13:13
  • i call `sendEmail()` in side of onclick method of button and it work fine for me :/ , if you get error i need more information about that to helping you ! let me see your error ! @hunny20006 – Soroush Apr 23 '15 at 13:21
  • Now Please Explain me what is "**1. URL**, **2. text.gettext()**, **3. htmltext.gettext()** in **sendEmail();** method. What values should i Provide There. Secondly in **makeMandrillRequest()** method in _try_ block there is **messageObj.put("subject", "testSubject");** this thing, so where should i edit. _subject_ or _testSubject_ ? Please reply me ASAP – Hassnain Apr 23 '15 at 18:27
  • Finally, Finally, Finally, After spending 100+ hours. I am able to send an email with the use of Mandrill API. Thankyou so so so much **Soroush** for your kind help. But Now the problem is: I want to compose my email with some **Bold** , _Italic_ and **Colour** kind of things. Please tell me how can i do that using Mandrillapp? @Soroush – Hassnain Apr 23 '15 at 21:53
  • really happy to hear that man :) , i glad that i could help , you can use html tag for doing what you want to do , ` messageObj.put("html", htmlText);` you can use html that in this field for bold and basically you just need to create your custom text in html format :) if you had problem with that let me know :) .@hunny20006 – Soroush Apr 24 '15 at 15:28
  • also i will appreciate that if you make my answer as accepted answer and vote me up , if it could help you to solve you problem , maybe it could help other guys too , tnx in advance :) @hunny20006 – Soroush Apr 24 '15 at 15:28
  • I tried to vote it up,. But it require 15 point reputation to vote up your answer. I am on 14 now. As soon as i'll reach 15. I'll mark it as accepted answer. – Hassnain Apr 24 '15 at 17:39
  • ooo i see , but you still can accept my answer as accepted answer and you dont need any reputation for that :) this link show how you can do that http://meta.stackoverflow.com/a/251399/2329972 @hunny20006 – Soroush Apr 24 '15 at 19:13
  • hi Soroush, i want to know some things about Mandrill, which is it opensource? and should have any limitation for sending mail per day? – siva Apr 04 '16 at 13:57
  • it's not free , why should we buy such a service , if we can make our own ? – Zulqurnain Jutt Aug 27 '16 at 11:09
  • i used your library but this how me mail "status":"queued" not send mail. i used script you mention in github and i remove attachments. but still email not sending. and i tried your above code also but some classes are not resolved by android studio. – Sahan Pasindu Nirmal Oct 06 '18 at 15:44
1

Your GMailSender.java code is full of these common JavaMail mistakes.

Make sure you're using the latest version of JavaMail.

You don't need ByteArrayDataSource because JavaMail includes it.

To find out what's happening to your message, it would help to enable JavaMail Session debugging. The debug output might provide some clues.

But really, you should think about whether sending the email from your client application is the right approach. If your client application is interacting with your web site for some sort of "signup activity", it would be far better for the email to be sent as a result of the activity on the server. To do this on the client you either need to hardwire the password for your Gmail account into the client, or you need to ask the user of the app for their Gmail account and password.

Bill Shannon
  • 29,579
  • 6
  • 38
  • 40
  • Can you point out the line of mistake in my code ? And i have no website for this application. And i really need to send an email to client only with application. – Hassnain Apr 21 '15 at 20:22
  • I have taken the code from Link provided in the question. And is working for many people. I am afraid of the fact that. I have made no changes in it. And its still not sending emails. :( – Hassnain Apr 21 '15 at 20:25
  • 1
    Sorry, I'm not going to write your code for you. There's lots more [sample code on the JavaMail web site](https://java.net/projects/javamail/pages/Home#Samples) and the [JavaMail FAQ](http://www.oracle.com/technetwork/java/javamail/faq/index.html). It's hard to tell if the problem is in your code or something else without seeing the JavaMail debug out. – Bill Shannon Apr 22 '15 at 18:24
  • I am not saying to code for me.. I have posted the code the code above. My only mission here is to find an error. As far as debug is concerned its not identifying any error. – Hassnain Apr 22 '15 at 20:41
1

I think you need to do two things: 1. Add your all network code in async task because android support single thread model. SO if you directly run your sending email on main ui thread that may freeze your app. 2. You can use check your gmail setting where you can enable your security. So that you can receive it from app. Please follow the below links if you are interested in using java libs for sending email.. http://www.javatpoint.com/java-mail-api-tutorial

Ashutosh Srivastava
  • 103
  • 1
  • 1
  • 10
  • Thanks for your answer, but mandrill is way better and easier way to send email. BTW this post has been answered year ago :) – Hassnain Jan 20 '16 at 15:22