代号一 Android sendMessage HTML
Codename One Android sendMessage HTML
我的应用程序使用以下代码编译并发送 HTML 消息:
String s = ...; // html text with normal & bold face, proportional & monospaced fonts, etc.
Message msg = new Message(s);
msg.setMimeType(Message.MIME_HTML);
sendMessage(subject, msg, recipients);
在 iOS (iPhone X) 这行得通,邮件应用打开并显示正确的 html 文本呈现。
在 Android(三星标签 A)上这不起作用:
- Gmail 应用程序:显示带换行符的纯文本(无粗体等)
- 电子邮件应用程序 (Samsung):没有换行符的纯文本 (dito)
(在带有电子邮件客户端的模拟器中,我看到了正确的 html 源文本。)
如何解决?
也许这与https://github.com/codenameone/CodenameOne/issues/3101有关。
编辑
使用以下 HTML 示例进行测试:
<!DOCTYPE html>
<html>
<body>
<h2>Example</h2>
Text with <b>bold</b> and <i>italics</i>.<br>
This text on a new line.
</body>
</html>
输出如下(读取已发送邮件的截图):
顺便说一句,当发送纯文本而不是 HTML 时,换行符不会出现在 Gmail 中,而它们会出现在 Samsung Email 中(参见问题 3101)。
这些年来,情况似乎发生了很大变化。
Html.fromHtml
已弃用 Build.VERSION.SDK_INT >= 24
。
它现在需要一个额外的标志参数,Html.FROM_HTML_MODE_LEGACY
。
但是,旧版本仍然受支持并且确实如此。
还有一个版本HtmlCompat.fromHtml
,是等价的。
Class Html 支持 HTML 子集,例如支持 <b>
、<i>
和 <font>
,但不支持 <html>
和 <body>
。
接下来,发送 html 消息的推荐方式已更改。
而不是使用类型 "text/html"
、参数 EXTRA_TEXT
和方法 fromHtml
,
我们应该使用类型 "text/plain"
,使用参数 EXTRA_TEXT
提供纯文本(见下文)
和使用参数EXTRA_HTML_TEXT
提供原始HTML源文本。
支持(完全)HTML 的电子邮件客户端将使用 EXTRA_HTML_TEXT
,不退回到 EXTRA_TEXT
.
的电子邮件客户端
然后,Google 似乎在几年前删除了 HTML 对 Gmail 的支持(为什么??).
使用上述方法,Gmail 回退到 EXTRA_TEXT
而 Samsung Email 支持 EXTRA_HTML_TEXT
并且 正确呈现 HTML!
Gmail 中发生的事情是 HTML 输入被“净化”,这似乎意味着只有纯文本出来,
为 <h1>
、<br>
等使用适当的换行符。不支持其他格式,例如粗体、斜体或字体。
Html.fromHtml
方法对于为 Gmail 创建 EXTRA_TEXT
后备文本仍然有用。
我使用 Android 的本机代码尝试了很多事情,但我无法让 Gmail 正确呈现 HTML。
我找到了几种不同的方法来让它在三星电子邮件中工作;我将介绍我认为应该如何完成的。
结论
下面的代码是解决问题的方法
https://github.com/codenameone/CodenameOne/issues/3101 和
https://github.com/codenameone/CodenameOne/issues/3386.
如果您想发送 HTML 格式的文本,这将适用于某些电子邮件客户端(例如 Samsung Email),但不适用于其他客户端(尤其是 Gmail)。在后一种情况下,您只能发送带有一些换行符格式的纯文本。
如果您想发送包含带换行符的纯文本的邮件,请生成一个仅包含文本和 <br>
标签的字符串,并且
使用下面的代码将其作为 HTML 发送。这在 Samsung Email 和 Gmail 中给出了正确的结果。
package com.xx.yy;
import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.text.Html;
import com.codename1.impl.android.AndroidNativeUtil;
import com.codename1.impl.android.IntentResultListener;
import com.codename1.io.Log;
public class AndroidNativeInterfaceImpl {
// adapted from com.codename1.impl.android.AndroidImplementation.sendMessage()
// pass HTML String, not Message; no attachments
public void sendHTMLMessage(String recipient, String subject, String msg) {
String[] recipients = new String[] { recipient };
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.putExtra(Intent.EXTRA_EMAIL, recipients);
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
// deprecated
//emailIntent.setType("text/html");
//emailIntent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(msg));
// new
emailIntent.setType("text/plain");
emailIntent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(msg, Html.FROM_HTML_MODE_LEGACY)); // fallback text for e.g. Gmail
emailIntent.putExtra(Intent.EXTRA_HTML_TEXT, msg); // raw (full) HTML for e.g. Samsung Email
AndroidNativeUtil.startActivityForResult(Intent.createChooser(emailIntent, "Send mail..."), new IntentResultListener() {
public void onActivityResult (int requestCode, int resultCode, Intent data) {
Log.p("native sendHTMLMessage done");
}
});
}
public boolean isSupported() {
return true;
}
}
编辑:一些有用的链接
https://developer.android.com/reference/android/content/Intent.html#ACTION_SEND
Has Android's Gmail app removed the ability to send HTML emails via Intent?
我的应用程序使用以下代码编译并发送 HTML 消息:
String s = ...; // html text with normal & bold face, proportional & monospaced fonts, etc.
Message msg = new Message(s);
msg.setMimeType(Message.MIME_HTML);
sendMessage(subject, msg, recipients);
在 iOS (iPhone X) 这行得通,邮件应用打开并显示正确的 html 文本呈现。
在 Android(三星标签 A)上这不起作用:
- Gmail 应用程序:显示带换行符的纯文本(无粗体等)
- 电子邮件应用程序 (Samsung):没有换行符的纯文本 (dito)
(在带有电子邮件客户端的模拟器中,我看到了正确的 html 源文本。)
如何解决?
也许这与https://github.com/codenameone/CodenameOne/issues/3101有关。
编辑
使用以下 HTML 示例进行测试:
<!DOCTYPE html>
<html>
<body>
<h2>Example</h2>
Text with <b>bold</b> and <i>italics</i>.<br>
This text on a new line.
</body>
</html>
输出如下(读取已发送邮件的截图):
顺便说一句,当发送纯文本而不是 HTML 时,换行符不会出现在 Gmail 中,而它们会出现在 Samsung Email 中(参见问题 3101)。
这些年来,情况似乎发生了很大变化。
Html.fromHtml
已弃用 Build.VERSION.SDK_INT >= 24
。
它现在需要一个额外的标志参数,Html.FROM_HTML_MODE_LEGACY
。
但是,旧版本仍然受支持并且确实如此。
还有一个版本HtmlCompat.fromHtml
,是等价的。
Class Html 支持 HTML 子集,例如支持 <b>
、<i>
和 <font>
,但不支持 <html>
和 <body>
。
接下来,发送 html 消息的推荐方式已更改。
而不是使用类型 "text/html"
、参数 EXTRA_TEXT
和方法 fromHtml
,
我们应该使用类型 "text/plain"
,使用参数 EXTRA_TEXT
提供纯文本(见下文)
和使用参数EXTRA_HTML_TEXT
提供原始HTML源文本。
支持(完全)HTML 的电子邮件客户端将使用 EXTRA_HTML_TEXT
,不退回到 EXTRA_TEXT
.
然后,Google 似乎在几年前删除了 HTML 对 Gmail 的支持(为什么??).
使用上述方法,Gmail 回退到 EXTRA_TEXT
而 Samsung Email 支持 EXTRA_HTML_TEXT
并且 正确呈现 HTML!
Gmail 中发生的事情是 HTML 输入被“净化”,这似乎意味着只有纯文本出来,
为 <h1>
、<br>
等使用适当的换行符。不支持其他格式,例如粗体、斜体或字体。
Html.fromHtml
方法对于为 Gmail 创建 EXTRA_TEXT
后备文本仍然有用。
我使用 Android 的本机代码尝试了很多事情,但我无法让 Gmail 正确呈现 HTML。 我找到了几种不同的方法来让它在三星电子邮件中工作;我将介绍我认为应该如何完成的。
结论
下面的代码是解决问题的方法 https://github.com/codenameone/CodenameOne/issues/3101 和 https://github.com/codenameone/CodenameOne/issues/3386.
如果您想发送 HTML 格式的文本,这将适用于某些电子邮件客户端(例如 Samsung Email),但不适用于其他客户端(尤其是 Gmail)。在后一种情况下,您只能发送带有一些换行符格式的纯文本。
如果您想发送包含带换行符的纯文本的邮件,请生成一个仅包含文本和 <br>
标签的字符串,并且
使用下面的代码将其作为 HTML 发送。这在 Samsung Email 和 Gmail 中给出了正确的结果。
package com.xx.yy;
import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.text.Html;
import com.codename1.impl.android.AndroidNativeUtil;
import com.codename1.impl.android.IntentResultListener;
import com.codename1.io.Log;
public class AndroidNativeInterfaceImpl {
// adapted from com.codename1.impl.android.AndroidImplementation.sendMessage()
// pass HTML String, not Message; no attachments
public void sendHTMLMessage(String recipient, String subject, String msg) {
String[] recipients = new String[] { recipient };
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.putExtra(Intent.EXTRA_EMAIL, recipients);
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
// deprecated
//emailIntent.setType("text/html");
//emailIntent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(msg));
// new
emailIntent.setType("text/plain");
emailIntent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(msg, Html.FROM_HTML_MODE_LEGACY)); // fallback text for e.g. Gmail
emailIntent.putExtra(Intent.EXTRA_HTML_TEXT, msg); // raw (full) HTML for e.g. Samsung Email
AndroidNativeUtil.startActivityForResult(Intent.createChooser(emailIntent, "Send mail..."), new IntentResultListener() {
public void onActivityResult (int requestCode, int resultCode, Intent data) {
Log.p("native sendHTMLMessage done");
}
});
}
public boolean isSupported() {
return true;
}
}
编辑:一些有用的链接
https://developer.android.com/reference/android/content/Intent.html#ACTION_SEND
Has Android's Gmail app removed the ability to send HTML emails via Intent?