smtp发送邮件记得结尾发送"\r\n.\r\n"

时间:2022-06-01 19:00:29

前段时间老板安排我修复一个邮件服务器后台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, "\r\n\r\n");
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, "\r\n\r\n");
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,
"\r\n.\r\n",strlen("\r\n.\r\n"),0);
close(fd);