Привет хабр и привет всем!
В данной статье я покажу как реализуется отправка писем средствами самого Android, а также ещё один более интересный способ, но уже с применением внешней библиотеки, которая позволяет нам отсылать письма более приемлимыми для программиста способами.
Как это делается: обычно в программу встраивается дополнительная Activity, которая представляет собой окошко с несколькими полями: Кому, Тема и Текст. Далее данные с этих полей передаются как экстра содержимое:
Сам код файла SimpleEMail.java
Плюсы: Простая реализация, достаточно удобно для обратной связи.
Минусы: У пользователя должна быть настроенная программа приёма-передачи почтовых сообщений, без неё обрабатывать данный Intent будет некому.
Данный метод я использовал в своём проекте, обозначим для начала плюсы:
Качаем их, и встраиваем в проект: Контекстное меню проекта > «Build Path» > «Add External Archives...» > «Наши файлы additional, mail, activation»
Для настройки нам также понадобится почтовый ящик зарегистрированный на gmail.com (или любом другом yandex, mail и.т.п.) настройки вы можете посмотреть здесь. В данном случае он будет выступать в виде шлюза через которые будут проходить наши письма.
Начинаем настраивать:
MailSenderClass.java
В данном классе записаны настройки того сервера, через который будет передаваться ваше сообщение. Здесь у нас есть несколько методов:
Рассмотрим код последнего метода чуть ближе:
JSSEProvider.java
Провайдер протокола безопасности для нашей почты. Линк.
VideoSelect.java
Код был взят из ApiDemos, которые поставляются в комплекте с Android SDK, и был чуть подправлен для выполнения с помощью метода startActivityForResult.
После выполнения возвращается строка, содержащая путь к файлу на карте памяти. Код можно будет посмотреть в проекте, он в конце статьи.
ExtendedMail.java
Основной метод отправления сообщения выполняется в функции sitv_sender_mail_async, представляющей класс AsyncTask:
Асинхронный процесс состоит из трех методов onPreExecute(), doInBackground() и onPostExecute(), которые выполняются в написанной последовательности.
Для тех, кто забыл как им пользоваться вот код:
Таким образом создав небольшой класс-поток, можно спокойно слать необходимую информацию от клиента к себе на ящик.
Исходный код приложения можно скачать тут.
В данной статье я покажу как реализуется отправка писем средствами самого Android, а также ещё один более интересный способ, но уже с применением внешней библиотеки, которая позволяет нам отсылать письма более приемлимыми для программиста способами.
Часть 1. Mail, просто Mail
Как это делается: обычно в программу встраивается дополнительная Activity, которая представляет собой окошко с несколькими полями: Кому, Тема и Текст. Далее данные с этих полей передаются как экстра содержимое:
- android.content.Intent.EXTRA_EMAIL
- android.content.Intent.EXTRA_SUBJECT
- android.content.Intent.EXTRA_TEXT
Сам код файла SimpleEMail.java
- 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,
- "Отправка письма..."));
- }
- });
- }
- }
* This source code was highlighted with Source Code Highlighter.
Вот, код до безобразия прост. Правда можно еще проще: если нам лень создавать дополнительное Activity для ввода наших полей, то можно было бы просто запустить наш Intent. Плюсы: Простая реализация, достаточно удобно для обратной связи.
Минусы: У пользователя должна быть настроенная программа приёма-передачи почтовых сообщений, без неё обрабатывать данный Intent будет некому.
Часть 2. Mail, анонимус Mail
Данный метод я использовал в своём проекте, обозначим для начала плюсы:
- Не требует от пользователя настроенного клиента
- Может быть полностью анонимным
- Можно передавать все (в пределах разумного, конечно)
Качаем их, и встраиваем в проект: Контекстное меню проекта > «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) — Основной метод, в который передаются наши данные для отправки.
Рассмотрим код последнего метода чуть ближе:
- 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! ");
- }
- }
* This source code was highlighted with Source Code Highlighter.
Метод также прост. Используя объект класса 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<Object, String, Boolean> {
- 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;
- }
- }
* This source code was highlighted with Source Code Highlighter.
Все просто, создали экземпляр класса MailSenderClass, передали конструктору наши логин и пароль. Далее вызов метода отправки sendMail с нашими параметрами.Асинхронный процесс состоит из трех методов onPreExecute(), doInBackground() и onPostExecute(), которые выполняются в написанной последовательности.
Для тех, кто забыл как им пользоваться вот код:
- public void onClick(View v) {
- sender_mail_async async_sending = new sender_mail_async();
- async_sending.execute();
- }
* This source code was highlighted with Source Code Highlighter.
Таким образом создав небольшой класс-поток, можно спокойно слать необходимую информацию от клиента к себе на ящик.
Исходный код приложения можно скачать тут.