Как отправить письмо с вложением android studio
Перейти к содержимому

Как отправить письмо с вложением android studio

  • автор:

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

Александр Варакосов @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
  1. public class SimpleEMail extends Activity
  2. Button send;
  3. EditText address, subject, emailtext;
  4. @Override
  5. public void onCreate(Bundle savedInstanceState)
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.simple_email);
  8. // Наши поля и кнопка
  9. send = (Button) findViewById(R.id.emailsendbutton);
  10. address = (EditText) findViewById(R.id.emailaddress);
  11. subject = (EditText) findViewById(R.id.emailsubject);
  12. emailtext = (EditText) findViewById(R.id.emailtext);
  13. send.setOnClickListener( new OnClickListener()
  14. @Override
  15. public void onClick(View v)
  16. final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
  17. emailIntent.setType( «plain/text» );
  18. // Кому
  19. emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,
  20. new String [] < address.getText().toString() >);
  21. // Зачем
  22. emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
  23. subject.getText().toString());
  24. // О чём
  25. emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,
  26. emailtext.getText().toString());
  27. // С чем
  28. emailIntent.putExtra(
  29. android.content.Intent.EXTRA_STREAM,
  30. Uri .parse( «file://»
  31. + Environment.getExternalStorageDirectory()
  32. + «/Клипы/SOTY_ATHD.mp4» ));
  33. emailIntent.setType( «text/video» );
  34. // Поехали!
  35. SimpleEMail. this .startActivity(Intent.createChooser(emailIntent,
  36. «Отправка письма. » ));
  37. >
  38. >);
  39. >
  40. >

Вот, код до безобразия прост. Правда можно еще проще: если нам лень создавать дополнительное 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) — Основной метод, в который передаются наши данные для отправки.
  1. public synchronized void sendMail( String subject, String body, String sender, String recipients, String filename) throws Exception
  2. try
  3. MimeMessage message = new MimeMessage(session);
  4. // Кто
  5. message.setSender( new InternetAddress(sender));
  6. // О чем
  7. message.setSubject(subject);
  8. // Кому
  9. if (recipients.indexOf( ‘,’ ) > 0)
  10. message.setRecipients(Message.RecipientType.TO,
  11. InternetAddress.parse(recipients));
  12. else
  13. message.setRecipient(Message.RecipientType.TO,
  14. new InternetAddress(recipients));
  15. // Хочет сказать
  16. BodyPart messageBodyPart = new MimeBodyPart();
  17. messageBodyPart.setText(body);
  18. _multipart.addBodyPart(messageBodyPart);
  19. // И что показать
  20. if (!filename.equalsIgnoreCase( «» ))
  21. BodyPart attachBodyPart = new MimeBodyPart();
  22. DataSource source = new FileDataSource(filename);
  23. attachBodyPart.setDataHandler( new DataHandler(source));
  24. attachBodyPart.setFileName(filename);
  25. _multipart.addBodyPart(attachBodyPart);
  26. >
  27. message.setContent(_multipart);
  28. Transport.send(message);
  29. > catch (Exception e)
  30. Log.e( «sendMail» , «Ошибка отправки функцией sendMail! » );
  31. >
  32. >

Метод также прост. Используя объект класса MimeMessage составляем наше письмо и для отправки передаём методу send, класса Transport.

JSSEProvider.java
Провайдер протокола безопасности для нашей почты. Линк.

VideoSelect.java
Код был взят из ApiDemos, которые поставляются в комплекте с Android SDK, и был чуть подправлен для выполнения с помощью метода startActivityForResult.
После выполнения возвращается строка, содержащая путь к файлу на карте памяти. Код можно будет посмотреть в проекте, он в конце статьи.

ExtendedMail.java
Основной метод отправления сообщения выполняется в функции sitv_sender_mail_async, представляющей класс AsyncTask:

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

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

  1. public void onClick(View v)
  2. sender_mail_async async_sending = new sender_mail_async();
  3. async_sending.execute();
  4. >

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

Исходный код приложения можно скачать тут.

  • android
  • mailapi
  • android development

Отправить письмо с вложением в Android

Это простая демонстрация для отправки электронной почты в Android с вложением. Для вложения я использую Intent.ACTION_GET_CONTENT.

Не забудьте добавить разрешения в ваш manifest.xml-

Screenshot_2013-09-23-00-07-49

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *