当前位置: 首页 > 知识库问答 >
问题:

Android中的mailto链接是否需要为邮件意图进行URL编码才能工作?

裴钧
2023-03-14

环境:

Windows Server 2012标准
Android Studio 0.5.8-android-19
JRE 1.7.0_51

问题描述:

在Android web view中重写URL加载以启动电子邮件意图无法识别mailto属性。

MailTo.parse("mailto:?subject=Something%20interesting%20from%20Google&body=GooglePlus%20(%20https://google.com/plus%20)")

返回:

key: "to"
value: "/plus)"

当电子邮件意图由以下人员准备时:


    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.putExtra(Intent.EXTRA_EMAIL, new String[] { address });
    intent.putExtra(Intent.EXTRA_TEXT, body);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    intent.putExtra(Intent.EXTRA_CC, cc);
    intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setType("message/rfc822");
    intent.setData(Uri.parse("mailto:")); // only email apps should handle this
    return intent;

然后:


    if (url.startsWith("mailto:")) {
        MailTo mailTo = MailTo.parse(url);
        Intent intent = newEmailIntent(mailTo.getTo(), mailTo.getSubject(), mailTo.getBody(), mailTo.getCc());
        _mainActivity.startActivity(Intent.createChooser(intent, "Send Email..."));
        return true;
    }

如果我删除传输协议中的冒号或用%3a替换它,那么主题和正文将按预期解析。

问题:在标题中^.

提前道谢。

共有1个答案

融烨磊
2023-03-14

MailTo似乎在解析MailTo:URL时遇到了问题,该URL在主题或正文字段中包含URL中出现的字符(例如:和/)。当我试图解析一个mailto URL时遇到了这个问题,该URL在正文字段中包含一个web URL(即,我希望电子邮件正文包含一个收件人可以单击的链接)。

我为克服这一点所做的是制作MailTo类的修改副本(称为MailTo2),并将parse方法修改为如下所示:

/**
 * Parse and decode a mailto scheme string.  This parser implements
 * RFC 2368.  The returned object can be queried for the parsed
 * parameters.
 * @param theUrl String containing a mailto URL
 * @return MailTo2 object
 * @exception IllegalArgumentException if the URL scheme is not mailto.
 */
public static MailTo2 parse(String theUrl) 
  throws IllegalArgumentException 
{
  MailTo2 theMailTo2 = null;
  String  theNoSchemeUrl = null;
  String  theQuery = null;
  Uri     theEmailUri = null;
  int     thePos = 0;

  // Validate the given URL.
  if (theUrl == null) 
  {
    throw new NullPointerException();
  }
  if (!isMailTo(theUrl)) 
  {
    throw new IllegalArgumentException("Not a mailto scheme: " + theUrl);
  }

  // Strip the scheme as the URI parser can't cope with it.
  theNoSchemeUrl = theUrl.substring(MAILTO_SCHEME.length());

  // Get the query part of the URL.
  thePos = theNoSchemeUrl.indexOf('?');
  if (thePos >= 0)
  {
    theQuery = theNoSchemeUrl.substring(thePos+1);
    theNoSchemeUrl = theNoSchemeUrl.substring(0, thePos);
  }

  // Create a URL from the URL string (without scheme and query).
  theEmailUri = Uri.parse(theNoSchemeUrl);

  // Construct the MailTo2 instance which will be returned.
  theMailTo2 = new MailTo2();

  // Parse out the query parameters
  if (theQuery != null) 
  {
    String[] theQueryParts = theQuery.split("&");
    String   theName = null;
    String   theValue = null;

    for (String theQueryPart : theQueryParts) 
    {
      thePos = theQueryPart.indexOf('=');
      if (thePos <= 0)  continue;
      theName = theQueryPart.substring(0, thePos);
      theValue = theQueryPart.substring(thePos+1).trim();

      // insert the headers with the name in lower-case so that
      // we can easily find common headers
      theMailTo2.HEADERS.put(Uri.decode(theName).toLowerCase(Locale.ROOT),
                             Uri.decode(theValue));
    }
  }

  // Address can be specified in both the headers and just after the
  // mailto line. Join the two together.
  String address = theEmailUri.getPath();
  if (address != null) 
  {
    String addr = theMailTo2.getTo();
    if (addr != null) 
    {
      address += ", " + addr;
    }
    theMailTo2.HEADERS.put(TO, address);
  }

  return theMailTo2;
}
 类似资料:
  • 我有一个web应用程序,我用它从用户那里收集一些信息(不是姓名或电子邮件),然后计划让他们通过DocuSign立即在线(不是通过电子邮件)以电子方式签署文档。 为了获得签名url(又名收件人视图),我似乎必须提供收件人的定义。“收件人”定义的一部分是用户名和电子邮件地址。这是真的吗? DocuSign API/SDK是否要求我提供最终用户(亦称签名者)的名称和电子邮件地址?如果我不提供这些东西,A

  • 问题内容: 我不必太麻烦mailto链接。但是,如果可能,我现在需要在mailto正文中添加一个链接。 有没有一种方法可以添加链接或将打开的电子邮件更改为HTML电子邮件还是文本电子邮件? 就像是: 问题答案: RFC 2368的)第2节说该字段应采用格式,因此您不能使用HTML。 但是,即使您使用纯文本,某些现代邮件客户端也可能仍然将URL呈现为可点击的链接。

  • 在cshtml文件中,我将字符串分配给属性。例如: 自从@模特。值字符串可以包含任何Unicode字符,显然该字符串必须经过编码。Razor会自动编码这个值吗?我猜它不会或不能,因为我可以很容易地把一个@Html。Raw在它之后立即把整个事情分解成两个标记。 我想我需要做的是: 对吗? 同样,如果我在脚本的JavaScript字符串中嵌入字符串值,我应该使用:

  • 问题内容: [ 我正在编写自动生成HTML的代码,并且希望它对事物进行正确编码。 假设我正在生成指向以下URL的链接: 我假设所有属性值都应进行HTML编码。(如果我写错了,请纠正我。)因此,这意味着如果将上述URL放入锚标记中,则应将&编码为,如下所示: 那是对的吗? ]() 问题答案: [ 是的。HTML实体在HTML属性中进行了解析,并且流浪会造成歧义。这就是为什么您应该始终编写而不是仅在

  • 问题内容: 为什么在Hibernate中需要事务才能进行只读操作? 以下事务是否在数据库中设置了锁定? 从数据库获取示例代码: 我可以 代替使用吗? 问题答案: 您实际上可能有理由将事务标记为只读。 阅读交易看起来确实很奇怪,在这种情况下,人们通常不会标记交易方法。但是JDBC仍然会创建事务,只是如果未显式设置其他选项,它将可以正常工作。 但是,不能保证您的方法不会写入数据库。如果将method标

  • 问题内容: 如果包含变音符号(ä,ö,ü)在我的Windows操作系统上不起作用。通过反复试验,我发现需要做一些工作。 但是,当我将其实时推送到服务器上(猜测它是某种Linux)时,它又返回了一个错误,因此我删除了,然后突然工作正常。 作为一种解决方法(因此,我不需要在每次更改代码时都手动更改此代码),我已经尝试过 因为这已经反过来解决了相同的问题()也有同样的问题,但是事实证明它在每个(服务器)