/*
* 文件名:SendMail.c
* 用途:基于SMTP协议的邮件发送程序
* 编程环境:WinXP SP2,Visual Studio 2005 Pro
* 参考资料:《HowTo.SMTP》,《SendMail》(NextFly写的),《MSDN 2005》
* 完成日期: 2006.8 Ver 0.01
* 作者: 88250
* 联系方式: E-mail: [email protected] QQ:845765
*/
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
const char *MailData = "From: "dl88250"<[email protected]> "
"Subject: It's a test
mail! . ";
int main(int argc, char *argv[])
{
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2, 2);
struct hostent *pHostent = NULL;
SOCKET server = INVALID_SOCKET;
struct sockaddr_in service;
int retConnect = 0;
char Buffer[1024] = {0};
if(WSAStartup(wVersionRequested, &wsaData) != 0){
printf("Error at WSAStartup() ");
goto WSACleanup;
}
server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //Create a Socket
if(server == INVALID_SOCKET){
printf("Error at socket(): %ld ", WSAGetLastError());
goto WSACleanup;
}
pHostent = gethostbyname("smtp.126.com"); //Get the Mail Server
Name
if(pHostent == NULL){
printf("The Host Name is Invalid... ");
goto WSACleanup;
}
service.sin_family = AF_INET;
memcpy(&service.sin_addr.s_addr, pHostent->h_addr_list[0],
pHostent->h_length);
service.sin_port = htons(25);
//Connect to the remote Mail Server
retConnect = connect(server, (struct sockaddr*)&service, sizeof(service));
if(retConnect == SOCKET_ERROR){
printf("Failed to connect. ");
goto WSACleanup;
}
printf("Connect to %s.... ", inet_ntoa(service.sin_addr));
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Failed to connect. ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send "HELO Server.... " to the Mail Server
retConnect = send(server, "HELO Server.... ", strlen("HELO
Server.... "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send HELO to the Mail Failure. ");
goto WSACleanup;
}else{
printf("HELO Server.... ");
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Failed to connect. ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send "AUTH LOGIN " to the Mail Server
retConnect = send(server, "AUTH LOGIN ", strlen("AUTH LOGIN "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send "AUTH LOGIN" to Mail Failure. ");
goto WSACleanup;
}else{
printf("AUTH LOGIN ");
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Receive Data From Mail Server Failure. ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send UserName to the Mail Server. The UserName is Encoded by Base64.
retConnect = send(server, "bGJleW9uZDRrb21h ",
strlen("bGJleW9uZDRrb21h "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send UserName to the Mail Failure. ");
goto WSACleanup;
}else{
printf("UserName ");
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Receive Data From the Mail Server Failure. ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send Password to the Mail Server The Password is Encoded by Base64.
retConnect = send(server, "bGJleW9uZDRrb21h ",
strlen("bGJleW9uZDRrb21h "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send Password to Mail Failure. ");
goto WSACleanup;
}else{
printf("Password ");
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Receive Data From the Mail Server Failure. ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send "Mail From: " File to the Mail Server, sender's Mail Address
retConnect = send(server, "MAIL FROM: <[email protected]> ",
strlen("MAIL FROM: <[email protected]> "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send "Mail From: " to Mail Failure. ");
goto WSACleanup;
}else{
printf("MAIL FROM: <[email protected]> ");
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Receive Data From Mail Server Failure. ");
goto WSACleanup;
}else{
Buffer[retConnect] = ' ';
printf("%s ", Buffer);
}
//Send "RCPT TO: " File to the Mail Server, receiver 's Mail Address
retConnect = send(server, "RCPT TO: <[email protected]> ", strlen("RCPT
TO: <[email protected]> "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send "RCPT TO: " to Mail Failure. ");
goto WSACleanup;
}else{
printf("RCPT TO: <[email protected]> ");
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Receive Data From the Mail Server Failure. ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send "Data" Fiele to the Mail Server, start to Send mail
retConnect = send(server, "Data ", strlen("Data "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send "Data" Field to Mail Failure... ");
goto WSACleanup;
}else{
printf("Data ");
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Receive Data From Mail Server Failure... ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send Mail data to the the Mail Server
retConnect = send(server, MailData, strlen(MailData), 0);
if(retConnect == SOCKET_ERROR){
printf("Send Context Of Mail to Mail Failure... ");
goto WSACleanup;
}else{
printf("%s ", MailData);
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Receive Data From Mail Server Failure... ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send "QUIT" Context to the Mail Server
retConnect = send(server, "QUIT ", strlen("QUIT "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send "Quit" to Mail Failure... ");
goto WSACleanup;
}else{
printf("Quit ");
}
printf("Send Mail Successful! ");
WSACleanup:{
if(server != INVALID_SOCKET){
closesocket(server);
}
WSACleanup();
}
system("pause");
return 0;
}
* 文件名:SendMail.c
* 用途:基于SMTP协议的邮件发送程序
* 编程环境:WinXP SP2,Visual Studio 2005 Pro
* 参考资料:《HowTo.SMTP》,《SendMail》(NextFly写的),《MSDN 2005》
* 完成日期: 2006.8 Ver 0.01
* 作者: 88250
* 联系方式: E-mail: [email protected] QQ:845765
*/
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
const char *MailData = "From: "dl88250"<[email protected]> "
"Subject: It's a test
mail! . ";
int main(int argc, char *argv[])
{
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2, 2);
struct hostent *pHostent = NULL;
SOCKET server = INVALID_SOCKET;
struct sockaddr_in service;
int retConnect = 0;
char Buffer[1024] = {0};
if(WSAStartup(wVersionRequested, &wsaData) != 0){
printf("Error at WSAStartup() ");
goto WSACleanup;
}
server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //Create a Socket
if(server == INVALID_SOCKET){
printf("Error at socket(): %ld ", WSAGetLastError());
goto WSACleanup;
}
pHostent = gethostbyname("smtp.126.com"); //Get the Mail Server
Name
if(pHostent == NULL){
printf("The Host Name is Invalid... ");
goto WSACleanup;
}
service.sin_family = AF_INET;
memcpy(&service.sin_addr.s_addr, pHostent->h_addr_list[0],
pHostent->h_length);
service.sin_port = htons(25);
//Connect to the remote Mail Server
retConnect = connect(server, (struct sockaddr*)&service, sizeof(service));
if(retConnect == SOCKET_ERROR){
printf("Failed to connect. ");
goto WSACleanup;
}
printf("Connect to %s.... ", inet_ntoa(service.sin_addr));
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Failed to connect. ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send "HELO Server.... " to the Mail Server
retConnect = send(server, "HELO Server.... ", strlen("HELO
Server.... "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send HELO to the Mail Failure. ");
goto WSACleanup;
}else{
printf("HELO Server.... ");
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Failed to connect. ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send "AUTH LOGIN " to the Mail Server
retConnect = send(server, "AUTH LOGIN ", strlen("AUTH LOGIN "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send "AUTH LOGIN" to Mail Failure. ");
goto WSACleanup;
}else{
printf("AUTH LOGIN ");
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Receive Data From Mail Server Failure. ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send UserName to the Mail Server. The UserName is Encoded by Base64.
retConnect = send(server, "bGJleW9uZDRrb21h ",
strlen("bGJleW9uZDRrb21h "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send UserName to the Mail Failure. ");
goto WSACleanup;
}else{
printf("UserName ");
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Receive Data From the Mail Server Failure. ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send Password to the Mail Server The Password is Encoded by Base64.
retConnect = send(server, "bGJleW9uZDRrb21h ",
strlen("bGJleW9uZDRrb21h "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send Password to Mail Failure. ");
goto WSACleanup;
}else{
printf("Password ");
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Receive Data From the Mail Server Failure. ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send "Mail From: " File to the Mail Server, sender's Mail Address
retConnect = send(server, "MAIL FROM: <[email protected]> ",
strlen("MAIL FROM: <[email protected]> "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send "Mail From: " to Mail Failure. ");
goto WSACleanup;
}else{
printf("MAIL FROM: <[email protected]> ");
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Receive Data From Mail Server Failure. ");
goto WSACleanup;
}else{
Buffer[retConnect] = ' ';
printf("%s ", Buffer);
}
//Send "RCPT TO: " File to the Mail Server, receiver 's Mail Address
retConnect = send(server, "RCPT TO: <[email protected]> ", strlen("RCPT
TO: <[email protected]> "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send "RCPT TO: " to Mail Failure. ");
goto WSACleanup;
}else{
printf("RCPT TO: <[email protected]> ");
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Receive Data From the Mail Server Failure. ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send "Data" Fiele to the Mail Server, start to Send mail
retConnect = send(server, "Data ", strlen("Data "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send "Data" Field to Mail Failure... ");
goto WSACleanup;
}else{
printf("Data ");
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Receive Data From Mail Server Failure... ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send Mail data to the the Mail Server
retConnect = send(server, MailData, strlen(MailData), 0);
if(retConnect == SOCKET_ERROR){
printf("Send Context Of Mail to Mail Failure... ");
goto WSACleanup;
}else{
printf("%s ", MailData);
}
//Receive Data From the Mail Server
ZeroMemory(Buffer, sizeof(Buffer));
retConnect = recv(server, Buffer, sizeof(Buffer), 0);
if(retConnect == SOCKET_ERROR){
printf("Receive Data From Mail Server Failure... ");
goto WSACleanup;
}else{
printf("%s ", Buffer);
}
//Send "QUIT" Context to the Mail Server
retConnect = send(server, "QUIT ", strlen("QUIT "), 0);
if(retConnect == SOCKET_ERROR){
printf("Send "Quit" to Mail Failure... ");
goto WSACleanup;
}else{
printf("Quit ");
}
printf("Send Mail Successful! ");
WSACleanup:{
if(server != INVALID_SOCKET){
closesocket(server);
}
WSACleanup();
}
system("pause");
return 0;
}