1 现象:问题描述
A项目转测试之后的一个问题单,由我负责定位修改。在史以兵和赵本江的帮助下,我们发现了一个很不起眼却很严重的问题。
正常发送一条点到邮件的消息,申请发送方地址隐藏(系统允许发送方地址隐藏),并设置系统参数SrvAnonymityAddress:Z:Z,发送成功。查看MM3的日志,收到消息中,mail from字段如下:
MAIL FROM:mtp_code/CMailMsgCoder.cppZ:Z"@197.com>
0: 00e0 fc60 4074 0003 ba44 cc5d 0800 4500 ..黗@t...D.]..E.
16: 005b 9b9f 4000 4006 6b99 0aa4 15c5 0aa4 .[..@.@.k.......
32: 0858 f3ac 0019 a354 01d0 0e04 589e 5018 .X.....T....X.P.
48: 60f4 33b2 0000 4d41 494c 2046 524f 4d3a `.3...MAIL FROM:
64: 6d74 705f 636f 6465 2f43 4d61 696c 4d73 mtp_code/CMailMs
80: 6743 6f64 6572 2e63 7070 5a3a 5a22 4031 gCoder.cppZ:Z"@1
96: 3937 2e63 6f6d 3e0d 0a 97.com>..
而正确的日志当然应该是
MAIL FROM:<>.
2 关键过程:根本原因分析
MM3的日志中,CMailMsgCoder.cpp 676 与 CSmtpSender.cpp 171均打印出错误的发送方地址。前者是对MM2消息解码后打印发送方地址信息,后者是给对端发MAIL FROM命令时打印发送方地址。存在两处日志错误,并且解码的时间在先,说明MM2消息在解码时就出错了,而非普通的打印错误。
于是把问题定位到CMailMsgCoder.cpp的MM2ToEmailCode函数,这是MOET流程的编解码,根据消息类型调用到MM3DeliverReq函数。我们来仔细查看对MailFrom字段的解析,代码如下:
case EN_FIELD_MM4_MAILFROM:
{
CSmtpCoder::ReadTextStringFromBytes(pBytesMsg, &ReadPointer);
strMailFrom = CSmtpCoder::ReadTextStringFromBytes(pBytesMsg,&ReadPointer);
int pos = strMailFrom.rfind("@");
if(-1 != pos)
{
strMailFrom = strMailFrom.substr(0,pos);
}
if ( false == CSmtpCoder::FromStringValidCheck(strMailFrom))
{
strMailFrom = '<' + "\"" + strMailFrom + "\"";
}
else
{
strMailFrom = '<' + strMailFrom;
}
strMailFrom = strMailFrom+("@"+ strLocalEmailDomainName);
strMailFrom += '>';
break;
}
MailFrom描述的是SMTP协议中的发送方地址,在这里就是设置地址隐藏的手机号码(系统参数SrvAnonymityAddress设置为Z:Z)。函数从消息体pBytesMsg读出地址后,首先对其进行"@"存在性判断,如果存在"@",就在"@"前截断。这里的处理是没有问题的。
接着,FromStringValidCheck判断地址中有没有特殊标点,如果存在,就对其前后加双引号,如红色部分代码。如果没有,就直接加尖括号。最终,这个加了标点的发送方地址应被处理为<>。
阅读(470) | 评论(0) | 转发(0) |