【问题标题】:ActiveSync SendMail - Staus Code 110 ReturnedActiveSync SendMail - 返回状态码 110
【发布时间】:2014-06-04 21:34:45
【问题描述】:

我正在尝试编写一个 C# 程序来模拟 ActiveSync 设备通过 SendMail 命令发送电子邮件。

每次我向交换服务器发送请求时...响应会发回状态代码 110 - 未知服务器错误

在设备日志中我看到以下异常:

--- 异常开始 --- 异常类型:System.NotImplementedException 异常消息:这种节点应该包含一个 blob,而不是一个字符串 异常级别:0 异常堆栈跟踪:在 Microsoft.Exchange.AirSync.Wbxml.AirSyncBlobXmlNode.set_InnerText(字符串值) 在 Microsoft.Exchange.AirSync.Wbxml.WbxmlReader.FillXmlElement(XmlElement 元素, Int32 深度、布尔 elemIsSecureData、布尔 elemIsBlobData) 在 Microsoft.Exchange.AirSync.Wbxml.WbxmlReader.FillXmlElement(XmlElement 元素, Int32 深度、布尔 elemIsSecureData、布尔 elemIsBlobData) 在 Microsoft.Exchange.AirSync.Wbxml.WbxmlReader.ReadXmlDocument() 在 Microsoft.Exchange.AirSync.AirSyncRequest.get_XmlDocument() 在 Microsoft.Exchange.AirSync.Command.get_XmlRequest() 在 Microsoft.Exchange.AirSync.Command.WorkerThread() --- 异常结束 ---

我的 XML 在 WBXML 编码之前是这样的:

<?xml version="1.0" encoding="utf-8"?>
<SendMail xmlns="ComposeMail:">
  <ClientId>1234567890122525636247547456</ClientId>
  <Mime>From: scaletester261002@abc.com
To: scaletester361001@abc.com
Subject: Mail Subject
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Test body
</Mime>
</SendMail>

我可以成功发出 Provision、FolderSync、Sync 和 Setting 命令,但我不知道我在这个请求调用中做错了什么。

如果有人能指出我正确的方向,我将不胜感激。

提前谢谢你!

【问题讨论】:

  • 例外情况很明显。它期望在您的 xml 中获得一个 blob,但它正在寻找一个字符串。只有这个我不确定它引用的是哪个标签
  • 我相信它在 MIME 标签中。但是,当我对 MIME 标记的内容进行 base64 编码时 - 我仍然遇到同样的错误。注意:当我将内容更改为 base64 编码时,我也会更改 content-transfer-encoding 类型。我应该以不同的方式将内容转换为 blob 吗?

标签: c# activesync


【解决方案1】:

酷,成功了!将近一年后,我破解了它并在Speaking Email 中实现了 ActiveSync SmartReply(我的产品,在这里偷偷插入链接)。

所以我发现我需要发送外部标记,然后使用我的 WBXML 编码器的opaque 方法对 mime 字符串进行编码。我只是将它作为字符串传递,然后它为我将它包装在 CDATA 中。

这是我的代码(使用 Mozilla jsas 库,它是 javascript 而不是 C#,但这可能是互联网上唯一有效的代码示例,所以不要为此开枪!):

        var replyMime = 'From: ' + self.info.emailAddress + '\n';
        replyMime += 'MIME-Version: 1.0\n';
        replyMime += 'Content-Type: text/plain\n';
        replyMime += 'To: ' + recipient + '\n';
        replyMime += 'Subject: RE: Test\n';
        replyMime += '\n';
        replyMime += replyText;

        var cm = ASCP.ComposeMail.Tags;
        var w = new WBXML.Writer('1.3', 1, 'UTF-8');
        w.stag(cm.SmartReply)
            .tag(cm.ClientId, guidNoDashes())
            .tag(cm.SaveInSentItems)
            .stag(cm.Source)
                .tag(cm.FolderId, self.info.activeSyncInboxId)
                .tag(cm.ItemId, itemId)
            .etag()
            .stag(cm.Mime)
                .opaque(replyMime)
            .etag()
        .etag();
        logWBXML(w);

        self.conn.postCommand(w, function (aError, aResponse) {
            logWBXML(aResponse);
            if (aError) {
                self.reportActiveSyncError(aError)
                return;
            }

            var e = new WBXML.EventParser();
            e.addEventListener([cm.SmartReply, cm.Status], function (node) {
                self.handleStatus("ComposeMail:SmartReply", node, true);
            });
            e.run(aResponse);

            callback(msg);
        });
    });

这里是提琴手数据包(使用EAS XML Fiddler Inspector - 如果你没有它,你必须得到它!)

<?xml version="1.0" encoding="utf-8"?>
<composemail:SmartReply xmlns:composemail="ComposeMail:">
  <composemail:ClientId>c5d53f22ce9885b3f293db25580e6f54</composemail:ClientId>
  <composemail:SaveInSentItems />
  <composemail:Source>
    <composemail:FolderId>9</composemail:FolderId>
    <composemail:ItemId>Qq7X_NiQVEqCD0BDywFI5QAAAAABDEKu1_zYkFRKgg9AQ8sBSOUAAHjcWVc1</composemail:ItemId>
  </composemail:Source>
  <composemail:MIME><![CDATA[From: mike@bewebnz.onmicrosoft.com
MIME-Version: 1.0
Content-Type: text/plain
To: mike@beweb.co.nz
Subject: RE: Test

Thanks!]]></composemail:MIME>
</composemail:SmartReply>

【讨论】:

    【解决方案2】:

    我终于找到了问题的答案。

    mime 标记的内容需要是 CData 而不是文本。

    【讨论】:

    • 嗨,这听起来与我遇到的问题相似。我尝试将 mime 标签包装在 cdata 中,但没有解决。您能否给出一个完整的 XML 示例?
    • 抱歉,我暂时没有使用过这段代码,所以我手边没有示例 XML,但我的代码确实基于本教程:msdn.microsoft.com/en-us/library/hh361570(v=exchg.140).aspx 也许它也会对你有所帮助。
    • 我还没有解决这个问题,但我认为我做错了将 CDATA 作为字符串传递。我发现一些文档说它应该是一个不透明的 blob。我会做类似stag(as.MIME) 然后opaque(new Blob(myText)) 然后etag() 的事情吗?
    猜你喜欢
    • 2020-01-08
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 2015-04-10
    相关资源
    最近更新 更多