Intent отправки Email
В данной статье рассматривается пример использования неявного намерения Intent для отправки Email сообщения. Для реализации данной функции в приложении необходимо определить доступ (uses-permission) в манифесте приложения, сформировать и вызвать неявное намерение отправки сообщения в активности.
Примечание :
1. В примере отправки Email-сообщения система android под управлением AVD (Android Virtual Device) реально запросит адрес и пароль отправителя;
2. Сообщения в примере будут реально отправлены по указанным адресам, даже если будет использован AVD.
Определение uses-permission в манифесте AndroidManifest.xml
Для использования неявного намерения для отправки Email-сообщений следует в манифесте примера AndroidManifest.xml указать разрешения на доступ к определенным функциям, как это представлено в следующем коде :
Описание интерфейса
При описании интерфейса примера в файле «res/layout/activity_main.xml» (наименование может отличаться) используем шаблон типа RelativeLayout с кнопкой отправки Email сообщения.
Код активности EmailActivity
Активность EmailActivity реализует интерфейс View.OnClickListener, согласно которому переопределяется метод onClick. Вызов данного метода подключен к кнопке.
В методе onClick определяется неявное намерение типа Intent.ACTION_SENDTO. Возможно использовать один из 3-х вариантов :
Типы действий Action
- ACTION_SENDTO (без вложений);
- ACTION_SEND (одно вложение);
- ACTION_SEND_MULTIPLE (множество вложений);
import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.provider.CalendarContract; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.util.Calendar; public class EmailActivity extends AppCompatActivity implements View.OnClickListener < private Context context; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_email); context = getApplicationContext(); Button btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(this); >@Override public void onClick(View v) < String[] emails; String[] emailsCC; String[] emailsBCCl emails = new String[]< "jim@example.com">; // emails for cc emailsCC = new String[]; // emails for bcc emailsBCC = new String[]; String mailSubject = "Тема email"; String mailBody = "Текст сообщения"; // Initialize a new Intent Intent intent = new Intent(Intent.ACTION_SENDTO); intent.putExtra(Intent.EXTRA_EMAIL, emails); // Define the email cc and bcc intent.putExtra(Intent.EXTRA_CC , emailsCC); intent.putExtra(Intent.EXTRA_BCC, emailsBCC); intent.putExtra(Intent.EXTRA_SUBJECT, mailSubject); intent.putExtra(Intent.EXTRA_TEXT,mailBody); // For only email app should handle this intent intent.setData(Uri.parse("mailto:")); // Try to start the activity if (intent.resolveActivity( getPackageManager()) != null) < startActivity(intent); Toast.makeText(context, "Send email.", Toast.LENGTH_SHORT).show(); >else < // If there are no email client installed // in this device String err; err="No email client installed in this device."; Toast.makeText(context, err, Toast.LENGTH_SHORT).show(); >> >
MIME Type
При определении типа mime используйте следующие варианты :
Пример определения типа mime в фильтре намерения :
Extra данные
При определении типа данных возможны следующие варианты :
- Intent.EXTRA_EMAIL
- Intent.EXTRA_CC
- Intent.EXTRA_BCC
- Intent.EXTRA_SUBJECT
- Intent.EXTRA_TEXT
- Intent.EXTRA_STREAM
Как отправить письмо с вложением?
Можно использовать интент с действием ACTION_SENDTO или ACTION_VIEW, в chooser’е будут только почтовые клиенты, но при этом нельзя добавить вложение.
Если использовать ACTION_SEND и MIME message/rfc822 или application/octet-stream, то отображается много лишних приложений, например, телеграмм или гуглдрайв.
Вопрос, как cформировать интент, чтобы были видны только email-клиенты и подхватывались вложения из EXTRA_STREAM. API 16 и выше.
- Вопрос задан более трёх лет назад
- 366 просмотров
Комментировать
Решения вопроса 1

