Вопрос по android, email, mms &#8211 Программирование Android — Отправка почты

Привет хабр и привет всем! В данной статье я покажу как реализуется отправка писем средствами самого Android, а также ещё один более интересный способ, но уже с применением внешней библиотеки, которая позволяет нам отсылать письма более приемлимыми для программиста способами.

Часть 1. Mail, просто Mail

Как это делается: обычно в программу встраивается дополнительная Activity, которая представляет собой окошко с несколькими полями: Кому, Тема и Текст. Далее данные с этих полей передаются как экстра содержимое:

  • android.content.Intent.EXTRA_EMAIL
  • android.content.Intent.EXTRA_SUBJECT
  • android.content.Intent.EXTRA_TEXT

Специальному Intent-у: android.content.Intent.ACTION_SEND. Сам код файла SimpleEMail.java

<font><font>public</font> <font>class</font> SimpleEMail extends Activity {</li>   Button send;</li>   EditText address, subject, emailtext;</li>   </li>   @Override</li>   <font>public</font> <font>void</font> onCreate(Bundle savedInstanceState) {</li>     super.onCreate(savedInstanceState);</li>     setContentView(R.layout.simple_email);</li>  </li>     <font>// Наши поля и кнопка</font></li>     send = (Button) findViewById(R.id.emailsendbutton);</li>     address = (EditText) findViewById(R.id.emailaddress);</li>     subject = (EditText) findViewById(R.id.emailsubject);</li>     emailtext = (EditText) findViewById(R.id.emailtext);</li>  </li>     send.setOnClickListener(<font>new</font> OnClickListener() {</li>  </li>       @Override</li>       <font>public</font> <font>void</font> onClick(View v) {</li>  </li>         final Intent emailIntent = <font>new</font> Intent(android.content.Intent.ACTION_SEND);</li>  </li>         emailIntent.setType(<font>"plain/text"</font>);</li>         <font>// Кому</font></li>         emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,</li>             <font>new</font> <font>String</font>[] { address.getText().toString() });</li>         <font>// Зачем</font></li>         emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,</li>             subject.getText().toString());</li>         <font>// О чём</font></li>         emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,</li>             emailtext.getText().toString());</li>         <font>// С чем</font></li>         emailIntent.putExtra(</li>             android.content.Intent.EXTRA_STREAM,</li>             <font>Uri</font>.parse(<font>"file://"</font></li>                 + Environment.getExternalStorageDirectory()</li>                 + <font>"/Клипы/SOTY_ATHD.mp4"</font>));</li>         </li>         emailIntent.setType(<font>"text/video"</font>);</li>         <font>// Поехали!</font></li>         SimpleEMail.<font>this</font>.startActivity(Intent.createChooser(emailIntent,</li>             <font>"Отправка письма..."</font>));</li>       }</li>     });</li>   }</li> }</li> </ol></font><font>* This source code was highlighted with <font>Source Code Highlighter</font>.</font>

Вот, код до безобразия прост. Правда можно еще проще: если нам лень создавать дополнительное Activity для ввода наших полей, то можно было бы просто запустить наш Intent. Плюсы: Простая реализация, достаточно удобно для обратной связи. Минусы: У пользователя должна быть настроенная программа приёма-передачи почтовых сообщений, без неё обрабатывать данный Intent будет некому.

Часть 2. Mail, анонимус Mail

Данный метод я использовал в своём проекте, обозначим для начала плюсы:

  • Не требует от пользователя настроенного клиента
  • Может быть полностью анонимным
  • Можно передавать все (в пределах разумного, конечно)

Для работы необходимы дополнительные библиотеки javamail-android. Качаем их, и встраиваем в проект: Контекстное меню проекта > «Build Path» > «Add External Archives…» > «Наши файлы additional, mail, activation» Для настройки нам также понадобится почтовый ящик зарегистрированный на gmail.com (или любом другом yandex, mail и.т.п.) настройки вы можете посмотреть здесь. В данном случае он будет выступать в виде шлюза через которые будут проходить наши письма. Начинаем настраивать:MailSenderClass.java В данном классе записаны настройки того сервера, через который будет передаваться ваше сообщение. Здесь у нас есть несколько методов:

  • public MailSenderClass(String user, String password) — Конструктор. В качестве аргументов передаются логин и пароль от нашего промежуточного ящика на gmail.com. Здесь же прописываются параметры smtp-подключения к серверу.
  • protected PasswordAuthentication getPasswordAuthentication() — Аутентификация для сервера.
  • public synchronized void sendMail(String subject, String body, String sender, String recipients, String filename) — Основной метод, в который передаются наши данные для отправки.

Рассмотрим код последнего метода чуть ближе:

<font><font>public</font> synchronized <font>void</font> sendMail(<font>String</font> subject, <font>String</font> body, <font>String</font> sender, <font>String</font> recipients, <font>String</font> filename) throws Exception {</li>     <font>try</font> {</li>       MimeMessage message = <font>new</font> MimeMessage(session);</li>       </li>       <font>// Кто</font></li>       message.setSender(<font>new</font> InternetAddress(sender));</li>       <font>// О чем</font></li>       message.setSubject(subject);</li>       <font>// Кому</font></li>       <font>if</font> (recipients.indexOf(<font>','</font>) > 0)</li>         message.setRecipients(Message.RecipientType.TO, </li>             InternetAddress.parse(recipients));</li>       <font>else</font></li>         message.setRecipient(Message.RecipientType.TO,</li>             <font>new</font> InternetAddress(recipients));</li>       </li>       <font>// Хочет сказать</font></li>       BodyPart messageBodyPart = <font>new</font> MimeBodyPart();</li>       messageBodyPart.setText(body);</li>       _multipart.addBodyPart(messageBodyPart);</li>       </li>       <font>// И что показать</font></li>       <font>if</font> (!filename.equalsIgnoreCase(<font>""</font>)) {</li>         BodyPart attachBodyPart = <font>new</font> MimeBodyPart();</li>         DataSource source = <font>new</font> FileDataSource(filename);</li>         attachBodyPart.setDataHandler(<font>new</font> DataHandler(source));</li>         attachBodyPart.setFileName(filename);</li>   </li>         _multipart.addBodyPart(attachBodyPart);</li>       }</li>       </li>       message.setContent(_multipart);</li>       </li>       Transport.send(message);</li>     } <font>catch</font> (Exception e) {</li>       Log.e(<font>"sendMail"</font>,<font>"Ошибка отправки функцией sendMail! "</font>);</li>     }</li>   }</li> </ol></font><font>* This source code was highlighted with <font>Source Code Highlighter</font>.</font>

Метод также прост. Используя объект класса MimeMessage составляем наше письмо и для отправки передаём методу send, класса Transport. JSSEProvider.java Провайдер протокола безопасности для нашей почты. Линк.VideoSelect.java Код был взят из ApiDemos, которые поставляются в комплекте с Android SDK, и был чуть подправлен для выполнения с помощью метода startActivityForResult. После выполнения возвращается строка, содержащая путь к файлу на карте памяти. Код можно будет посмотреть в проекте, он в конце статьи.ExtendedMail.java Основной метод отправления сообщения выполняется в функции sitv_sender_mail_async, представляющей класс AsyncTask:

<font>

  1. <font>private</font> <font>class</font> sender_mail_async extends AsyncTask<objec>, Boolean> {</objec>
  2.  ProgressDialog WaitingDialog;
  3.  @Override
  4.  <font>protected</font> <font>void</font> onPreExecute() {
  5.   <font>// Выводим пользователю процесс загрузки</font>
  6.   WaitingDialog = ProgressDialog.show(ExtendedMail.<font>this</font>, <font>»Отправка данных»</font>, <font>»Отправляем сообщение…»</font>, <font>true</font>);
  7.  }
  8.   
  9.  @Override
  10.  <font>protected</font> <font>void</font> onPostExecute(Boolean result) {
  11.   <font>// Прячем процесс загрузки</font>
  12.   WaitingDialog.dismiss();
  13.   Toast.makeText(mainContext, <font>»Отправка завершена!!!»</font>, Toast.LENGTH_LONG).show();
  14.   ((Activity)mainContext).finish();
  15.  }
  16.  @Override
  17.  <font>protected</font> Boolean doInBackground(Object… <font>params</font>) {
  18.   <font>try</font> {
  19.    <font>// Получаем данные с наших полей</font>
  20.    title = ((EditText)findViewById(R.id.screen_sendnews_et_title)).getText().toString();
  21.    text = ((EditText)findViewById(R.id.screen_sendnews_et_text)).getText().toString();
  22.    
  23.    <font>from</font> = <font>»from_post_msg@gmail.com»</font>;
  24.    <font>where</font> = <font>»where_post_msg@yandex.ru»</font>;
  25.    
  26.    <font>// Вызываем конструктор и передаём в него наши логин и пароль от ящика на gmail.com</font>
  27.    MailSenderClass sender = <font>new</font> MailSenderClass(<font>»mypostmail@gmail.com»</font>, <font>»password»</font>);
  28.    
  29.    <font>// И вызываем наш метод отправки</font>
  30.    sender.sendMail(title, text, <font>from</font>, <font>where</font>, attach);
  31.   } <font>catch</font> (Exception e) {
  32.    Toast.makeText(mainContext, <font>»Ошибка отправки сообщения!»</font>, Toast.LENGTH_SHORT).show();
  33.   }
  34.   <font>return</font> <font>false</font>;
  35.  }
  36. }

<font>* This source code was highlighted with <font>Source Code Highlighter</font>.</font></font>

Все просто, создали экземпляр класса MailSenderClass, передали конструктору наши логин и пароль. Далее вызов метода отправки sendMail с нашими параметрами. Асинхронный процесс состоит из трех методов onPreExecute(), doInBackground() и onPostExecute(), которые выполняются в написанной последовательности. Для тех, кто забыл как им пользоваться вот код:

<font><font>public</font> <font>void</font> onClick(View v) {</li>  sender_mail_async async_sending = <font>new</font> sender_mail_async();</li>  async_sending.execute();</li> }</li> </ol></font><font>* This source code was highlighted with <font>Source Code Highlighter</font>.</font>

Таким образом создав небольшой класс-поток, можно спокойно слать необходимую информацию от клиента к себе на ящик. Исходный код приложения можно скачать тут.

79
46,8k 79
—>

Главная » Как отправить e-mail сообщение из Android приложения

В этом уроке мы научимся отправлять электронные сообщения из своего приложения, вызывая с помощью намерения Intent стандартный почтовый клиент и передавая в него введенные данные имени, темы и текста сообщения. 

Начнем с создания нового проекта, выбираем Blank Activity. Никаких особенных разрешений получать нам не нужно, поэтому сразу идем в файл activity_main.xml и делаем интерфейс нашего приложения с помощью следующего кода:

<LinearLayout xmlns:android="schemas.android.com/apk/res/android"  android:id="@+id/linearLayout1"  android:layout_width="fill_parent"  android:layout_height="fill_parent"  android:orientation="vertical"  android:padding="5dp"><TextView  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="Кому:"  android:textAppearance="?android:attr/textAppearanceLarge"/><EditText  android:id="@+id/receiver_Email"  android:layout_width="fill_parent"  android:layout_height="wrap_content"  android:hint="Введите адрес"></EditText><TextView  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="Тема:"  android:textAppearance="?android:attr/textAppearanceLarge"/><EditText  android:id="@+id/message_theme"  android:layout_width="fill_parent"  android:layout_height="wrap_content"  android:hint="Введите тему сообщения"></EditText><TextView  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="Сообщение:"  android:textAppearance="?android:attr/textAppearanceLarge"/><EditText  android:id="@+id/message_text"  android:layout_width="fill_parent"  android:layout_height="wrap_content"  android:gravity="top"  android:hint="Введите сообщение"  android:inputType="textMultiLine"  android:lines="5"/></LinearLayout>

У нашего приложения будет довольно незамысловатый функционал. Сделаем две кнопки, одна будет очищать всю введенную информацию в поля приложения, а вторая будет вызывать стандартное приложение для отправки сообщений. Но мы сделаем так, что кнопки будут не в самом интерфейсе activity, не кнопки Button, как обычно, а кнопки в меню приложения. Поэтому, откройте файл настроек меню приложения под названием menu_main.xml и придайте ему вот такой вид:

<menu xmlns:android="schemas.android.com/apk/res/android"><item  android:id="@+id/menu_clear"  android:icon="@android:drawable/ic_menu_close_clear_cancel"  android:title="Очистить"/><item  android:id="@+id/menu_send"  android:icon="@android:drawable/ic_menu_send"  android:title="Отправить"/></menu>

Таким образом, используя стандартные иконки, мы создали меню из двух необходимых кнопок.

Теперь переходим к работе с кодом. Для этого открываем файл MainActivity.java и добавляем туда следующее (объяснения происходящего даны в коде):

importandroid.app.Activity; importandroid.content.Intent; importandroid.os.Bundle; importandroid.view.Menu; importandroid.view.MenuItem; importandroid.widget.EditText;  publicclass MainActivity extends Activity {   //Объявляем используемые переменные:privateEditText receiver_Email;  privateEditText message_theme;  privateEditText message_text;   @OverrideprotectedvoidonCreate(BundlesavedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);   //Инициализируем переменные, привязываем их к нашим объектам:  receiver_Email = (EditText) findViewById(R.id.receiver_Email);  message_theme = (EditText) findViewById(R.id.message_theme);  message_text = (EditText) findViewById(R.id.message_text);   }  //Стандартный метод для реализации меню приложения:@OverridepublicbooleanonCreateOptionsMenu(Menumenu) {  getMenuInflater().inflate(R.menu.menu_main, menu);  returntrue;  }   //Описываем функционал кнопок меню:@OverridepublicbooleanonOptionsItemSelected(MenuItemitem) {  switch (item.getItemId()) {   //В случае кнопки "Очистить", для всех элементов EditText настраиваем пустые строки для ввода,//то есть очищаем все поля от введенного текста:caseR.id.menu_clear:  receiver_Email.setText("");  message_text.setText("");  message_theme.setText("");  break;    //Для кнопки "Отправить" создаем 3 строковых объекта для контакта, темы и текста сообщенияcaseR.id.menu_send:String contact = receiver_Email.getText().toString();  String subject = message_theme.getText().toString();  String message = message_text.getText().toString();   //С помощью намерения Intent вызываем стандартный пакет приложения для отправки e-mail,//передаем в него данные с полей "адрес", "тема" и "текст сообщения",//заполняя ими соответствующие поля стандартного e-mail приложения //и запускаем процесс перехода с нашего приложения в стандартную программу для обмена e-mail:Intent emailIntent = getPackageManager().getLaunchIntentForPackage("com.android.email");  emailIntent.putExtra(Intent.EXTRA_EMAIL, newString[] { contact });  emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);  emailIntent.putExtra(Intent.EXTRA_TEXT, message);  startActivity(emailIntent);  break;  }  returntrue;  } } 

Осталось, как обычно, только протестировать наше сегодняшнее творение. Запускаем приложение и смотрим на результат:

—>Категория—>:Уроки программирования | —>Просмотров—>:1238 | | |

Давайте научимся отправлять email сообщение с вашего устройства с ОС Android.

Скачать

Что мы будем делать?

Попытаемся отправить Email сообщение с вашего телефона, но для этого мы реализуем свой клиент который будет отправлять письмо на указанный вами email адрес.

Шаг 1

Создаем Android проект и создаем layout -> main.xml со следующим содержимым:

Выглядеть этот layout будет так:

Шаг 2

Теперь создадим Activity который и будет выполнять отправку сообщения на email.

Создаем класс MainActivity.java со следующим содержимым:

package com.devcolibri.client;    import android.app.Activity;  import android.content.Intent;  import android.os.Bundle;  import android.view.View;  import android.widget.Button;  import android.widget.EditText;    public class MainActivity extends Activity {      private Button buttonSend;      private EditText textTo;      private EditText textSubject;      private EditText textMessage;        @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);            buttonSend = (Button) findViewById(R.id.buttonSend);          textTo = (EditText) findViewById(R.id.editTextTo);          textSubject = (EditText) findViewById(R.id.editTextSubject);          textMessage = (EditText) findViewById(R.id.editTextMessage);            buttonSend.setOnClickListener(new View.OnClickListener() {                @Override              public void onClick(View v) {                    String to = textTo.getText().toString();                  String subject = textSubject.getText().toString();                  String message = textMessage.getText().toString();                    Intent email = new Intent(Intent.ACTION_SEND);                  email.putExtra(Intent.EXTRA_EMAIL, new String[]{ to});                  email.putExtra(Intent.EXTRA_SUBJECT, subject);                  email.putExtra(Intent.EXTRA_TEXT, message);                    //для того чтобы запросить email клиент устанавливаем тип                  email.setType("message/rfc822");                    startActivity(Intent.createChooser(email, "Выберите email клиент :"));                }          });      }  }

Как видите мы используем стандартный email клиент Android, чтобы с его помощью отправить уже заготовленное нами сообщение. Это делается следующим образом:

Intent email = new Intent(Intent.ACTION_SEND);  //Указываем получателя  email.putExtra(Intent.EXTRA_EMAIL, new String[]{"alex@devcolibri.com"});    //Устанавливаем Тему сообщения  email.putExtra(Intent.EXTRA_SUBJECT, "subject");  //Устанавливаем само сообщение  email.putExtra(Intent.EXTRA_TEXT, "message");  //тип отправляемого сообщения  email.setType("message/rfc822");  //Вызываем intent выбора клиента для отправки сообщения  startActivity(Intent.createChooser(email, "Выберите email клиент :"));

Шаг 3

Запускаем и смотрим:

После нажатия на кнопку Отправить появится окно, где вам нужно будет авторизоваться в Gmail, после чего можно отправить ваше сообщение.

Жмем кнопку Send. Готово сообщение отправлено.

Шаг 4

Проверяем пришло ли сообщение на отправленный email:

Как видите сообщение пришло.

И его содержимое соответствует тому что мы писали в нашем клиенте.

ПОХОЖИЕ ПУБЛИКАЦИИ

  • Android-приложение с фактами о Чаке Норрисе на Kotlin
  • Используем Firebase в качестве хранилища изображений для Android-приложения
  • Создание собственного Android-диктофона с помощью Kotlin
  • Почему нужно стать Android-разработчиком?
  • Что такое Android Lint и как он помогает писать поддерживаемый код
  • Топ-17 плагинов для Android Studio
Ссылка на основную публикацию