Как я могу отправлять электронные письма из своего приложения Android?

Я пишу приложение для Android. Как я могу отправить ему электронное письмо?

Лучший (и самый простой) способ – использовать Intent :

 Intent i = new Intent(Intent.ACTION_SEND); i.setType("message/rfc822"); i.putExtra(Intent.EXTRA_EMAIL , new String[]{"[email protected]"}); i.putExtra(Intent.EXTRA_SUBJECT, "subject of email"); i.putExtra(Intent.EXTRA_TEXT , "body of email"); try { startActivity(Intent.createChooser(i, "Send mail...")); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(MyActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); } 

В противном случае вам придется писать собственный клиент.

Используйте .setType("message/rfc822") или выборщик покажет вам все (многие) приложения, которые поддерживают намерение отправки.

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

 Intent intent = new Intent(Intent.ACTION_SENDTO); // it's not ACTION_SEND intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_SUBJECT, "Subject of email"); intent.putExtra(Intent.EXTRA_TEXT, "Body of email"); intent.setData(Uri.parse("mailto:[email protected]")); // or just "mailto:" for blank intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // this will make such that when user returns to your app, your app is displayed, instead of the email app. startActivity(intent); 

Я использовал что-то в соответствии с принятым в настоящее время ответом, чтобы отправлять электронные письма с прикрепленным двоичным файлом журнала ошибок. GMail и K-9 отправляют его просто отлично, и он также отлично подходит для моего почтового сервера. Единственной проблемой был мой почтовый клиент по выбору Thunderbird, у которого были проблемы с открытием / сохранением прикрепленного файла журнала. Фактически он просто не сохранял файл вообще, не жалуясь.

Я взглянул на один из этих исходных кодов почты и заметил, что вложение в файл журнала (понятно) – message/rfc822 типа mime message/rfc822 . Конечно, это приложение не является прикрепленным письмом. Но Thunderbird не может справиться с этой крошечной ошибкой изящно. Так что это было вроде облом.

После нескольких исследований и экспериментов я придумал следующее решение:

  public Intent createEmailOnlyChooserIntent(Intent source, CharSequence chooserTitle) { Stack intents = new Stack(); Intent i = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", "[email protected]", null)); List activities = getPackageManager() .queryIntentActivities(i, 0); for(ResolveInfo ri : activities) { Intent target = new Intent(source); target.setPackage(ri.activityInfo.packageName); intents.add(target); } if(!intents.isEmpty()) { Intent chooserIntent = Intent.createChooser(intents.remove(0), chooserTitle); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents.toArray(new Parcelable[intents.size()])); return chooserIntent; } else { return Intent.createChooser(source, chooserTitle); } } 

Его можно использовать следующим образом:

  Intent i = new Intent(Intent.ACTION_SEND); i.setType("*/*"); i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(crashLogFile)); i.putExtra(Intent.EXTRA_EMAIL, new String[] { ANDROID_SUPPORT_EMAIL }); i.putExtra(Intent.EXTRA_SUBJECT, "Crash report"); i.putExtra(Intent.EXTRA_TEXT, "Some crash report details"); startActivity(createEmailOnlyChooserIntent(i, "Send via email")); 

Как вы можете видеть, метод createEmailOnlyChooserIntent может быть легко загружен с правильным намерением и правильным типом mime.

Затем он просматривает список доступных действий, которые отвечают за намерение протокола ACTION_SENDTO (которые являются только приложениями электронной почты) и строят выбор на основе этого списка действий и первоначального намерения ACTION_SEND с правильным типом mime.

Еще одно преимущество заключается в том, что Skype больше не указан (что реагирует на тип mime rfc822).

Чтобы ПРОСТО ПОЛУЧИТЬ EMAIL APPS, чтобы решить ваши намерения, вам необходимо указать ACTION_SENDTO как Action и mailto как Data.

 private void sendEmail(){ Intent emailIntent = new Intent(Intent.ACTION_SENDTO); emailIntent.setData(Uri.parse("mailto:" + "[email protected]")); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "My email's subject"); emailIntent.putExtra(Intent.EXTRA_TEXT, "My email's body"); try { startActivity(Intent.createChooser(emailIntent, "Send email using...")); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(Activity.this, "No email clients installed.", Toast.LENGTH_SHORT).show(); } } 

Страtagsя использования .setType("message/rfc822") или ACTION_SEND также соответствует приложениям, которые не являются почтовыми клиентами, такими как Android Beam и Bluetooth .

Использование ACTION_SENDTO и mailto: URI, похоже, отлично работает и рекомендуется в документации разработчика . Однако, если вы делаете это на официальных эмуляторах и не настроено никаких учетных записей электронной почты (или нет почтовых клиентов), вы получаете следующую ошибку:

