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用于生成邮件发送的代理,发送 ...
随机推荐
- django_数据库操作—增、删、改、查
增加 增加数据有两种方法 1> sava >>> from datetime import date >>> book = BookInfo( btitle= ...
- oracle 事务 锁机制
原文地址:http://www.cnblogs.com/quanweiru/archive/2013/05/24/3097367.html 本课内容属于Oracle高级课程范畴,内容略微偏向理论性,但 ...
- Linux命令之---mkdir
命令简介 mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 命令格式 mkdir [选项] 目录...(这里可以是多个目 ...
- Spark性能优化:资源调优篇
在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置 ...
- windows下的命令
1.cd 现在默认只能在当前盘符中改变目录,如果要改变盘符则需要多加一个/d命令. cd /d d:/git/springTest 2.chdir 显示当前目录名或改变当前目录. CHDIR [/D] ...
- webpack + babel + vue 环境设置
npm i webpack --save-dev npm install style-loader css-loader url-loader babel-loader sass-loader fil ...
- 使用JavaConfig方式-Spring 基础学习
在Spring的使用中,大量采用xml方式配置类之间的关系太过于繁琐(个人这么认为),而在学习了Spring4后发下使用JavaConfig方式来配置这些关系会更加的简单明了. 测试环境 1. Apa ...
- 12个scp传输文件的命令栗子
12个scp传输文件的命令栗子 一直在用scp进行简单的远程复制文件的功能,今天无意间看到一篇介绍scp的文章,便想着学习学习并将其翻译了过来.原文戳这里.翻译不对的地方,敬请指正. 另外我最近搭建了 ...
- vmware克隆centos修改linux mac地址
故障背景: 在vmware workstation中了完全克隆了一个已经存在的centos的虚拟机,启动之后发现网卡没有启动.于是重启一下network服务,发现提示错误信息“Device eth0 ...
- 微信小程序-----校园头条详细开发之首页
1.首页展示功能的实现 1.1 结构 1.2 代码实现 1.2.1 界面的设计这里就不多说了,样式都是我自己写的,还有就是页面的跳转,看详细代码 var app = getApp() Page({ ...