Лучший (и самый простой) способ - использовать Intent:
Intent i =newIntent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL ,newString[]{"recipient@example.com"});
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();}
В противном случае вам придется написать свой собственный клиент.
В приведенном выше коде нет идентификатора электронной почты отправителя. Затем, как отправить сообщение?
KIRAN KJ
38
КИРАН: Вам нужно разобраться, как работают Интенты, чтобы понять это. По сути, он откроет почтовое приложение с уже заполненным получателем, темой и телом. Это зависит от приложения электронной почты, чтобы сделать отправку.
Джереми Логан
8
Письмо не появляется в поле «TO» при запуске операции. кто-нибудь знает?
Хамза Вакас
11
большой вклад этого комментария: сообщение / rfc822
Гильерме Оливейра
22
добавьте их, чтобы быть уверенным, что chooser отображает только почтовые приложения: Intent i = new Intent(Intent.ACTION_SENDTO);i.setType("message/rfc822");i.setData(Uri.parse("mailto:"));
Edris
194
Использование .setType("message/rfc822")или выбор покажет вам все (многие) приложения, которые поддерживают намерение отправки.
Хорошо, у этого должно быть больше голосов "за". Вы не заметите тестирование на эмуляторе, но когда вы отправите «text / plain» на реальном устройстве, вы получите список из 15+ приложений! поэтому обязательно рекомендуется использовать message / rfc822 (стандарт электронной почты).
Бланделл
7
@Blundell привет, но я не увидел никакой разницы после того, как перешел наmessage/rfc822
ничья
2
Вы можете удалить Bluetooth из списка? Это также обнаруживается с этим типом. +1 хотя, аккуратный трюк!
ingh.am
4
Спас наш бекон. Не могу себе представить, объясняя клиенту, что пользователь может твитить запросы поддержки, а не по электронной почте.
Кевин Галлиган
1
+1111111 Это заслуживает бесконечных +1, чтобы другие могли это увидеть. Я пропустил эту часть, и мне пришлось некоторое время заниматься этой проблемой!
Вызов
89
Я использую это с давних времен, и это кажется хорошим, никаких приложений, не относящихся к электронной почте, не появляется. Просто еще один способ отправить письмо с намерением:
Intent intent =newIntent(Intent.ACTION_SENDTO);// it's not ACTION_SEND
intent.putExtra(Intent.EXTRA_SUBJECT,"Subject of email");
intent.putExtra(Intent.EXTRA_TEXT,"Body of email");
intent.setData(Uri.parse("mailto:default@recipient.com"));// 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);
Неподдерживаемое действие: это действие в настоящее время не поддерживается
erdomester
4
lgor G-> plz изменить с setType "(обычный / текст") на setType ("текст / обычный")
sachit
2
.setType ("message / rfc822") не текст / обычный
The Hungry Androider
1
этот код откроет адрес электронной почты? Как я могу отправить письмо, не показывая намерения пользователю @yuku Я хочу отправить пароль на электронную почту
Я использовал что-то вроде принятого в настоящее время ответа, чтобы отправлять электронные письма с приложенным двоичным файлом журнала ошибок. GMail и K-9 отправляют его очень хорошо, и он также приходит нормально на мой почтовый сервер. Единственной проблемой был мой почтовый клиент по выбору Thunderbird, у которого были проблемы с открытием / сохранением прикрепленного файла журнала. Фактически это просто не сохраняло файл вообще без жалоб.
Я взглянул на один из исходных текстов этих писем и заметил, что вложение файла журнала (понятно) имеет тип mime message/rfc822 . Конечно, это вложение не является прикрепленным письмом. Но Thunderbird не может изящно справиться с этой крошечной ошибкой. Это был облом.
После небольшого исследования и экспериментов я нашел следующее решение:
Intent i =newIntent(Intent.ACTION_SEND);
i.setType("*/*");
i.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(crashLogFile));
i.putExtra(Intent.EXTRA_EMAIL,newString[]{
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.
Затем он просматривает список доступных действий, которые отвечают на намерение mailtoпротокола ACTION_SENDTO (которые являются только приложениями электронной почты), и строит средство выбора на основе этого списка действий и исходного намерения ACTION_SEND с правильным типом mime.
Еще одним преимуществом является то, что Skype больше не указан (что происходит с типом mime rfc822).
Я только что вставил фрагмент кода, и он отлично работает. До того, как были перечислены приложения, такие как Google Drive, Skype и т. Д. Но разве нет способа отправить письмо из приложения, не вызывая другое приложение? я только что прочитал статью о почтовом клиенте, который @Rene постет выше, но кажется слишком сложным, чтобы просто отправить простое электронное письмо
Alex Cio
Отличный ответ. У меня были также Skype и Google Drive, ACTION_SENDи это было прекрасно.
Дарренп
1
Самое популярное решение, приведенное выше, возвращает также Skype и Vkontakte. Это решение лучше.
Денис Кутлубаев
что такое crashLogFile? где он инициализирован? pease sepecify
Noufal
@Noufal Это всего лишь остаток от моей собственной базы кода. Это Fileэкземпляр, указывающий на файл журнала сбоев, который мои Android-приложения создают в фоновом режиме на случай возникновения необработанного исключения. Этот пример должен просто иллюстрировать, как добавить вложение электронной почты. Вы также можете прикрепить любой другой файл из внешнего хранилища (например, изображение). Вы также можете удалить эту строку crashLogFile, чтобы получить рабочий пример.
Тигучи
37
Чтобы ПОЛЬЗОВАТЬСЯ ПРИЛОЖЕНИЯМИ ПО ЭЛЕКТРОННОЙ ПОЧТЕ для разрешения вашего намерения, вам нужно указать ACTION_SENDTO как Действие и mailto как Данные.
Наиболее важным является флаг: он есть ACTION_SENDTO, а неACTION_SEND
Другая важная линия
intent.setData(Uri.parse("mailto:"));***// only email apps should handle this***
Кстати, если вы отправите пустое Extra, то if()в конце не будет работать, и приложение не запустит почтовый клиент.
Согласно документации Android. Если вы хотите убедиться, что ваши намерения обрабатываются только приложением электронной почты (а не другими приложениями для обмена текстовыми сообщениями или социальными приложениями), используйте это ACTION_SENDTOдействие и включите « mailto:» схему данных. Например:
publicvoid composeEmail(String[] addresses,String subject){Intent intent =newIntent(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);}}
Стратегия использования .setType("message/rfc822")или, по- ACTION_SENDвидимому, также соответствует приложениям, которые не являются почтовыми клиентами, такие как Android Beam и Bluetooth .
Использование ACTION_SENDTOи mailto:URI, кажется, работает отлично, и рекомендуется в документации для разработчиков . Однако, если вы делаете это на официальных эмуляторах и не настроены учетные записи электронной почты (или нет почтовых клиентов), вы получите следующую ошибку:
Если вы хотите, чтобы ваше приложение обошло это так, чтобы оно также корректно работало на официальных эмуляторах, вы можете проверить его, прежде чем пытаться отправить электронное письмо:
privatevoid sendEmail(){Intent intent =newIntent(Intent.ACTION_SENDTO).setData(newUri.Builder().scheme("mailto").build()).putExtra(Intent.EXTRA_EMAIL,newString[]{"John Smith <johnsmith@yourdomain.com>"}).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 matchedIntent 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();}
Отправка электронной почты может быть выполнена с помощью Intents, которая не требует настройки. Но тогда это потребует взаимодействия с пользователем, и расположение будет немного ограничено.
Создание и отправка более сложных электронных писем без взаимодействия с пользователем влечет за собой создание собственного клиента. Во-первых, Sun Java API для электронной почты недоступен. Я успешно использовал библиотеку Apache Mime4j для создания электронной почты. Все основано на документах в Nilvec .
Спасибо. По сравнению с решением @Avi Parshan вы устанавливаете адрес электронной почты setData(), а Avi - putExtra(). Оба варианта рабочие. Но если удалить setDataи использовать только intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hi@example.com"});, было бы ActivityNotFoundException.
CoolMind
5
Я использую приведенный ниже код в своих приложениях. Это показывает именно почтовые клиентские приложения, такие как Gmail.
Отличное решение! Это позволяет избежать многих неподходящих приложений (в основном используется как «Поделиться»). Не добавляйте intent.type = "message/rfc822"; intent.type = "text/html";сюда, так как это приведет к исключению.
Эта функция вначале направляет Gmail с прямым намерением на отправку электронной почты, если Gmail не найден, а затем продвигает средство выбора намерений. Я использовал эту функцию во многих коммерческих приложениях, и она работает нормально. Надеюсь, это поможет вам:
Как это может быть лучше, чем ответы, которые уже существовали, когда вы опубликовали это? Это просто выглядит как копия принятого ответа, завернутого в упражнении.
@PedroVarela мы всегда можем проверить активность не найден исключение.
Silentsudo
1
Да мы можем. Но ваше решение не является правильным. В документации Android четко указано, что вам нужно сделать, чтобы показывать только почтовые приложения в средстве выбора. Вы написали «Предполагая, что на большинстве устройств Android уже установлено приложение Gmail»; Что делать, если это корневое устройство и пользователь удаляет клиент Gmail? Предположим, вы создаете собственное почтовое приложение ?, если пользователь собирается отправить электронное письмо, ваше приложение не будет в этом списке. Что произойдет, если Gmail изменит имя пакета? Собираетесь ли вы обновить свое приложение?
Педро Варела
2
Используйте это для отправки электронной почты ...
Я использовал этот код для отправки почты, непосредственно запустив раздел создания почтового приложения по умолчанию.
Intent i =newIntent(Intent.ACTION_SENDTO);
i.setType("message/rfc822");
i.setData(Uri.parse("mailto:"));
i.putExtra(Intent.EXTRA_EMAIL ,newString[]{"test@gmail.com"});
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();}
/**
* Will start the chosen Email app
*
* @param context current component context.
* @param emails Emails you would like to send to.
* @param subject The subject that will be used in the Email app.
* @param forceGmail True - if you want to open Gmail app, False otherwise. If the Gmail
* app is not installed on this device a chooser will be shown.
*/publicstaticvoid sendEmail(Context context,String[] emails,String subject,boolean forceGmail){Intent i =newIntent(Intent.ACTION_SENDTO);
i.setData(Uri.parse("mailto:"));
i.putExtra(Intent.EXTRA_EMAIL, emails);
i.putExtra(Intent.EXTRA_SUBJECT, subject);if(forceGmail && isPackageInstalled(context,"com.google.android.gm")){
i.setPackage("com.google.android.gm");
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);}else{try{
context.startActivity(Intent.createChooser(i,"Send mail..."));}catch(ActivityNotFoundException e){Toast.makeText(context,"No email app is installed on your device...",Toast.LENGTH_SHORT).show();}}}/**
* Check if the given app is installed on this devuice.
*
* @param context current component context.
* @param packageName The package name you would like to check.
* @return True if this package exist, otherwise False.
*/publicstaticboolean isPackageInstalled(@NonNullContext context,@NonNullString packageName){PackageManager pm = context.getPackageManager();if(pm !=null){try{
pm.getPackageInfo(packageName,0);returntrue;}catch(PackageManager.NameNotFoundException e){
e.printStackTrace();}}returnfalse;}
Intent emailIntent =newIntent(Intent.ACTION_SENDTO,Uri.fromParts("mailto","ebgsoldier@gmail.com",null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT,"Forgot Password");
emailIntent.putExtra(Intent.EXTRA_TEXT,"Write your Pubg user name or Phone Number");
startActivity(Intent.createChooser(emailIntent,"Send email..."));**strong text**
String mailto ="mailto:bob@example.org"+"?cc="+"alice@example.com"+"&subject="+Uri.encode(subject)+"&body="+Uri.encode(bodyText);Intent emailIntent =newIntent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse(mailto));try{
startActivity(emailIntent);}catch(ActivityNotFoundException e){//TODO: Handle case where no email app is available}
Приведенный выше код откроет любимый почтовый клиент пользователей, предварительно заполненный электронным письмом, готовым к отправке.
Ответы:
Лучший (и самый простой) способ - использовать
Intent
:В противном случае вам придется написать свой собственный клиент.
источник
Intent i = new Intent(Intent.ACTION_SENDTO);
i.setType("message/rfc822");
i.setData(Uri.parse("mailto:"));
Использование
.setType("message/rfc822")
или выбор покажет вам все (многие) приложения, которые поддерживают намерение отправки.источник
message/rfc822
Я использую это с давних времен, и это кажется хорошим, никаких приложений, не относящихся к электронной почте, не появляется. Просто еще один способ отправить письмо с намерением:
источник
Я использовал что-то вроде принятого в настоящее время ответа, чтобы отправлять электронные письма с приложенным двоичным файлом журнала ошибок. GMail и K-9 отправляют его очень хорошо, и он также приходит нормально на мой почтовый сервер. Единственной проблемой был мой почтовый клиент по выбору Thunderbird, у которого были проблемы с открытием / сохранением прикрепленного файла журнала. Фактически это просто не сохраняло файл вообще без жалоб.
Я взглянул на один из исходных текстов этих писем и заметил, что вложение файла журнала (понятно) имеет тип mime
message/rfc822
. Конечно, это вложение не является прикрепленным письмом. Но Thunderbird не может изящно справиться с этой крошечной ошибкой. Это был облом.После небольшого исследования и экспериментов я нашел следующее решение:
Может использоваться следующим образом:
Как видите, метод createEmailOnlyChooserIntent можно легко передать с правильным намерением и правильным типом mime.
Затем он просматривает список доступных действий, которые отвечают на намерение
mailto
протокола ACTION_SENDTO (которые являются только приложениями электронной почты), и строит средство выбора на основе этого списка действий и исходного намерения ACTION_SEND с правильным типом mime.Еще одним преимуществом является то, что Skype больше не указан (что происходит с типом mime rfc822).
источник
ACTION_SEND
и это было прекрасно.File
экземпляр, указывающий на файл журнала сбоев, который мои Android-приложения создают в фоновом режиме на случай возникновения необработанного исключения. Этот пример должен просто иллюстрировать, как добавить вложение электронной почты. Вы также можете прикрепить любой другой файл из внешнего хранилища (например, изображение). Вы также можете удалить эту строкуcrashLogFile
, чтобы получить рабочий пример.Чтобы ПОЛЬЗОВАТЬСЯ ПРИЛОЖЕНИЯМИ ПО ЭЛЕКТРОННОЙ ПОЧТЕ для разрешения вашего намерения, вам нужно указать ACTION_SENDTO как Действие и mailto как Данные.
источник
Я решил эту проблему с помощью простых строк кода, как объясняется в документации Android.
( https://developer.android.com/guide/components/intents-common.html#Email )
Наиболее важным является флаг: он есть
ACTION_SENDTO
, а неACTION_SEND
Другая важная линия
Кстати, если вы отправите пустое
Extra
, тоif()
в конце не будет работать, и приложение не запустит почтовый клиент.Согласно документации Android. Если вы хотите убедиться, что ваши намерения обрабатываются только приложением электронной почты (а не другими приложениями для обмена текстовыми сообщениями или социальными приложениями), используйте это
ACTION_SENDTO
действие и включите «mailto:
» схему данных. Например:источник
Стратегия использования
.setType("message/rfc822")
или, по-ACTION_SEND
видимому, также соответствует приложениям, которые не являются почтовыми клиентами, такие как Android Beam и Bluetooth .Использование
ACTION_SENDTO
иmailto:
URI, кажется, работает отлично, и рекомендуется в документации для разработчиков . Однако, если вы делаете это на официальных эмуляторах и не настроены учетные записи электронной почты (или нет почтовых клиентов), вы получите следующую ошибку:Как показано ниже:
Оказывается, эмуляторы разрешают намерение для вызываемой активности
com.android.fallback.Fallback
, которая отображает вышеуказанное сообщение. Видимо это по замыслу.Если вы хотите, чтобы ваше приложение обошло это так, чтобы оно также корректно работало на официальных эмуляторах, вы можете проверить его, прежде чем пытаться отправить электронное письмо:
Найти больше информации в документации для разработчиков .
источник
Отправка электронной почты может быть выполнена с помощью Intents, которая не требует настройки. Но тогда это потребует взаимодействия с пользователем, и расположение будет немного ограничено.
Создание и отправка более сложных электронных писем без взаимодействия с пользователем влечет за собой создание собственного клиента. Во-первых, Sun Java API для электронной почты недоступен. Я успешно использовал библиотеку Apache Mime4j для создания электронной почты. Все основано на документах в Nilvec .
источник
Вот пример рабочего кода, который открывает почтовое приложение на Android-устройстве и автоматически заполняется адресами и темами в письме.
источник
setData()
, а Avi -putExtra()
. Оба варианта рабочие. Но если удалитьsetData
и использовать толькоintent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hi@example.com"});
, было быActivityNotFoundException
.Я использую приведенный ниже код в своих приложениях. Это показывает именно почтовые клиентские приложения, такие как Gmail.
источник
Это покажет вам только почтовые клиенты (а также PayPal по неизвестной причине)
источник
intent.type = "message/rfc822"; intent.type = "text/html";
сюда, так как это приведет к исключению.Вот как я это сделал. Красиво и просто.
источник
Эта функция вначале направляет Gmail с прямым намерением на отправку электронной почты, если Gmail не найден, а затем продвигает средство выбора намерений. Я использовал эту функцию во многих коммерческих приложениях, и она работает нормально. Надеюсь, это поможет вам:
источник
просто попробуйте этот
источник
Другое решение может быть
Предполагая, что на большинстве устройств Android уже установлено приложение GMail.
источник
Используйте это для отправки электронной почты ...
используйте build gradle:
источник
Я использовал этот код для отправки почты, непосредственно запустив раздел создания почтового приложения по умолчанию.
источник
Этот метод работает для меня. Он открывает приложение Gmail (если установлено) и устанавливает mailto.
источник
источник
источник
Попробуй это:
Приведенный выше код откроет любимый почтовый клиент пользователей, предварительно заполненный электронным письмом, готовым к отправке.
Источник
источник