在百度文库中的《使用telnet协议收发邮件》,我们可以很清楚地看到如何通过telnet来进行发送邮件,下面是一些需要用到的命令,通过以下命令可以很容易实现邮件发送功能。为了更好地理解其中每一步的含义,我决定自己写一份可以自动发送邮件的代码。

 #include <winsock.h>
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
#define WSWENS MAKEWORD(2,0)
#define MAXLINE 10240 //将服务器回应的信息打印
void response(SOCKET sock,char buff[])
{
int len = recv(sock, buff, MAXLINE, );
buff[len]=;
cout<<buff<<endl;
} int main()
{
sockaddr_in sin;
WSADATA wsadata; //对Winsock服务初始化
if(WSAStartup(WSWENS, &wsadata) !=)
cout<<"startup failed"<<endl; //创建套接字,指定端口号
SOCKET s = socket(PF_INET,SOCK_STREAM,);
memset(&sin, , sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(); //获取服务器IP地址
hostent* hptr = gethostbyname("smtp.163.com");
memcpy(&sin.sin_addr.S_un.S_addr, hptr->h_addr_list[], hptr->h_length);
printf("IP of smpt.163.com is : %d:%d:%d:%d",
sin.sin_addr.S_un.S_un_b.s_b1,
sin.sin_addr.S_un.S_un_b.s_b2,
sin.sin_addr.S_un.S_un_b.s_b3,
sin.sin_addr.S_un.S_un_b.s_b4);
cout << endl; //建立与服务器的连接
if(connect(s, (sockaddr*)&sin, sizeof(sin)))
{
cout << "connect failed!" << endl;
exit();
}
else
{
cout << "connect success!" << endl;
} char bufferresv[];
response(s, bufferresv); // send "ehlo"
char bufferHello[] = "ehlo lca\r\n";
cout << "ehlo..." << endl;
send(s, bufferHello, strlen(bufferHello), );
response(s,bufferresv); // send "auth login"
char bufferLogin[] = "auth login\r\n";
cout << "auth login..." << endl;
send(s, bufferLogin, strlen(bufferLogin),);
response(s,bufferresv); // send "username", "psw"
char bufferUserName[] = "bGNhMTgyNkAxNjMuY29t\r\n";
//发送邮箱名lca1826@163.com的BASE64编码
char bufferpsw[] = "bGNhMTgyNg==\r\n";
//发送邮箱密码lca182600的BASE64编码 cout << "input username...." << endl;
send(s,bufferUserName,strlen(bufferUserName),);
response(s,bufferresv); cout << "input password..." << endl;
send(s,bufferpsw,strlen(bufferpsw),);
response(s,bufferresv); // mail from:<lca1826@163.com>
char bufferMailFrom[] = "mail from:<lca1826@163.com>\r\n";
cout << "mail from:<lca1826@163.com>..." << endl;
send(s, bufferMailFrom, strlen(bufferMailFrom), );
response(s,bufferresv); // rcpt to:<lca1826@sina.com>
char bufferRcptTo[] = "rcpt to:<lca1826@sina.com>\r\n";
cout << "rcpt to:<lca1826@sina.com>..." << endl;
send(s, bufferRcptTo, strlen(bufferRcptTo), );
response(s,bufferresv); // data
char bufferData[] = "data\r\n";
cout << "data..." << endl;
send(s, bufferData,strlen(bufferData), );
response(s,bufferresv); // from.. to.. subject..
char bufferFrom[] = "from:lca1826@163.com\r\n";
char bufferTo[] = "to:lca1826@sina.com\r\n";
char bufferSubject[] = "subject:hello from test\r\n"; cout << "from:lca1826@163.com..." << endl;
send(s, bufferFrom, strlen(bufferFrom), );
cout << "to:lca1826@sina.com... " << endl;
send(s, bufferTo, strlen(bufferTo), );
cout << "subject:hello from test..." << endl;
send(s, bufferSubject, strlen(bufferSubject), ); //content
char buffersend[] = "virus!!!\r\n";
cout<<"virus!!!"<<endl;
send(s, buffersend, strlen(buffersend), ); //end
char bufferPoint[] = ".\r\n";
send(s, bufferPoint, strlen(bufferPoint), );
response(s,bufferresv); //quit
char bufferend[] = "quit\r\n";
send(s, bufferend, strlen(bufferend), );
response(s,bufferresv);
return ;
}

下面是程序运行后的截图:

下面是发送成功后的截图:

注:在上述编码的时候需要使用BASE64加密解密,可使用这个网站http://tool.chinaz.com/Tools/base64.aspx

总结:

1.在用QQ邮箱做服务器很不稳定,有时候根本就连不上服务器,有时候在输入auth login会返回错误,尤其是在用BASE64编码后的用户名和密码输入时永远返回530错误,即使已经在QQ邮箱中设置了SMTP服务,并且用授权码登陆,依旧失败,这个问题一直找不到解决办法,于是换成163邮箱做服务器。
2.通过各种调试,几乎遇到了下列的所有错误,不过最终大部分都解决了,有些错误可能只是因为服务器太忙,多尝试几次就好了,只有一个554错误(下图),在发送邮件是会被当作垃圾邮件拦截,而且在还没有发送成功时就发生这个错误,可见并不是因为发送过多或者过于频繁导致的发送失败,虽然等了一段时间再运行程序会发送成功,但这个问题也还没有找到解决办法。

telnet发送邮件过程中返回的各种信息:
220 :服务就绪(通常知名服务器类型)
250 :请求邮件动作正确,完成(HELO,MAIL FROM,RCPT TO,QUIT 指令执行成功会返回此信息)
235 :认证通过
221 :正在处理
334 :在加密后的用户名和密码输入后返回此信息
354 :开始发送数据,以 .结束(DATA指令执行成功会返回此信息)
500 :语法错误,命令不能识别
530 :未设置SMTP服务
550 :命令不能执行,邮箱无
554 DT:SPM:该邮件包含未被网容易许可内容。违背网易反垃圾邮件条款

[计算机网络] C++模拟telnet登陆SMTP服务发送邮件过程的更多相关文章

  1. 通过telnet使用smtp协议发送邮件

    smtp协议是一个简单的邮件传输协议,利用它我们可以将邮件发送给别人,这里将通过telnet这个程序利用smtp协议从网易向gmail发送一封邮件 网上不少有说使用telnet发送邮件的文章,我也看过 ...

  2. Linux SendMail 使用外部SMTP服务发送邮件

    这个今天刚好用到,就测试了一下.OK了..因为,PYTHON模块是可以,但SHELL脚本用SHELL发,还是合拍点.. http://my.oschina.net/duangr/blog/183162 ...

  3. wordpress配置SMTP服务发送邮件(qq邮箱)

    wordpress有一个注册功能,填了用户名和邮箱后,会收到一封邮件,邮件里有一个链接,点击该链接可以获得密码和修改密码.但是,最开始,你会发现,等半天都没有收到邮件,再等到猴年马月也不会收到. 但是 ...

  4. 设置Linux使用SMTP服务发送邮件

    很多时候我们需要知道服务器的运行状态,比如发生了异常的报警.数据库备份的状态等,假如服务器自动跟你汇报那就好了,我们可以通过设置当触发某些条件时让服务器发送邮件给你,这样你就可以了解你的服务器的状态怎 ...

  5. windows下使用远程工具登录虚拟机上的Linux、访问虚拟机上的服务 、端口转发、win7 telnet登陆虚拟机

    首先要清楚virtual box如何设置端口转发: 一篇文章: 如何使用VirtualBox进行端口转发 由于默认的方式是用NAT来做虚拟机网络的,因此如果从外网想访问虚拟机的应用会比较麻烦.以前一直 ...

  6. Qt5基于smtp服务发送电子邮件

    1.设置邮箱 先登录163邮箱,然后在邮箱界面找到设置,在里面开通smtp服务. 这一步比较关键,要开通smtp服务,在开通的过程中会让你输入一个邮箱客户端授权码,这个才是你后面要用到的密码,而不是你 ...

  7. java代码发送邮箱验证码与qq邮箱smtp服务

    发送邮箱的类封装,在此之前需要一个jar包  javax.mail.jar 下载链接https://github.com/javaee/javamail/releases/download/JAVAM ...

  8. 设置邮箱发送服务|邮箱开始SMTP服务和腾讯云解封25端口的经验总结

    原文链接: http://www.lookdaima.com/WebForms/WebPages/Blanks/Pm/Docs/DocItemDetail.aspx?id=7dfaaf63-d36f- ...

  9. Linux 上使用 Gmail SMTP 服务器发送邮件通知

    导读 假定你想配置一个 Linux 应用,用于从你的服务器或桌面客户端发送邮件信息.邮件信息可能是邮件简报.状态更新(如 Cachet).监控警报(如 Monit).磁盘时间(如 RAID mdadm ...

随机推荐

  1. matlab读取txt文本

    textread函数 原文:http://blog.sina.com.cn/s/blog_618af1950100k926.html 文档:https://ww2.mathworks.cn/help/ ...

  2. vim 智能提示插件 YouCompleteMe安装

    按照网上的教程安装该软件,没有一篇是成功的(也有可能是没找对).自己从网上东拼西凑的,终于让自己的vim智能识别了. 1. 升级 vim: (ubuntu) sudo add-apt-reposito ...

  3. 北京Uber优步司机奖励政策(1月10日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  4. HttpClient&Jsoup爬虫的简单应用

    详细的介绍已经有很多前辈总结,引用一下该篇文章:https://blog.csdn.net/zhuwukai/article/details/78644484 下面是一个代码的示例: package ...

  5. 3551: [ONTAK2010]Peaks加强版

    3551: [ONTAK2010]Peaks加强版 https://www.lydsy.com/JudgeOnline/problem.php?id=3551 分析: kruskal重构树 +  倍增 ...

  6. python之web架构

    一.web架构简介 web.py是一个轻量级Python web框架,它简单而且功能强大.web.py是一个开源项目.该框架由已故美国作家.Reddit联合创始人.RSS规格合作创造者.著名计算机黑客 ...

  7. spring源码-开篇

    一.写博客也有一段时间了,感觉东西越来越多了,但是自己掌握的东西越来越少了,很多时候自己也在想.学那么多东西,到头来知道的东西越来越少了.是不是很奇怪,其实一点都不奇怪. 我最近发现了一个很大的问题, ...

  8. generator-ivweb 基于react-redux的多页脚手架

    背景 每个公司甚至每个项目组,在开发新项目的时候都会有一些自己特色的东西,比如公共组件,ajax请求拦截处理,内部积累的一些业务逻辑等等,如果没有自己的脚手架,那么拷贝代码成为常态,每个项目的结构,甚 ...

  9. VIN码识别,车架号识别,OCR扫描工具

    近年二手车交易市场火爆,对二手车估值需要了详细解二手车的历史状况,车架号(VIN码)是车辆唯一的身份标识,也是了解二手车车况的入口,车商和二手车平台会频繁的进行车况查询,VIN码扫描识别技术给车辆估值 ...

  10. katalon系列七:Katalon Studio全局变量

    假如你有3个脚本都用到了用户名,如果是写死在脚本中,那么需要改变的时候,你需要修改3个地方,我们可以把用户名设为全局变量,在3个脚本中引用,需要修改时只要修改全局变量中的用户名值即可. 在Katalo ...