7

Отправка электронной почты в Android с использованием JavaMail API без стандартного приложения

6

Я пытаюсь создать приложение для отправки электронной почты на Android.

Если я использую следующий код:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);

Это запускает встроенное приложение для электронной почты на Android. Однако я хочу отправлять электронное письмо по нажатию кнопки напрямую, без использования этого приложения. Как я могу реализовать это функционал?

5 ответ(ов)

0

Спасибо за полезную информацию! Код работает отлично. Я также смог добавить вложение, добавив следующий код:

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

Таким образом, я добавляю вложения в сообщение. Если у вас есть еще вопросы, не стесняйтесь спрашивать!

0

Ошибка "Could not connect to SMTP host: smtp.gmail.com, port: 465" может возникать из-за отсутствия разрешения на доступ в интернет в вашем приложении. Для решения этой проблемы вам необходимо добавить следующее разрешение в манифест вашего приложения:

<uses-permission android:name="android.permission.INTERNET" />

Убедитесь, что эта строка находится внутри тега <manifest> в вашем файле AndroidManifest.xml. После внесения изменений попробуйте снова запустить приложение и установить соединение с SMTP-сервером.

0

Вы можете использовать JavaMail API для работы с задачами, связанными с электронной почтой. JavaMail API доступен в пакете JavaEE, и его JAR-файлы можно скачать. К сожалению, его нельзя использовать напрямую в Android-приложениях, так как он использует компоненты AWT, которые совершенно несовместимы с Android.

Вы можете найти порт JavaMail для Android по следующему адресу: http://code.google.com/p/javamail-android/

Добавьте JAR-файлы в ваше приложение и используйте метод SMTP.

0

Если вы столкнулись с исключением 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. Не забудьте заменить адреса электронной почты и пароль на свои собственные.

0

SMTP

Использование SMTP — это один из способов отправки электронной почты, и другие уже указали, как это сделать. Просто имейте в виду, что при этом вы полностью обойдете встроенное почтовое приложение, и вам потребуется указать адрес SMTP-сервера, имя пользователя и пароль для этого сервера, либо жестко закодировав их в вашем коде, либо запросив у пользователя.

HTTP

Другой подход заключается в использовании простого серверного скрипта, например, на PHP, который принимает некоторые параметры URL и использует их для отправки почты. Таким образом, вам нужно всего лишь сделать HTTP-запрос с устройства (что легко осуществимо с помощью встроенных библиотек) и не нужно хранить данные для входа на SMTP-сервер на устройстве. Это еще один уровень абстракции по сравнению с прямым использованием SMTP, но поскольку делать HTTP-запросы и отправлять письма из PHP очень просто, это может оказаться даже проще, чем прямой способ.

Почтовое приложение

Если необходимо отправить письмо с учетной записи пользователя, зарегистрированной на телефоне, вам придется использовать другой подход. Если у вас достаточно времени и опыта, вы можете проверить исходный код приложения для электронной почты на Android, чтобы выяснить, предлагает ли оно какой-либо способ отправить письмо без взаимодействия с пользователем (я не знаю, но возможно, что такой метод существует).

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь