【问题标题】:Codename One Android sendMessage HTML代号一 Android sendMessage HTML
【发布时间】:2021-04-05 20:56:43
【问题描述】:

我的应用编译并发送带有以下代码的 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(三星 Tab A)上这不起作用:

  • Gmail 应用:显示带有换行符的纯文本(无粗体等)
  • 电子邮件应用程序(三星):没有换行符的纯文本 (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 中,而在三星电子邮件中会出现(请参阅问题 3101)。

【问题讨论】:

  • HTML 看起来如何?如果&lt;br&gt; 受到尊重,那么为什么&lt;b&gt;&lt;strong&gt; 不会受到尊重?
  • 我在我的问题中添加了一个 HTML 示例(请参阅编辑),其中包含三个不同的输出。是否有可能这曾经有效,而现在由于最近的变化而不再有效?
  • 看一下使用这种方法的 Android 代码,我注意到大多数开发人员在创建电子邮件时不会只使用完整的 HTML 的一个子集,例如&lt;h2&gt;Example&lt;/h2&gt; Text with &lt;b&gt;bold&lt;/b&gt; and &lt;i&gt;italics&lt;/i&gt;.&lt;br&gt; This text on a new line.
  • 我试过了,输出完全一样。我提出了一个问题:github.com/codenameone/CodenameOne/issues/3386.
  • 这很奇怪。我查看了类似问题的代码,我们的代码在引擎盖下做了完全相同的事情。看起来 HTML 在 gmail 中被部分接受,因为示例被分隔并且换行符被接受。似乎只是格式本身被忽略了,这让我认为这是一个 gmail html 问题

标签: android html gmail codenameone message


【解决方案1】:

这些年来,情况似乎发生了很大变化。 Html.fromHtml 已被 Build.VERSION.SDK_INT &gt;= 24 弃用。 它现在需要一个额外的标志参数Html.FROM_HTML_MODE_LEGACY。 但是,旧版本仍然受支持,并且确实如此。 还有一个版本HtmlCompat.fromHtml,是等价的。 Html 类支持 HTML 子集,例如支持&lt;b&gt;&lt;i&gt;&lt;font&gt;,但不支持&lt;html&gt;&lt;body&gt;

接下来,发送 html 消息的推荐方式已更改。 而不是使用类型"text/html",参数EXTRA_TEXT和方法fromHtml, 我们应该使用"text/plain" 类型,使用参数EXTRA_TEXT 提供纯文本(见下文) 使用参数EXTRA_HTML_TEXT 提供原始 HTML 源文本。 支持(完整)HTML 的电子邮件客户端将使用EXTRA_HTML_TEXT,不回退到EXTRA_TEXT 的电子邮件客户端。

然后,似乎 Google 几年前已经删除了对 Gmail 的 HTML 支持为什么??)。 使用上述方法,Gmail 回退到 EXTRA_TEXT,而 Samsung Email 支持 EXTRA_HTML_TEXT 并提供 正确呈现的 HTML!

在 Gmail 中发生的情况是 HTML 输入被“净化”,这似乎意味着只有纯文本出现, 为&lt;h1&gt;&lt;br&gt; 等添加适当的换行符。不支持其他格式,例如粗体、斜体或字体。 Html.fromHtml 方法对于为 Gmail 创建 EXTRA_TEXT 后备文本仍然很有用。

我尝试了很多使用 Android 原生代码的方法,但我无法让 Gmail 正确呈现 HTML。 我找到了几种不同的方法让它在三星电子邮件中工作;我将介绍我认为应该如何完成的一个。

结论

下面的代码是解决问题的方法 https://github.com/codenameone/CodenameOne/issues/3101https://github.com/codenameone/CodenameOne/issues/3386.

如果您想发送 HTML 格式的文本,这将在某些电子邮件客户端(例如三星电子邮件)中起作用,而在其他电子邮件客户端(最显着的 Gmail)中则不起作用。在后一种情况下,您必须满足于仅发送带有某些换行格式的纯文本。

如果您要发送包含带有换行符的纯文本的邮件,请生成一个仅包含文本和&lt;br&gt; 标记的字符串,并且 使用下面的代码将此作为 HTML 发送。这会在三星电子邮件和 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

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/text/Html.java

Android - Send email with styled HTML

Has Android's Gmail app removed the ability to send HTML emails via Intent?

Sending HTML based email body using android intent

【讨论】:

    猜你喜欢
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多