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
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.
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 .
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With