browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

使用 MAPI 发送中文短信时避免乱码的方法

Posted by on 2008 年 12 月 24 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

这个有必要记录一下,在使用 MAPI 发送中文短信时,会发现所有的英文都很正常,但是中文却变成了 "?" 这样的乱码。在接收端用内存视图查看,会发现这个 "?" 是真正的问号字符,而不是乱码。
出现这个问题的原因是发送端未将短信属性设为 Unicode 格式,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
// IMessage* pMessage;
 
MAPINAMEID idName;
ZeroMemory(&idName, sizeof(MAPINAMEID));
 
idName.lpguid = (LPGUID)&PS_MAPI;
idName.ulKind = MNID_STRING;
idName.Kind.lpwstrName = L"SMS:Unicode";
LPMAPINAMEID pidName = &idName;
LPSPropTagArray pPropTag = NULL;
HRESULT hr = pMessage->GetIDsFromNames(1, &pidName, MAPI_CREATE, &pPropTag);

这样就获得了 Unicode 短信属性的 Tag,接下来就可以设置短信并发送了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SPropValue props[5];
ZeroMemory(&props, sizeof(props));
 
props[0].ulPropTag = PR_SUBJECT_W;
props[0].Value.lpszW = L"你好,世界!";
 
props[1].ulPropTag = PR_SENDER_EMAIL_ADDRESS;
props[1].Value.lpszW = L"";
 
props[2].ulPropTag = PR_MSG_STATUS;
props[2].Value.ul = MSGSTATUS_RECTYPE_SMS;
 
props[3].ulPropTag = PR_MESSAGE_FLAGS;
props[3].Value.ul = MSGFLAG_FROMME | MSGFLAG_UNSENT;
 
props[4].ulPropTag = CHANGE_PROP_TYPE(pPropTag[0].aulPropTag[0], PT_BOOLEAN);
props[4].Value.b = TRUE;
 
hr = pMessage->SetProps(sizeof(props) / sizeof(props[0]),
    (LPSPropValue)&props, NULL);
hr = pMessage->SubmitMessage(0);

订阅本站

没有评论

(Required)
(Required, will not be published)