純c郵件程序,
默認為163郵箱服務器,可修改,
默認需要手動輸入帳號及密碼,
修改變量為常量即可實現自動使用固定帳號登錄服務器,
修改接受郵箱帳號可以向指定郵箱發送郵件
嵌入其他c語言代碼中可實現c郵件函數
*/
#include <windows.h>
#include <winsock.h>
#include <assert.h>
#include <iostream>
#include <string>
#include <stdio.h>
#include <ctime>
#pragma comment(lib,"WS2_32.lib")
using namespace std;
//base64編碼
string Base64Encode(LPCTSTR lpszSrc);
//base64解碼
string Base64Decode(LPCTSTR lpszSrc);
int main()
{
//1.首先需要連接郵件服務器 這裏用socket 郵件服務器端口 25
WSADATA Wsa;
//進行WINSOCK的設置
WSAStartup(0x0101,&Wsa);
SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
SOCKADDR_IN sin;
LPHOSTENT lphost = gethostbyname("smtp.163.com");//這裏是用網易的郵件服務器 也可以修改
if(lphost)
sin.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
else
{
printf("%s\n","獲取地址失敗");
return 1;
}
sin.sin_family = AF_INET;
//註意郵件服務器的偵聽端口 25
sin.sin_port = htons(IPPORT_SMTP);
//連接服務器
if(connect(s,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)
{
printf("%s\n","連接錯誤");
return 1;
}
printf("%s\n","連接成功");
//接收服務器初次回應
char buff[1024];
memset(buff,0,sizeof(buff));
recv(s,buff,sizeof(buff),0);
printf("服務說:%s\n",buff);
/////上面已經完成連接了/////
string szLine="\r\n";//相當於妳按下回車
//2.現在就是和服務器對話了
//問候服務器
string szHelo = "HELO smtp.163.com" + szLine;
printf("我說:%s\n",szHelo.c_str());
send(s,szHelo.c_str(),szHelo.length(),0);
memset(buff,0,sizeof(buff));
recv(s,buff,sizeof(buff),0);
printf("服務說:%s\n",buff);
//請求驗證用戶密碼(需要編碼)
string szAL = "auth login" + szLine; //發送驗證命令
printf("我說:%s\n",szAL.c_str());
send(s,szAL.c_str(),szAL.length(),0);
memset(buff,0,sizeof(buff));
recv(s,buff,sizeof(buff),0);
// printf("服務說:%s\n",buff); //服務器會回答說 可以輸入帳號
//發送帳號
string szUser;
cout<<Base64Decode((LPCTSTR)(buff+4));
cin>>szUser;
szUser = Base64Encode(szUser.c_str()) + szLine; //對輸入的帳號進行base64編碼
send(s,szUser.c_str(),szUser.length(),0); //發送帳號
printf("我說:%s\n",szUser.c_str());
memset(buff,0,sizeof(buff));
recv(s,buff,sizeof(buff),0);
// printf("服務說:%s\n",buff); //服務器會回答說 可以輸入密碼
//發送密碼
string szPsw;
cout<<Base64Decode((LPCTSTR)(buff+4));
cin>>szPsw;
szPsw = Base64Encode(szPsw.c_str()) + szLine; //對輸入的密碼進行base64編碼
send(s,szPsw.c_str(),szPsw.length(),0); //發送密碼
printf("我說:%s\n",szPsw.c_str());
memset(buff,0,sizeof(buff));
recv(s,buff,sizeof(buff),0);
printf("服務說:%s\n",buff);
//然後可以用妳登陸的郵箱給其他郵箱發郵件了
string szFrom,szTo;
cout<<"from:";//妳自己的郵箱
cin>>szFrom;
cout<<"to:"; //發送給誰
cin>>szTo;
//發送者的地址
string From = "mail from:<"+szFrom+ ">"+ szLine;
//收信者地址
string To = "rcpt to:<" + szTo +">" + szLine;
//現在確定看誰發的郵件 往哪發
send(s,From.c_str(),From.length(),0);//from
printf("我說:%s\n",From.c_str());
memset(buff,0,sizeof(buff));
recv(s,buff,sizeof(buff),0);
printf("服務說:%s\n",buff);
getchar(); //只是用來暫停壹下而已 按任意字母繼續
send(s,To.c_str(),To.length(),0); //to
printf("我說:%s\n",To.c_str());
memset(buff,0,sizeof(buff));
recv(s,buff,sizeof(buff),0);
printf("服務說:%s\n",buff);
getchar();
//資料應該都看過了吧命令裏的data輸入後 表示輸入郵件內容了
send(s,"data\r\n",6,0); //DATA 命令發送
printf("我說:%s\n","data");
memset(buff,0,sizeof(buff));
recv(s,buff,sizeof(buff),0);
printf("服務說:%s\n",buff);
//郵件 下面的信息都是當作內容處理
//郵件頭
string szFrom_in = "from:"+szFrom + szLine;
string szTo_in = "to:"+szTo + szLine;
//發送日期
string szDate_in="Date: Sat, 20 Aug 2011 13:39:29 +0800" + szLine;//這裏我就直接寫上去日期了 為了方便
//郵件標題
string szSubject_in = "Subject:我是郵件標題" + szLine;
//郵件正文
string szBody_in = "我就是傳說中的郵件體" + szLine;
string szContent = szFrom_in + szTo_in + szDate_in + szSubject_in;
szContent += szLine;//添加壹個空白行
szContent += szBody_in;
//上面是最基本的格式//
send(s,szContent.c_str(),szContent.length(),0); //szContent
printf("我說:%s\n",szContent.c_str());
memset(buff,0,sizeof(buff));
// recv(s,buff,sizeof(buff),0);
// printf("服務說:%s\n",buff);
getchar();
//發送完了說明下結束
send(s,".\r\n",3,0); //說明內容結束了
printf("我說:%s\n",".");
memset(buff,0,sizeof(buff));
recv(s,buff,sizeof(buff),0);
printf("服務說:%s\n",buff);
getchar();
//退出服務器連接
send(s,"quit\r\n",6,0); //退出
printf("我說:%s\n","quit");
memset(buff,0,sizeof(buff));
recv(s,buff,sizeof(buff),0);
printf("服務說:%s 發送郵件成功\n",buff);
return 0;
}