Отправка электронной почты без пользователя Взаимодействие – Android Studio

Мотивация: я создаю учетную запись, и мне нужно отправить автоматическое письмо при нажатии кнопки. У меня есть количество вопросов, связанных с блогами, stackoverflow и не удается отправить электронное письмо так далеко.

Рабочая среда: Android Studio 1.2 Beta 3

В настоящее время следующий вопрос: отправка электронной почты на Android с использованием API JavaMail без использования стандартного / встроенного приложения

Теперь вот что я сделал:

Загружено три файла Jar

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

Затем я скопировал три файла jar в следующей папке:

G: \ Проекты Android \ Электронная почта \ приложение \ libs \

После копирования файлов я нашел файлы .jar, указав в «Project Explorer» в Android Studio, а затем изменив свое древовидное представление с «Android» на «Project»,

Затем расширяем дерево Project> app> libs>

После поиска файлов; На каждом файле .jar, который я сделал: Щелкните правой кнопкой мыши -> Добавить как библиотеку

После того, как сборка graddle была завершена, я затем скопировал код сверху, следуя Вопросу, и запустил свой собственный проект. Он скомпилирован без ошибок.

Теперь проблема:

Когда я запускаю программу, она показывает тост-сообщение «Электронная почта была отправлена ​​успешно», но я никогда не получаю письмо, и в моей учетной записи нет отправленных писем.

Вот мой код для всех классов и .xml файлов

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

Не могли бы вы помочь мне определить, где я делаю неправильный.

Потому что его три дня я застрял там. И не удается получить электронное письмо.

Это не ответ на ваш вопрос, но я думаю, что это может быть полезно

Проверьте это https://mandrillapp.com/api/docs/

Я использую mandrill api для отправки электронной почты в моем приложении

В первую очередь вы создаете учетную запись на сайте mandrill, тогда вы заполняете данные, которые должны содержать в формате json, как то, что вы видите в этой ссылке https://mandrillapp.com/api/docs/messages.html#method=send

И после этого выпустите HTTP POST-запросы, которые содержат ваш json для этого uri: https://mandrillapp.com/api/1.0/messages/send.json

реализация

 //**********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; } 

Также проверьте эту библиотеку , это упростит ее реализацию.

Ваш код GMailSender.java заполнен этими распространенными ошибками JavaMail .

Убедитесь, что вы используете последнюю версию JavaMail .

Вам не нужен ByteArrayDataSource, потому что JavaMail включает его .

Чтобы узнать, что происходит с вашим сообщением, это поможет включить отладку JavaMail Session . Отладочный вывод может дать некоторые подсказки.

Но на самом деле, вы должны подумать о том, является ли отправка электронной почты из вашего клиентского приложения правильным подходом. Если ваше клиентское приложение взаимодействует с вашим веб-сайтом для какой-то «активности регистрации», было бы гораздо лучше отправить сообщение электронной почты в результате активности на сервере. Чтобы сделать это на клиенте, вам нужно либо установить пароль для своей учетной записи Gmail, либо запросить у пользователя приложение для своей учетной записи и пароля Gmail.

Я думаю, вам нужно сделать две вещи: 1. Добавьте весь сетевой код в async-задачу, потому что андроид поддерживает модель с одним потоком. SO, если вы прямо запускаете свое отправляющее сообщение по основному потоку ui, которое может заморозить ваше приложение. 2. Вы можете воспользоваться настройкой gmail, где вы можете включить свою безопасность. Чтобы вы могли получить его из приложения. Пожалуйста, следуйте приведенным ниже ссылкам, если вы заинтересованы в использовании java libs для отправки электронной почты. http://www.javatpoint.com/java-mail-api-tutorial

Intereting Posts
Использование DiskLruCache в android 4.0 не предусматривает метод openCache Представления не отображаются в viewpager Проблема Eclipse при установке нового программного обеспечения Как сделать готовый файл APK для публикации означает экспорт? И каков параметр для установки? Мягкая клавиатура не отображается при запуске Activity Начать новую активность с уведомлений в android Android: выровнять исходный снизу + нижний край Как задать расстояние между рейтинговыми марками звезд android? Android меняет цвет фона для фрагмента предпочтения Как добавить кнопку совместного доступа в Android? Можно ли использовать так много устаревших методов в обратном коде? Получить, какой график выбран для активности Изменение формы сплошной цвет во время выполнения внутри Drawable xml, используемого в качестве фона Кордова Android Upgrade – Не удается найти модуль lodash / object / assign 'Ошибка Открытие фонарика в Android с различными режимами