Неподдерживаемые действия

Это действие в настоящее время не поддерживается.

Как показано ниже:

Неподдерживаемое действие: это действие в настоящее время не поддерживается.

Оказывается, эмуляторы разрешают намерение активности, называемой com.android.fallback.Fallback , которая отображает указанное выше сообщение. По-видимому, это по дизайну.

Если вы хотите, чтобы ваше приложение обходилось, чтобы оно также корректно работало на официальных эмуляторах, вы можете проверить его, прежде чем пытаться отправить электронное письмо:

 private void sendEmail() { Intent intent = new Intent(Intent.ACTION_SENDTO) .setData(new Uri.Builder().scheme("mailto").build()) .putExtra(Intent.EXTRA_EMAIL, new String[]{ "John Smith " }) .putExtra(Intent.EXTRA_SUBJECT, "Email subject") .putExtra(Intent.EXTRA_TEXT, "Email body") ; ComponentName emailApp = intent.resolveActivity(getPackageManager()); ComponentName unsupportedAction = ComponentName.unflattenFromString("com.android.fallback/.Fallback"); if (emailApp != null && !emailApp.equals(unsupportedAction)) try { // Needed to customise the chooser dialog title since it might default to "Share with" // Note that the chooser will still be skipped if only one app is matched Intent chooser = Intent.createChooser(intent, "Send email with"); startActivity(chooser); return; } catch (ActivityNotFoundException ignored) { } Toast .makeText(this, "Couldn't find an email app and account", Toast.LENGTH_LONG) .show(); } 

Найдите дополнительную информацию в документации разработчика .

Я решил эту проблему с простыми строками кода, как объясняет документация по android.

( https://developer.android.com/guide/components/intents-common.html#Email )

Наиболее важным является флаг: это ACTION_SENDTO , а не ACTION_SEND

Другая важная линия

 intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this*** 

Кстати, если вы отправите пустой Extra , if() в конце не будет работать, и приложение не запустит почтовый клиент.

Согласно документации на Android. Если вы хотите, чтобы ваши намерения обрабатывались только приложением электронной почты (а не с другими текстовыми сообщениями или социальными приложениями), используйте действие ACTION_SENDTO и ACTION_SENDTO схему данных « mailto: ». Например:

 public void composeEmail(String[] addresses, String subject) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); // only email apps should handle this intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } } 

Отправка электронной почты может осуществляться с помощью намерений, которые не требуют настройки. Но тогда это потребует взаимодействия с пользователем, и макет будет немного ограничен.

Построение и отправка более сложной электронной почты без взаимодействия с пользователем влечет за собой создание собственного клиента. Первое, что Sun Java API для электронной почты недоступно. У меня был успех, используя библиотеку Apache Mime4j для создания электронной почты. Все они основаны на документах на nilvec .

просто попробуйте этот

  public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); buttonSend = (Button) findViewById(R.id.buttonSend); textTo = (EditText) findViewById(R.id.editTextTo); textSubject = (EditText) findViewById(R.id.editTextSubject); textMessage = (EditText) findViewById(R.id.editTextMessage); buttonSend.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String to = textTo.getText().toString(); String subject = textSubject.getText().toString(); String message = textMessage.getText().toString(); Intent email = new Intent(Intent.ACTION_SEND); email.putExtra(Intent.EXTRA_EMAIL, new String[] { to }); // email.putExtra(Intent.EXTRA_CC, new String[]{ to}); // email.putExtra(Intent.EXTRA_BCC, new String[]{to}); email.putExtra(Intent.EXTRA_SUBJECT, subject); email.putExtra(Intent.EXTRA_TEXT, message); // need this to prompts email client only email.setType("message/rfc822"); startActivity(Intent.createChooser(email, "Choose an Email client :")); } }); } 

Я использую приведенный ниже код в своих приложениях. Это показывает точно почтовые клиентские приложения, такие как Gmail.

  Intent contactIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", getString(R.string.email_to), null)); contactIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.email_subject)); startActivity(Intent.createChooser(contactIntent, getString(R.string.email_chooser))); 

Вот пример рабочего кода, который открывает почтовое приложение в устройстве android и автоматически заполняется с адресом To и Subject в отправляющей почте.

 protected void sendEmail() { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:[email protected]")); intent.putExtra(Intent.EXTRA_SUBJECT, "Feedback"); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } } 

Другое решение может быть

 Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); emailIntent.setType("plain/text"); emailIntent.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail"); emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"[email protected]m"}); emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Yo"); emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Hi"); startActivity(emailIntent); 

Предполагая, что большинство Android-устройств уже установлено приложение GMail.

Используйте это для отправки электронной почты …

 boolean success = EmailIntentBuilder.from(activity) .to("[email protected]") .cc("[email protected]") .subject("Error report") .body(buildErrorReport()) .start(); 

