Sending Email Without a User Interaction - Android Studio

Motivation: I create an account, and I need to send an automatic email when I click a button. I have a number of blog related questions, stackoverflow and cannot send an email so far.

Workspace: Android Studio 1.2 Beta 3

Currently the next question is: Sending email on Android using the JavaMail API without using a standard / embedded application

Now here is what I did:

Three jar files uploaded

  • activation.jar
  • additional.jar
  • mail.jar

Then I copied the three jar files in the following folder:

G: \ Android Projects \ Email \ Application \ libs \

After copying the files, I found my .jar files, pointing to "Project Explorer" in Android Studio, and then changing my tree view from "Android" to "Project"

Then expand the tree Project> app> libs>

After searching for files; in every .jar file I made: Right click -> Add as Library

After the graddle build was complete, I then copied the code from above, following the Question and completing my own project. It compiled without errors.

Now the problem is:

When I run the program, it displays a toast message "The email was sent successfully", but I never receive an email and there are no emails sent in my account.

Here is 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') } 

Could you help me determine where I am doing the wrong thing.

Because for three days I got stuck there. And failed to receive the email.

+6
source share
3 answers

this is not the answer to your question, but I think it might be useful

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

I use mandrill api to send email in my application

First of all, you create an account on the mandrill website, then you fill in the data that should be in json format, like what you see in this link https://mandrillapp.com/api/docs/messages.html#method= send

and after that, issue HTTP POST requests that contain your json for 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 will simplify its implementation.

+4
source

Your GMailSender.java code is filled with these common JavaMail errors .

Make sure you are using the latest version of JavaMail .

You do not need a ByteArrayDataSource because JavaMail includes it .

To find out what happens to your message, this will help enable JavaMail session debugging . Debugging output may give some clues.

But in fact, you should consider whether sending email from your client application is the right approach. If your client application interacts with your website for some kind of “registration activity”, it would be much better to send an email as a result of activity on the server. To do this on the client, you need to either fix the password for your Gmail account on the client, or ask the application user for the Gmail account and password.

+1
source

I think you need to do two things: 1. Add all the network code to the async task, because the android supports a single-thread model. SO, if you directly run your sending email address on the main ui stream, which can freeze your application. 2. You can check your gmail settings, where you can enable your security. So you can get it from the application. Please follow the links below if you are interested in using java libs to send email. http://www.javatpoint.com/java-mail-api-tutorial

0
source

Source: https://habr.com/ru/post/985632/


All Articles