Отправка электронной почты в Android с использованием JavaMail API без стандартного приложения
Я пытаюсь создать приложение для отправки электронной почты на Android.
Если я использую следующий код:
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
Это запускает встроенное приложение для электронной почты на Android. Однако я хочу отправлять электронное письмо по нажатию кнопки напрямую, без использования этого приложения. Как я могу реализовать это функционал?
5 ответ(ов)
Спасибо за полезную информацию! Код работает отлично. Я также смог добавить вложение, добавив следующий код:
private Multipart _multipart;
_multipart = new MimeMultipart();
public void addAttachment(String filename, String subject) throws Exception {
BodyPart messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
_multipart.addBodyPart(messageBodyPart);
BodyPart messageBodyPart2 = new MimeBodyPart();
messageBodyPart2.setText(subject);
_multipart.addBodyPart(messageBodyPart2);
}
message.setContent(_multipart);
Таким образом, я добавляю вложения в сообщение. Если у вас есть еще вопросы, не стесняйтесь спрашивать!
Ошибка "Could not connect to SMTP host: smtp.gmail.com, port: 465" может возникать из-за отсутствия разрешения на доступ в интернет в вашем приложении. Для решения этой проблемы вам необходимо добавить следующее разрешение в манифест вашего приложения:
<uses-permission android:name="android.permission.INTERNET" />
Убедитесь, что эта строка находится внутри тега <manifest>
в вашем файле AndroidManifest.xml. После внесения изменений попробуйте снова запустить приложение и установить соединение с SMTP-сервером.
Вы можете использовать JavaMail API для работы с задачами, связанными с электронной почтой. JavaMail API доступен в пакете JavaEE, и его JAR-файлы можно скачать. К сожалению, его нельзя использовать напрямую в Android-приложениях, так как он использует компоненты AWT, которые совершенно несовместимы с Android.
Вы можете найти порт JavaMail для Android по следующему адресу: http://code.google.com/p/javamail-android/
Добавьте JAR-файлы в ваше приложение и используйте метод SMTP.
Если вы столкнулись с исключением Network On Main Thread Exception при использовании SDK версии выше 9, то вы можете использовать следующий подход. В приведенном коде используется AsyncTask для выполнения сетевых операций, что является правильным решением для избежания блокировки основного потока.
Вот пример кода:
public void onClickMail(View view) {
new SendEmailAsyncTask().execute();
}
class SendEmailAsyncTask extends AsyncTask<Void, Void, Boolean> {
Mail m = new Mail("[email protected]", "my password");
public SendEmailAsyncTask() {
if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "SendEmailAsyncTask()");
String[] toArr = { "to [email protected]" };
m.setTo(toArr);
m.setFrom("from [email protected]");
m.setSubject("Email from Android");
m.setBody("body.");
}
@Override
protected Boolean doInBackground(Void... params) {
if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "doInBackground()");
try {
m.send();
return true;
} catch (AuthenticationFailedException e) {
Log.e(SendEmailAsyncTask.class.getName(), "Неверные учетные данные");
e.printStackTrace();
return false;
} catch (MessagingException e) {
Log.e(SendEmailAsyncTask.class.getName(), m.getTo(null) + " не удалось отправить");
e.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
Используя AsyncTask
, вы обеспечиваете выполнение сетевых операций в фоновом потоке, тем самым избежав исключения NetworkOnMainThreadException
. Не забудьте заменить адреса электронной почты и пароль на свои собственные.
SMTP
Использование SMTP — это один из способов отправки электронной почты, и другие уже указали, как это сделать. Просто имейте в виду, что при этом вы полностью обойдете встроенное почтовое приложение, и вам потребуется указать адрес SMTP-сервера, имя пользователя и пароль для этого сервера, либо жестко закодировав их в вашем коде, либо запросив у пользователя.
HTTP
Другой подход заключается в использовании простого серверного скрипта, например, на PHP, который принимает некоторые параметры URL и использует их для отправки почты. Таким образом, вам нужно всего лишь сделать HTTP-запрос с устройства (что легко осуществимо с помощью встроенных библиотек) и не нужно хранить данные для входа на SMTP-сервер на устройстве. Это еще один уровень абстракции по сравнению с прямым использованием SMTP, но поскольку делать HTTP-запросы и отправлять письма из PHP очень просто, это может оказаться даже проще, чем прямой способ.
Почтовое приложение
Если необходимо отправить письмо с учетной записи пользователя, зарегистрированной на телефоне, вам придется использовать другой подход. Если у вас достаточно времени и опыта, вы можете проверить исходный код приложения для электронной почты на Android, чтобы выяснить, предлагает ли оно какой-либо способ отправить письмо без взаимодействия с пользователем (я не знаю, но возможно, что такой метод существует).
Возможно, вам даже удастся найти способ запросить учетные данные пользователя (чтобы вы могли использовать их для SMTP), хотя я сильно сомневаюсь, что это осуществимо, так как это было бы огромным риском для безопасности, а Android спроектирован достаточно надежно.
Как передать объект из одной активности в другую на Android
Ошибка «Необходимо переопределить метод суперкласса» после импорта проекта в Eclipse
Почему в RecyclerView отсутствует onItemClickListener()?
Не удается запустить Eclipse - Java был запущен, но вернул код завершения = 13
Можно ли использовать Java 8 для разработки под Android?