zoukankan      html  css  js  c++  java
  • smtp发送邮件记得结尾发送" . "

    前段时间老板安排我修复一个邮件服务器后台C程序的bug,这个功能是邮件强制发送功能,从邮件管理后台将垃圾邮件发送出去。

    因为服务器是debian系统,所以我用dbg配合日志大致跟踪后,追踪到了读取邮件文件后在while循环中使用send发送出去,代码如下:

      numofreads = 0;
      //fd为邮件文件指针,读到buf内,大小为MAXBUFSIZE
      while((n = read(fd, buf, MAXBUFSIZE)) > 0){ numofreads++;    //下面开始发送,不管走哪个if判断,都是使用send循环发送buf中的内容 if(spaminessbuf == NULL || numofreads != 1){ send(psd, buf, n, 0); } else { p1 = &buf[0]; p2 = strstr(p1, " "); if(p2){ send(psd, buf, p2-p1+2, 0); send(psd, spaminessbuf, strlen(spaminessbuf), 0); send(psd, p2, n-(p2-p1), 0); } else { send(psd, buf, n, 0); } } }  close(fd);

    按理说这段程序是没有问题的,但是有例外情况。

    我们知道smtp发送结尾是需要“空行.空行”这种格式,这段程序默认认为fd指向的邮件文件末尾有这个结束格式,但是遗憾的是公司的邮件文件生成程序并没有将这个”空行.空行“写到文件中,所以smpt服务器一直等待,一直等到最后超时导致无法发送成功。最后我的解决办法是在最后的"close(fd);"前面加上一段发送smtp结束格式的代码即可。代码如下:

      numofreads = 0;
    
       while((n = read(fd, buf, MAXBUFSIZE)) > 0){
          numofreads++;
    
          if(spaminessbuf == NULL || numofreads != 1){
             send(psd, buf, n, 0);
          } else {
             p1 = &buf[0];
             p2 = strstr(p1, "
    
    ");
             if(p2){
                send(psd, buf, p2-p1+2, 0);
                send(psd, spaminessbuf, strlen(spaminessbuf), 0);
                send(psd, p2, n-(p2-p1), 0);
             } else {
                send(psd, buf, n, 0);
             }
          }
       }   
       send(psd,"
    .
    ",strlen("
    .
    "),0);  
       close(fd);
  • 相关阅读:
    HDU 2955 Robberies(01背包)
    HDU 2602 Bone Collector(01背包)
    HUST 1352 Repetitions of Substrings(字符串)
    HUST 1358 Uiwurerirexb jeqvad(模拟解密)
    HUST 1404 Hamming Distance(字符串)
    HDU 4520 小Q系列故事――最佳裁判(STL)
    HDU 2058 The sum problem(枚举)
    【破解】修改程序版权、添加弹窗
    HDU 1407 测试你是否和LTC水平一样高(枚举)
    HDU 1050 Moving Tables(贪心)
  • 原文地址:https://www.cnblogs.com/liuxuzzz/p/5210671.html
Copyright © 2011-2022 走看看