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);
  • 相关阅读:
    格式化dataGridview里数据
    XtraGrid gridview基本用法
    winForm中如何控制listView的滚动条高手请进
    WinForm 和 Windows Service 通信 消息队列
    抽象工厂模式
    C#之访问控制修饰符
    JavaScript之变量
    Android之传感器(二)持续更新
    备忘录模式
    JavaScript之构造函数初了解
  • 原文地址:https://www.cnblogs.com/liuxuzzz/p/5210671.html
Copyright © 2011-2022 走看看