Chinaunix首页 | 论坛 | 博客
  • 博客访问: 543086
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 18:35:12

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判断地址中有没有特殊标点,如果存在,就对其前后加双引号,如红色部分代码。如果没有,就直接加尖括号。最终,这个加了标点的发送方地址应被处理为<>。
阅读(429) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~