Задача:
Отправить Email содержащий html код через Intent.
Отправить Email содержащий html код через Intent.
- Получателей может быть более 1.
- Сообщение может содержать как обычный текст, так и html, например:
'Hello! How are you?
<a href="https://www.google.com/">Google</a>'
Внимание. Код из заметки не гарантирует корректную работу со всеми почтовыми клиентами. Протестировано на GMail.
Update 20.03.17. Все способы отправки HTML перестали работать в GMail начиная с версии 6.11.2 по текущую 7.2.26. Ходит информация, что Google выпилил данный функционал из приложения.
Update 20.03.17. Все способы отправки HTML перестали работать в GMail начиная с версии 6.11.2 по текущую 7.2.26. Ходит информация, что Google выпилил данный функционал из приложения.
Начнём с общих шагов.
Нам необходимо создать интент в котором указать Получателей, Тему сообщения, Сообщение. Далее, на основе созданного интента вызвать диалог выбора приложения для отправки сообщения.
Константы для определения типа действия:
ACTION_SEND — позволяет подобрать приложения на основе MIME-типа
Обязательно указываем MIME-тип. Для почтовых сообщений он может быть таким: 'text/plain', '*/*'
Нам необходимо создать интент в котором указать Получателей, Тему сообщения, Сообщение. Далее, на основе созданного интента вызвать диалог выбора приложения для отправки сообщения.
Константы для определения типа действия:
ACTION_SEND — позволяет подобрать приложения на основе MIME-типа
Обязательно указываем MIME-тип. Для почтовых сообщений он может быть таким: 'text/plain', '*/*'
ACTION_SENDTO — позволяет подобрать приложения, которые поддерживают определённую схему данных
Обязательно указываем схему данных. Для почтовых сообщений это: 'mailto:'
Самая главная подзадача: Встроить html код в сообщение. Возможно кто-то уже полез в справку и нашёл там константу EXTRA_HTML_TEXT. К сожалению, у меня она не заработала. Приложения просто игнорировали связанный с ней текст. Так что мы пойдём другим путём, через класс HTML.
Общие юниты:
Как видите, в uses есть нестандартный модуль "Androidapi.JNI.text.Html". Утилита для генерации обёрток косячная, поэтому пришлось вносить правки самостоятельно. Файл есть в архиве с исходниками, действителен для АПИ 19.
Общее описание кода:
1) Создаём Интент
2) Указываем тип или схему данных
3) Указываем «Получателей» (EXTRA_EMAIL)
4) Указываем «Тему Сообщения» (EXTRA_SUBJECT)
5) Указываем «Текст Сообщения» (EXTRA_TEXT) пропустив через функцию fromHtml
6) Вызываем диалог выбора приложения (можно задать заголовок диалога, в данном случае я написал 'Send Email').
Как обычно исходники в конце заметки.
Вот так выглядит моё тестовое приложение:
ACTION_SEND или ищем все подходящие приложения.
Общие юниты:
uses Androidapi.JNI.JavaTypes, FMX.Helpers.Android, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers, Androidapi.JNI.text.Html, Androidapi.JNI.Net, Androidapi.JNI.App;
Как видите, в uses есть нестандартный модуль "Androidapi.JNI.text.Html". Утилита для генерации обёрток косячная, поэтому пришлось вносить правки самостоятельно. Файл есть в архиве с исходниками, действителен для АПИ 19.
Общее описание кода:
1) Создаём Интент
2) Указываем тип или схему данных
3) Указываем «Получателей» (EXTRA_EMAIL)
4) Указываем «Тему Сообщения» (EXTRA_SUBJECT)
5) Указываем «Текст Сообщения» (EXTRA_TEXT) пропустив через функцию fromHtml
6) Вызываем диалог выбора приложения (можно задать заголовок диалога, в данном случае я написал 'Send Email').
Как обычно исходники в конце заметки.
Вот так выглядит моё тестовое приложение:
ACTION_SEND или ищем все подходящие приложения.
procedure TForm2.Button1Click(Sender: TObject); var Addresses: string; MessageSubject, MessageBody: JString; EmailIntent: JIntent; EmailHtmlText: JSpanned; begin Addresses := Edit1.text; MessageSubject := StringToJString(Edit2.text); MessageBody := StringToJString(Memo1.text); EmailIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_SEND); EmailIntent.setType(StringToJString('text/plain')); EmailIntent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, CreateJavaStringArray([Addresses])); EmailIntent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, MessageSubject); EmailHtmlText := TJHtml.JavaClass.fromHtml(MessageBody); EmailIntent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, EmailHtmlText); TAndroidHelper.Activity.startActivity(TJIntent.JavaClass.createChooser(EmailIntent, StrToJCharSequence('Send Email'))); end;
ACTION_SENDTO или ищем все почтовые приложения
procedure TForm2.Button2Click(Sender: TObject); var Addresses: string; MessageSubject, MessageBody: JString; EmailIntent: JIntent; EmailHtmlText: JSpanned; begin Addresses := Edit1.text; MessageSubject := StringToJString(Edit2.text); MessageBody := StringToJString(Memo1.text); EmailIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_SENDTO); EmailIntent.setData(StrToJURI('mailto:')); EmailIntent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, CreateJavaStringArray([Addresses])); EmailIntent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, MessageSubject); EmailHtmlText := TJHtml.JavaClass.fromHtml(MessageBody); EmailIntent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, EmailHtmlText); TAndroidHelper.Activity.startActivity(TJIntent.JavaClass.createChooser(EmailIntent, StrToJCharSequence('Send Email'))); end;