использовать build gradle:

 compile 'de.cketti.mailto:email-intent-builder:1.0.0' 

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

 public static void sentEmail(Context mContext, String[] addresses, String subject, String body) { try { Intent sendIntentGmail = new Intent(Intent.ACTION_VIEW); sendIntentGmail.setType("plain/text"); sendIntentGmail.setData(Uri.parse(TextUtils.join(",", addresses))); sendIntentGmail.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail"); sendIntentGmail.putExtra(Intent.EXTRA_EMAIL, addresses); if (subject != null) sendIntentGmail.putExtra(Intent.EXTRA_SUBJECT, subject); if (body != null) sendIntentGmail.putExtra(Intent.EXTRA_TEXT, body); mContext.startActivity(sendIntentGmail); } catch (Exception e) { //When Gmail App is not installed or disable Intent sendIntentIfGmailFail = new Intent(Intent.ACTION_SEND); sendIntentIfGmailFail.setType("*/*"); sendIntentIfGmailFail.putExtra(Intent.EXTRA_EMAIL, addresses); if (subject != null) sendIntentIfGmailFail.putExtra(Intent.EXTRA_SUBJECT, subject); if (body != null) sendIntentIfGmailFail.putExtra(Intent.EXTRA_TEXT, body); if (sendIntentIfGmailFail.resolveActivity(mContext.getPackageManager()) != null) { mContext.startActivity(sendIntentIfGmailFail); } } } 

Это покажет вам только клиентов электронной почты (а также PayPal по неизвестной причине)

  public void composeEmail() { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"}); intent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); intent.putExtra(Intent.EXTRA_TEXT, "Body"); try { startActivity(Intent.createChooser(intent, "Send mail...")); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); } } 

Вот как я это сделал. Ницца и просто.

 String emailUrl = "mailto:[email protected]?subject=Subject Text&body=Body Text"; Intent request = new Intent(Intent.ACTION_VIEW); request.setData(Uri.parse(emailUrl)); startActivity(request); 

Этот метод работает для меня. Он открывает приложение Gmail (если установлено) и устанавливает mailto.

 public void openGmail(Activity activity) { Intent emailIntent = new Intent(Intent.ACTION_VIEW); emailIntent.setType("text/plain"); emailIntent.setType("message/rfc822"); emailIntent.setData(Uri.parse("mailto:"+activity.getString(R.string.mail_to))); emailIntent.putExtra(Intent.EXTRA_SUBJECT, activity.getString(R.string.app_name) + " - info "); final PackageManager pm = activity.getPackageManager(); final List matches = pm.queryIntentActivities(emailIntent, 0); ResolveInfo best = null; for (final ResolveInfo info : matches) if (info.activityInfo.packageName.endsWith(".gm") || info.activityInfo.name.toLowerCase().contains("gmail")) best = info; if (best != null) emailIntent.setClassName(best.activityInfo.packageName, best.activityInfo.name); activity.startActivity(emailIntent); } 

Я использовал этот код для отправки почты, сразу же создав раздел по умолчанию для почтового приложения.

  Intent i = new Intent(Intent.ACTION_SENDTO); i.setType("message/rfc822"); i.setData(Uri.parse("mailto:")); i.putExtra(Intent.EXTRA_EMAIL , new String[]{"[email protected]"}); i.putExtra(Intent.EXTRA_SUBJECT, "Subject"); i.putExtra(Intent.EXTRA_TEXT , "body of email"); try { startActivity(Intent.createChooser(i, "Send mail...")); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); } 
  • Как отправить почту из приложения iPhone
  • Как получить основной адрес электронной почты устройства Android
  • Ориентация изображения MFMailComposeViewController
  • Interesting Posts

    static_assert не удается выполнить компиляцию, хотя функция шаблона называется нигде

    Приемник широковещательной передачи не работает в ICS, если приложение не запускается по крайней мере один раз

    Точка доступа Wi-Fi с учетной записью

    Используйте Windows Live ID, но введите логин с другим паролем

    Есть ли способ эффективно управлять вкладками в Notepad ++

    Получение вывода из приложения оболочки / dos в приложение Delphi

    Макрос для конкатенации двух строк в C

    R.raw.any не может быть разрешено

    Как изменить приложение по умолчанию для всех файлов определенного типа файла через терминал в OS X?

    Как изменить свойства по умолчанию для коннектора Visio?

    Можете ли вы заставить компонент React перезапустить без вызова setState?

    java.util.zip – Восстанавливающая структура каталогов

    Значение ‘const’ является последним в объявлении функции classа?

    Данные XML для базы данных PostgreSQL

    Как контролировать интернет-соединение для перерывов – для Mac OS X

    Давайте будем гением компьютера.