Александр Варакосов @thelongrunsmoke Автор вопроса
Программист
Разобрался. Это можно сделать присвоив изначальному интенту экстра с именем Intent.EXTRA_INITIAL_INTENTS и интентом с другим действием. Например, исходный интент ACTION_SEND и EXTRA_INITIAL_INTENTS с ACTION_SENDTO, дадут их пересечение, на чистом андроиде, один gmail.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ответы на вопрос 1
Попробуйте вот так:
//filePath - file at phone. public void send(String emailTo, String subject, String body, String filePath) < Intent email = new Intent(android.content.Intent.ACTION_SEND); email.setType("message/rfc822"); email.putExtra(Intent.EXTRA_EMAIL, new String[]); email.putExtra(Intent.EXTRA_SUBJECT, subject); email.putExtra(Intent.EXTRA_TEXT, body); if (filePath != null) email.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new StorageFiles(ctx).getFile(filePath))); try < ctx.startActivity(Intent.createChooser(email, "Choser title")); >catch (android.content.ActivityNotFoundException ex) < >>
Отправка E-Mail средствами Android
В данной статье я покажу как реализуется отправка писем средствами самого Android, а также ещё один более интересный способ, но уже с применением внешней библиотеки, которая позволяет нам отсылать письма более приемлимыми для программиста способами.
Часть 1. Mail, просто Mail
- android.content.Intent.EXTRA_EMAIL
- android.content.Intent.EXTRA_SUBJECT
- android.content.Intent.EXTRA_TEXT
- public class SimpleEMail extends Activity
- Button send;
- EditText address, subject, emailtext;
- @Override
- public void onCreate(Bundle savedInstanceState)
- super.onCreate(savedInstanceState);
- setContentView(R.layout.simple_email);
- // Наши поля и кнопка
- send = (Button) findViewById(R.id.emailsendbutton);
- address = (EditText) findViewById(R.id.emailaddress);
- subject = (EditText) findViewById(R.id.emailsubject);
- emailtext = (EditText) findViewById(R.id.emailtext);
- send.setOnClickListener( new OnClickListener()
- @Override
- public void onClick(View v)
- final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
- emailIntent.setType( «plain/text» );
- // Кому
- emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,
- new String [] < address.getText().toString() >);
- // Зачем
- emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
- subject.getText().toString());
- // О чём
- emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,
- emailtext.getText().toString());
- // С чем
- emailIntent.putExtra(
- android.content.Intent.EXTRA_STREAM,
- Uri .parse( «file://»
- + Environment.getExternalStorageDirectory()
- + «/Клипы/SOTY_ATHD.mp4» ));
- emailIntent.setType( «text/video» );
- // Поехали!
- SimpleEMail. this .startActivity(Intent.createChooser(emailIntent,
- «Отправка письма. » ));
- >
- >);
- >
- >
Вот, код до безобразия прост. Правда можно еще проще: если нам лень создавать дополнительное Activity для ввода наших полей, то можно было бы просто запустить наш Intent.
Плюсы: Простая реализация, достаточно удобно для обратной связи.
Минусы: У пользователя должна быть настроенная программа приёма-передачи почтовых сообщений, без неё обрабатывать данный Intent будет некому.
Часть 2. Mail, анонимус Mail
- Не требует от пользователя настроенного клиента
- Может быть полностью анонимным
- Можно передавать все (в пределах разумного, конечно)
Для настройки нам также понадобится почтовый ящик зарегистрированный на gmail.com (или любом другом yandex, mail и.т.п.) настройки вы можете посмотреть здесь. В данном случае он будет выступать в виде шлюза через которые будут проходить наши письма.
- 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) — Основной метод, в который передаются наши данные для отправки.
- public synchronized void sendMail( String subject, String body, String sender, String recipients, String filename) throws Exception
- try
- MimeMessage message = new MimeMessage(session);
- // Кто
- message.setSender( new InternetAddress(sender));
- // О чем
- message.setSubject(subject);
- // Кому
- if (recipients.indexOf( ‘,’ ) > 0)
- message.setRecipients(Message.RecipientType.TO,
- InternetAddress.parse(recipients));
- else
- message.setRecipient(Message.RecipientType.TO,
- new InternetAddress(recipients));
- // Хочет сказать
- BodyPart messageBodyPart = new MimeBodyPart();
- messageBodyPart.setText(body);
- _multipart.addBodyPart(messageBodyPart);
- // И что показать
- if (!filename.equalsIgnoreCase( «» ))
- BodyPart attachBodyPart = new MimeBodyPart();
- DataSource source = new FileDataSource(filename);
- attachBodyPart.setDataHandler( new DataHandler(source));
- attachBodyPart.setFileName(filename);
- _multipart.addBodyPart(attachBodyPart);
- >
- message.setContent(_multipart);
- Transport.send(message);
- > catch (Exception e)
- Log.e( «sendMail» , «Ошибка отправки функцией sendMail! » );
- >
- >
Метод также прост. Используя объект класса MimeMessage составляем наше письмо и для отправки передаём методу send, класса Transport.
JSSEProvider.java
Провайдер протокола безопасности для нашей почты. Линк.
VideoSelect.java
Код был взят из ApiDemos, которые поставляются в комплекте с Android SDK, и был чуть подправлен для выполнения с помощью метода startActivityForResult.
После выполнения возвращается строка, содержащая путь к файлу на карте памяти. Код можно будет посмотреть в проекте, он в конце статьи.
ExtendedMail.java
Основной метод отправления сообщения выполняется в функции sitv_sender_mail_async, представляющей класс AsyncTask:
- private class sender_mail_async extends AsyncTask
- ProgressDialog WaitingDialog;
- @Override
- protected void onPreExecute()
- // Выводим пользователю процесс загрузки
- WaitingDialog = ProgressDialog.show(ExtendedMail. this , «Отправка данных» , «Отправляем сообщение. » , true );
- >
- @Override
- protected void onPostExecute(Boolean result)
- // Прячем процесс загрузки
- WaitingDialog.dismiss();
- Toast.makeText(mainContext, «Отправка завершена. » , Toast.LENGTH_LONG).show();
- ((Activity)mainContext).finish();
- >
- @Override
- protected Boolean doInBackground(Object. params )
- try
- // Получаем данные с наших полей
- title = ((EditText)findViewById(R.id.screen_sendnews_et_title)).getText().toString();
- text = ((EditText)findViewById(R.id.screen_sendnews_et_text)).getText().toString();
- from = «from_post_msg@gmail.com» ;
- where = «where_post_msg@yandex.ru» ;
- // Вызываем конструктор и передаём в него наши логин и пароль от ящика на gmail.com
- MailSenderClass sender = new MailSenderClass( «mypostmail@gmail.com» , «password» );
- // И вызываем наш метод отправки
- sender.sendMail(title, text, from , where , attach);
- > catch (Exception e)
- Toast.makeText(mainContext, «Ошибка отправки сообщения!» , Toast.LENGTH_SHORT).show();
- >
- return false ;
- >
- >
Все просто, создали экземпляр класса MailSenderClass, передали конструктору наши логин и пароль. Далее вызов метода отправки sendMail с нашими параметрами.
Асинхронный процесс состоит из трех методов onPreExecute(), doInBackground() и onPostExecute(), которые выполняются в написанной последовательности.
Для тех, кто забыл как им пользоваться вот код:
- public void onClick(View v)
- sender_mail_async async_sending = new sender_mail_async();
- async_sending.execute();
- >
Таким образом создав небольшой класс-поток, можно спокойно слать необходимую информацию от клиента к себе на ящик.
Исходный код приложения можно скачать тут.
- android
- mailapi
- android development
Отправить письмо с вложением в Android
Это простая демонстрация для отправки электронной почты в Android с вложением. Для вложения я использую Intent.ACTION_GET_CONTENT.
Не забудьте добавить разрешения в ваш manifest.xml-
1) MainActivity.java
package com.manish.sendemaildemo;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
* @author manish
public class MainActivity extends Activity implements OnClickListener <
EditText editTextEmail, editTextSubject, editTextMessage;
Button btnSend, btnAttachment;
String email, subject, message, attachmentFile;
Uri URI = null ;
private static final int PICK_FROM_GALLERY = 101 ;
int columnIndex;
protected void onCreate(Bundle savedInstanceState) <
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTextEmail = (EditText) findViewById(R.id.editTextTo);
editTextSubject = (EditText) findViewById(R.id.editTextSubject);
editTextMessage = (EditText) findViewById(R.id.editTextMessage);
btnAttachment = (Button) findViewById(R.id.buttonAttachment);
btnSend = (Button) findViewById(R.id.buttonSend);
btnSend.setOnClickListener( this );
btnAttachment.setOnClickListener( this );
protected void onActivityResult( int requestCode, int resultCode, Intent data) <
if (requestCode == PICK_FROM_GALLERY && resultCode == RESULT_OK) <