电子邮件客户端程序设计与实现 c++ 计网课设

电子邮件客户端程序设计与实现 C++实现


总结一下这次课设,内附代码。
这次课设尝试过一些别人的代码,一些是不能自定义标题和内容,
有一些更直接,连发都发不出去,
还有一些是报 "550 Connection denied."愣是停在了发出邮件的前夕。
本着不如自己写一个的想法就去深入了解了用telnet发邮件的过程以及原理,
然后我通过发给163邮箱发邮件反复尝试发现大部分QQ邮箱发送失败的原因是你输入邮件内容的格式问题,
因为格式不对qq邮箱发现邮件内容没有收件人,发件人,主题,然后就自动给你拦截了,
所以只要改对格式就能发给QQ邮箱的好友啦
(顺便说一句,163邮箱是真的啥邮件都能收,我这可不是吐槽他的安全问题啊)
经过反复尝试终于写出了既能自定义标题也能自定义收件人邮箱以及内容的代码。

代码如下:


#include <iostream>
#include <string>
#include <WinSock2.h> 
using namespace std;
#pragma comment(lib, "ws2_32.lib") 

int main()
{
     char buff[1500]; 
     string message;
     string info;
     string subject;

     WSADATA wsaData;
     WORD wVersionRequested = MAKEWORD(2, 1);
     //WSAStarup,即WSA(Windows SocKNDs Asynchronous,Windows套接字异步)的启动命令
     int err = WSAStartup(wVersionRequested, &wsaData);
     cout << "WSAStartup:" << err << endl;
     SOCKET sockClient; //客户端的套接字
     sockClient = socket(AF_INET, SOCK_STREAM, 0); //建立socket对象

     HOSTENT* pHostent;//hostent是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表

     pHostent = gethostbyname("smtp.qq.com"); //得到有关于域名的信息,链接到qq邮箱服务器

     SOCKADDR_IN addrServer; //服务端地址
     addrServer.sin_addr.S_un.S_addr = *((DWORD *)pHostent->h_addr_list[0]); //得到smtp服务器的网络字节序的ip地址
     addrServer.sin_family = AF_INET;
     addrServer.sin_port = htons(25); //连接端口25
     //int connect (SOCKET s , const struct sockaddr FAR *name , int namelen ); //函数原型
     err = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR)); //向服务器发送请求
     cout << "connect:" << err << endl;
     buff[recv(sockClient, buff, 1500, 0)] = '\0';
     cout << "connect:" << buff << endl;
     string ehlo = "ehlo 加上自己的QQ号或QQ邮箱地址\r\n";
     send(sockClient, ehlo.c_str(), ehlo.length(), 0);
     buff[recv(sockClient, buff, 1500, 0)] = '\0';
     cout <<"ehlo:"  << buff << endl;
     static string path = "auth login\r\n";
     send(sockClient, path.c_str(), path.length(), 0);
     buff[recv(sockClient, buff, 1500, 0)] = '\0';
     cout << "auth login:" << buff << endl;
     static string uername = "此处填base64加密的邮箱\r\n";
     send(sockClient, uername.c_str(), uername.length(), 0);
     buff[recv(sockClient, buff, 1500, 0)] = '\0';
     cout << "usrname:" << buff << endl;
     static string psw = "此处填base64加密的授权码\r\n";
     send(sockClient, psw.c_str(), psw.length(), 0);
     buff[recv(sockClient, buff, 1500, 0)] = '\0';
     cout << "password:" << buff << endl;
     string mail;
     cout << "输入收件人邮箱:";
     cin >> mail;
     message = "MAIL FROM:<此处填自己邮箱地址> \r\nRCPT TO:<";
     message.append(mail);
     message.append("> \r\n");
     cout << "message=" << message;
     send(sockClient, message.c_str(), message.length(), 0);
     buff[recv(sockClient, buff, 1500, 0)] = '\0';
     cout << "mail from的状态码: " << buff << endl;
     buff[recv(sockClient, buff, 1500, 0)] = '\0';
     cout << "rcpt to的状态码: " << buff << endl;
     message = "DATA\r\n";
     send(sockClient, message.c_str(), message.length(), 0);
     buff[recv(sockClient, buff, 1500, 0)] = '\0';
     cout<< "data命令返回的状态码: " << buff << endl;

     static string form= "from:<填自己邮箱地址>\r\nto:<"+mail+">\r\nsubject:";

        cout<<"主题:";
        cin>>subject;
        form.append(subject);
        form.append("\r\n\r\n");
        cout<<"内容:";
        cin>>info;
        form.append(info);
        form.append("\r\n.\r\n");
        send(sockClient, form.c_str(), form.length(), 0);
        message = "quit\r\n";
         send(sockClient, message.c_str(), message.length(), 0);
        buff[recv(sockClient, buff, 1500, 0)] = '\0';
         cout << "返回状态码:" << buff << endl;

         cout << "发送成功!"<<endl;
     system("pause");
}

telnet功能启用

win10很多功能都默认关闭,要开启相关功能才能实现,这里把Telnet Client功能打上钩即可

开启Telnet Client功能

用telnet发送电子邮件

在cmd窗口输入以下命令进入第三方登录界面
启用功能

连接成功后
在这里插入图片描述
用ehlo命令输入自己的QQ号进行登录
在这里插入图片描述

选择auth login 方式登录
在这里插入图片描述
返回334,成功
然后输入自己base64加密的邮箱地址
在这里插入图片描述
返回334,成功
再输入自己base64加密的授权码
在这里插入图片描述
返回235,成功登录。
输入发件地址和收件地址,报502多试几次就行了。

在这里插入图片描述

用data命令输入要传送的数据
在这里插入图片描述
数据的格式,以回车键加一个点"."再加回车键结束
在这里插入图片描述
qq邮箱收到的邮件
在这里插入图片描述

代码实现:
在这里插入图片描述
QQ邮箱收到的邮件
在这里插入图片描述

然后就ok了

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值