【问题标题】:Unable to send mail using activesync SendMail request schema. Status return 102 / 119无法使用 activesync SendMail 请求架构发送邮件。状态返回 102 / 119
【发布时间】:2020-01-08 22:50:25
【问题描述】:

我能够通过 activesync 获得对 Provision、FolderSync、Sync、Search、ItemOperations 等的响应,但我无法发送邮件。

我使用的是 14.1 协议版本。

我在某处读到 SendMail:Mime 必须是 CData 格式。如果 Mime 数据是文本内容,服务器会抛出错误 102,但使用 CData 会抛出 119。以下是编码前的 xml:

下面没有 CData。服务器抛出 102:无效的WBXML。

<composemail:SendMail xmlns:composemail="ComposeMail">
    <composemail:ClientId>1294231504</composemail:ClientId>
    <composemail:SaveInSentItems/>
    <composemail:Mime>From: test@mail.com
        To: test@mail.com
        Subject: 123
        MIME-Version: 1.0
        Content-Type: text/plain; charset=utf-8

        This is the body text
    </composemail:Mime>
</composemail:SendMail>

下面是cdata。服务器抛出 119:MessageHasNoRecipient。

<composemail:SendMail xmlns:composemail="ComposeMail">
    <composemail:ClientId>1240110395</composemail:ClientId>
    <composemail:SaveInSentItems/>
    <composemail:Mime>
        <![CDATA[From: test@mail.com
        To: test@mail.com
        Subject: 123
        MIME-Version: 1.0
        Content-Type: text/plain; charset=utf-8

        This is the body text]]>
    </composemail:Mime>
</composemail:SendMail>

我需要对 mime 消息进行 base64 处理还是 xml 中缺少参数?

如果有帮助,消息字符串如下:

String test = "From: test@mail.com"
        +"\nTo: test@mail.com"
        +"\nSubject: 123"
        +"\nMIME-Version: 1.0"
        +"\nContent-Type: text/plain; charset=utf-8"

        +"\n\nThis is the body text";

Node mimeNode = itemOperationsXML.createElementNS(Namespaces.composeMailNamespace,
            Xmlns.composeMailXmlns + ":Mime");
mimeNode.appendChild(itemOperationsXML.createCDATASection(test));
rootNode.appenChild(mimeNode );

【问题讨论】:

  • 任何熟悉 Activesync 协议的人可以提供帮助?

标签: java android activesync


【解决方案1】:

解决了。不知何故,我错误地编码了 CDATA。对于那些使用 Activesync for android 的人,下面是 ASWBXML.java 用于编码字节整数的代码:

private byte[] encodeMultiByteInteger(int value) {

    List<Byte> byteList = new ArrayList<>();
    while (value > 0) {
        byte addByte = (byte) (value & 0x7F);
        if (byteList.size() > 0) {
            addByte |= 0x80;
        }
        byteList.add(0, addByte);
        value >>= 7;
    }
    byte[] b = new byte[byteList.size()];
    for (int i = 0; i < byteList.size(); i++) {
        b[i] = byteList.get(i);
    }
    return b;

【讨论】:

    猜你喜欢
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 2014-10-15
    • 2014-09-03
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多