smtp发送邮件记得结尾发送"\r\n.\r\n"
前段时间老板安排我修复一个邮件服务器后台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"的更多相关文章
- PHP+socket+SMTP、POP3协议发送、接收邮件
.实现SMTP协议的类dsmtp.cls.php:<?php , $webname=).); } } .实现POP3协议的类dpop3.cls.php: <? ...
- C# 通过smtp服务器进行邮件发送 MailHelper
C# 通过smtp服务器进行邮件发送 MailHelper.cs using System; using System.Data; using System.Configuration; using ...
- PHP 通过带SSL的SMTP 发送邮件的处理
客户端与SMTP服务器的通讯, 是通过固定的命令以及返回编号完成的. 发送Email, 需要经过的步骤有创建socket (区分带ssl, 还是不带ssl)执行命令, 并检查返回值是否与预期一致, 不 ...
- php socket通过smtp发送邮件(纯文本、HTML,多收件人,多抄送,多密送)
<?php /** * 邮件发送类 * 支持发送纯文本邮件和HTML格式的邮件,可以多收件人,多抄送,多秘密抄送 * @example * $mail = new MySendMail(); * ...
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全 Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...
- php smtp发送邮件功能
<?php header("Content-Type: text/html; charset=utf-8"); class smtp { /* Public Variable ...
- 再谈用java实现Smtp发送邮件之Socket编程
很多其它内容欢迎訪问个人站点 http://icodeyou.com 前几天利用Socket实现了用java语言搭建webserver,全程下来应该会对Socket这个东西已经使用的很熟悉了.尽管 ...
- python SMTP 发送邮件
#!/usr/bin/env/python # -*- coding: utf-8 -*- # @Time : 2018/11/19 9:56 # @Author : ChenAdong # @Ema ...
- python学习(21) smtp发送邮件
原文链接: https://www.jianshu.com/p/369ec15bfe22 本文介绍python发送邮件模块smtplib以及相关MIME模块.smtplib用于生成邮件发送的代理,发送 ...
随机推荐
- 使用cxf 发布 jax-rs 风格webservice 。并客户端测试。
详细介绍:http://www.ibm.com/developerworks/cn/java/j-lo-jaxrs/ 1.定义一个User对象 package com.zf.test; import ...
- Linux usb gadget框架概述
很幸运,在公司开发了gadget相关驱动,总结下来,大大小小开发了四个与gadget相关的驱动,字符驱动.g_multi.g_ether.g_zero,在这里把自己对gadget的开发中自己的感悟记录 ...
- 9 RESTful API
1 RESTful API 2 post创建一个视频 put帖子加精,delete删除 3 自定义状态码 4 5 6 7 8
- 【Python】函数参数类型及用法
一.函数的参数类型 def hs(a1,a2,a3,...): ****statements 其中a1,a2,a3是函数的参数,函数的参数类型可分为:必须参数.默认参数.可变参数(不定长参数).关键 ...
- easyui-combogrid匹配查询
用到easyui-combogrid,数据比较少的情况,可以一页就显示完毕,然后直接下拉选择.但是对于数据量比较大的情况,一页显示全部显然不合适,好在从easyui-combogrid的数据加载方式可 ...
- loj2056 「TJOI / HEOI2016」序列
当年我还没学cdq的时候在luogu上写过树套树的代码orzzz ref #include <algorithm> #include <iostream> #include & ...
- 16、响应式布局和BootStrap 全局CSS样式知识点总结-part3
1.响应式工具 ①可用的类 <div class="container"> <a href="#" class="visible-x ...
- Oracle 分析函数--Row_Number()
row_number() over ([partition by col1] order by col2) ) as 别名 表示根据col1分组,在分组内部根据 col2排序 而这个“别名”的值就表示 ...
- web 大规模并发访问的解决方案
电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们 ...
- ci日志记录
log_message($level, $message) 参数: $level (string) -- Log level: 'error', 'debug' or 'info' $message ...