我正试图编写一个C#程序来模拟ActiveSync设备通过SendMail命令发送电子邮件。
每次我向exchange服务器发送请求时。。。响应发回状态代码110-未知服务器错误
在设备日志中,我看到以下异常:
---异常启动---异常类型:System.NotImplementedException异常消息:这种节点应该包含blob,而不是字符串异常级别:0异常堆栈跟踪:在Microsoft.Exchange.AirSync.Wbxml.AirSyncBlobXmlNode.set_InerText(字符串值)在Microsoft.Exchange.AirSync.Wbxml.WbxmlReader.FillXmlElement(XmlElement elem,Int32深度、布尔型elemIsSecureData、布尔型elemIsBlobData)在Microsoft.Exchange.AirSync.Wbxml.WbxmlReader.FillXmlElement(XmlElement elem,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命令,但我不知道我在这个请求调用中做错了什么。
如果有人能为我指明正确的方向,我将不胜感激
提前谢谢!
我终于找到了问题的答案。
mime标记的内容必须是CData,而不是文本。
酷,搞定了!近一年后,我破解了它,并在语音电子邮件中实现了ActiveSync SmartReply(我的产品,在这里偷偷添加了一个链接)。
因此,我发现我需要发送外部标记,然后使用WBXML编码器的opaque
方法来编码mime字符串。我只是把它作为字符串传递,它为我用CDATA包起来。
这是我的代码(使用Mozilla jsas库,它是javascript而不是C#,但这可能是互联网上唯一可用的代码示例,所以不要因此向我开枪!):
var replyMime = 'From: ' + self.info.emailAddress + 'n';
replyMime += 'MIME-Version: 1.0n';
replyMime += 'Content-Type: text/plainn';
replyMime += 'To: ' + recipient + 'n';
replyMime += 'Subject: RE: Testn';
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);
});
});
这里是fiddler数据包(使用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>