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

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

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

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

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

  numofreads = ;

   while((n = read(fd, buf, MAXBUFSIZE)) > ){
numofreads++; if(spaminessbuf == NULL || numofreads != ){
send(psd, buf, n, );
} else {
p1 = &buf[];
p2 = strstr(p1, "\r\n\r\n");
if(p2){
send(psd, buf, p2-p1+, );
send(psd, spaminessbuf, strlen(spaminessbuf), );
send(psd, p2, n-(p2-p1), );
} else {
send(psd, buf, n, );
}
}
}
send(psd,"\r\n.\r\n",strlen("\r\n.\r\n"),0);
close(fd);

smtp发送邮件记得结尾发送"\r\n.\r\n"的更多相关文章

  1. PHP+socket+SMTP、POP3协议发送、接收邮件

    .实现SMTP协议的类dsmtp.cls.php:<?php            , $webname=).);     } } .实现POP3协议的类dpop3.cls.php: <? ...

  2. C# 通过smtp服务器进行邮件发送 MailHelper

    C# 通过smtp服务器进行邮件发送 MailHelper.cs using System; using System.Data; using System.Configuration; using ...

  3. PHP 通过带SSL的SMTP 发送邮件的处理

    客户端与SMTP服务器的通讯, 是通过固定的命令以及返回编号完成的. 发送Email, 需要经过的步骤有创建socket (区分带ssl, 还是不带ssl)执行命令, 并检查返回值是否与预期一致, 不 ...

  4. php socket通过smtp发送邮件(纯文本、HTML,多收件人,多抄送,多密送)

    <?php /** * 邮件发送类 * 支持发送纯文本邮件和HTML格式的邮件,可以多收件人,多抄送,多秘密抄送 * @example * $mail = new MySendMail(); * ...

  5. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  6. php smtp发送邮件功能

    <?php header("Content-Type: text/html; charset=utf-8"); class smtp { /* Public Variable ...

  7. 再谈用java实现Smtp发送邮件之Socket编程

    很多其它内容欢迎訪问个人站点   http://icodeyou.com 前几天利用Socket实现了用java语言搭建webserver,全程下来应该会对Socket这个东西已经使用的很熟悉了.尽管 ...

  8. python SMTP 发送邮件

    #!/usr/bin/env/python # -*- coding: utf-8 -*- # @Time : 2018/11/19 9:56 # @Author : ChenAdong # @Ema ...

  9. python学习(21) smtp发送邮件

    原文链接: https://www.jianshu.com/p/369ec15bfe22 本文介绍python发送邮件模块smtplib以及相关MIME模块.smtplib用于生成邮件发送的代理,发送 ...

随机推荐

  1. A1046 Shortest Distance (20)(20 分)

    1046 Shortest Distance (20)(20 分)提问 The task is really simple: given N exits on a highway which form ...

  2. memset和memcpy

    void memset(void s, int ch, size_t n); 函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 ...

  3. 51NOD:1639-绑鞋带

    传送门:https://www.51nod.com/onlineJudge/submitDetail.html#!judgeId=475129 1639 绑鞋带 基准时间限制:1 秒 空间限制:131 ...

  4. Kubespray部署Kubernetes 1.13.0(使用本地镜像仓库)

    1. 下载kubespray # git clone https://github.com/kubernetes-sigs/kubespray.git # cd kubespray # pip ins ...

  5. 笔记-python tutorial-9.classes

    笔记-python tutorial-9.classes 1.      Classes 1.1.    scopes and namespaces namespace: A namespace is ...

  6. OpenCV学习笔记(二) cv::Mat

    部分内容转自:OpenCV Tuturial,ggicci 在OpenCV Tuturial中可查看Mat的初始化与打印方法. Mat本质上是由两个数据部分组成的类: 矩阵头(包含矩阵尺寸,存储方法, ...

  7. Redis实现之RDB持久化(二)

    RDB文件结构 在Redis实现之RDB持久化(一)这一章中,我们介绍了Redis服务器保存和载入RDB文件的方法,在这一节,我们将对RDB文件本身进行介绍,并详细说明文件各个部分的结构和意义.图1- ...

  8. PDO 连接与连接管理

    连接是通过创建 PDO 基类的实例而建立的.不管使用哪种驱动程序,都是用 PDO 类名. 构造函数接收用于指定数据库源(所谓的 DSN)以及可能还包括用户名和密码(如果有的话)的参数. 连接到 MyS ...

  9. 【LeetCode】Excel Sheet Column Number(Excel表列序号)

    这道题是LeetCode里的第171道题. 题目描述: 给定一个Excel表格中的列名称,返回其相应的列序号. 例如, A -> 1 B -> 2 C -> 3 ... Z -> ...

  10. PAT——乙级1026and1046

    1026 程序运行时间 (15 point(s)) 要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() ...