Send mail SMTP achieve 1

#include "stdafx.h"

 

#include <iostream>

#include <WinSock2.h>

using namespace std;

#pragma comment(lib,"ws2_32.lib")

#define _WINSOCK_DEPRECATED_NO_WARNINGS

 

struct Base64Date6

{

    unsigned int d4 : 6;

    unsigned int d3 : 6;

    unsigned int d2 : 6;

    unsigned int d1 : 6;

};

// 协议中加密部分使用的是base64方法

char ConvertToBase64(char c6);

void EncodeBase64(char*dbuf, char*buf128, int len);

void SendMail(char*email, char*body);

int OpenSocket(struct sockaddr *addr);

 

char ConvertToBase64(char uc)

{

    if (uc < 26)

    {

        return'A' + uc;

    }

    if (uc < 52)

    {

        return'a' + (uc - 26);

    }

    if (uc < 62)

    {

        return'0' + (uc - 52);

    }

    if (uc == 62)

    {

        return'+';

    }

    return'/';

}

// base64的实现

void  EncodeBase64(char*dbuf, char*buf128, int len)

{

    struct  Base64Date6*ddd = NULL;

    int i = 0;

    char buf[256] = { 0 };

    char *tmp = NULL;

    char cc = '\0';

    memset(buf, 0, 256);

    strcpy_s(buf, buf128);

    for (i = 1; i <= len / 3; i++)

    {

        tmp = buf + (i - 1) * 3;

        cc = tmp[2];

        tmp[2] = tmp[0];

        tmp[0] = cc;

        ddd = (struct Base64Date6*)tmp;

        dbuf[(i - 1) * 4 + 0] = ConvertToBase64((unsigned int)ddd->d1);

        dbuf[(i - 1) * 4 + 1] = ConvertToBase64((unsigned int)ddd->d2);

        dbuf[(i - 1) * 4 + 2] = ConvertToBase64((unsigned int)ddd->d3);

        dbuf[(i - 1) * 4 + 3] = ConvertToBase64((unsigned int)ddd->d4);

    }

    if (len % 3 == 1)

    {

        tmp = buf + (i - 1) * 3;

        cc = tmp[2];

        tmp[2] = tmp[0];

        tmp[0] = cc;

        ddd = (struct Base64Date6*)tmp;

        dbuf[(i - 1) * 4 + 0] = ConvertToBase64((unsigned int)ddd->d1);

        dbuf[(i - 1) * 4 + 1] = ConvertToBase64((unsigned int)ddd->d2);

        dbuf[(i - 1) * 4 + 2] = '=';

        dbuf[(i - 1) * 4 + 3] = '=';

    }

    if (len % 3 == 2)

    {

        tmp = buf + (i - 1) * 3;

        cc = tmp[2];

        tmp[2] = tmp[0];

        tmp[0] = cc;

        ddd = (struct Base64Date6*)tmp;

        dbuf[(i - 1) * 4 + 0] = ConvertToBase64((unsigned int)ddd->d1);

        dbuf[(i - 1) * 4 + 1] = ConvertToBase64((unsigned int)ddd->d2);

        dbuf[(i - 1) * 4 + 2] = ConvertToBase64((unsigned int)ddd->d3);

        dbuf[(i - 1) * 4 + 3] = '=';

    } 

    Return; 

} 

void the SendMail (char * In Email, char * body) 

{ 

    int sockfd = {0}; 

    char buf [1500] = {0}; 

    char rbuf [1500] = {0}; 

    char Login [128] = { } 0; 

    char Pass [128] = {0}; 

    WSADATA WSADATA; 

    SOCKADDR_IN their_addr ;; 

    WSAStartup (MAKEWORD (2, 2), & WSADATA); 

    Memset (& their_addr, 0, the sizeof (their_addr)); 

    their_addr.sin_family = AF_INET; 

    = the htons their_addr.sin_port (25); 

    the hostent * = hptr the gethostbyname ( "smtp.163.com"); // with the server 163 

    memcpy (& hptr- h_addr_list their_addr.sin_addr.S_un.S_addr,> [0], hptr -> h_length); 

    // connect to the mail server, if the connection does not respond, then after 2 seconds reconnect

    sockfd = OpenSocket((struct sockaddr *)&their_addr);

    memset(rbuf, 0, 1500);

    while (recv(sockfd, rbuf, 1500, 0) == 0)

    {

        sockfd = OpenSocket((struct sockaddr *)&their_addr);

        memset(rbuf, 0, 1500);

    }

    // EHLO

    memset(buf, 0, 1500);

    //buf[]="EHLO HYL-PC\r\n";

    sprintf_s(buf, "EHLO HYL-PC\r\n");

    send(sockfd, buf, strlen(buf), 0);

    memset(rbuf, 0, 1500);

    recv(sockfd, rbuf, 1500, 0);

    cout << "EHLO REceive: " << rbuf << endl;

    // AUTH LOGIN

    memset(buf, 0, 1500);

    sprintf_s(buf, "AUTH LOGIN\r\n");

    send(sockfd, buf, strlen(buf), 0);

    memset(rbuf, 0, 1500);

    recv(sockfd, rbuf, 1500, 0);

    cout << "Auth Login Receive: " << rbuf << endl;

    // USER

    memset(buf, 0, 1500);

    sprintf_s(buf, "[email protected]");

    memset(login, 0, 128);

    EncodeBase64(login, buf, strlen(buf));

    sprintf_s(buf, "%s\r\n", login);

    send(sockfd, buf, strlen(buf), 0);

    cout << "Base64 UserName: " << buf << endl;

    memset(rbuf, 0, 1500);

    recv(sockfd, rbuf, 1500, 0);

    cout << "User Login Receive: " << rbuf << endl;

    // PASSWORD

    sprintf_s(buf, "swfrezee");// your mailbox password 
    EncodeBase64 (Pass, buf, strlen (buf));

    memset (Pass, 0, 128);


    sprintf_s(buf, "%s\r\n", pass);

    send(sockfd, buf, strlen(buf), 0);

    cout << "Base64 Password: " << buf << endl;

    memset(rbuf, 0, 1500);

    recv(sockfd, rbuf, 1500, 0);

    cout << "Send Password Receive: " << rbuf << endl;

    // MAIL FROM

    memset(buf, 0, 1500);

    sprintf_s(buf, "MAIL FROM: <[email protected]>\r\n");

    send(sockfd, buf, strlen(buf), 0);

    memset(rbuf, 0, 1500);

    recv(sockfd, rbuf, 1500, 0);

    cout << "set Mail From Receive: " << rbuf << endl;

    // RCPT TO 第一个收件人

    sprintf_s(buf, "RCPT TO:<%s>\r\n", email);

    send(sockfd, buf, strlen(buf), 0);

    memset(rbuf, 0, 1500);

    recv(sockfd, rbuf, 1500, 0);

    cout << "Tell Sendto Receive: " << rbuf << endl;

    // DATA 准备开始发送邮件内容

    sprintf_s(buf, "DATA\r\n");

    send(sockfd, buf, strlen(buf), 0);

    memset(rbuf, 0, 1500);

    recv(sockfd, rbuf, 1500, 0);

    cout << "Send Mail Prepare Receive: " << rbuf << endl;

    // 发送邮件内容,\r\n.\r\n内容结束标记

    sprintf_s(buf, "%s\r\n.\r\n", body);

    send(sockfd, buf, strlen(buf), 0);

    memset(rbuf, 0, 1500);

    recv(sockfd, rbuf, 1500, 0);

    cout << "Send Mail Receive: " << rbuf << endl;

    // QUIT

    sprintf_s(buf, "QUIT\r\n");

    send(sockfd, buf, strlen(buf), 0);

    memset(rbuf, 0, 1500);

    recv(sockfd, rbuf, 1500, 0);

    cout << "Quit Receive: " << rbuf << endl;

    //清理工作

    closesocket(sockfd);

    WSACleanup();

    return;

}

// 打开TCP Socket连接

int OpenSocket(struct sockaddr *addr)

{

    int sockfd = 0;

    sockfd = socket(PF_INET, SOCK_STREAM, 0);

    if (sockfd < 0)

    {

        cout << "Open sockfd(TCP) error!" << endl;

        exit(-1);

    }

    if (connect(sockfd, addr, sizeof(struct sockaddr)) < 0)

    {

        cout << "Connect sockfd(TCP) error!" << endl;

        exit(-1);

    }

    return sockfd;

}

int main(int argc, char **argv)

{

    char EmailTo[] = "[email protected]";//发给的邮箱

    char EmailContents[1000] = "From: \"A\"<[email protected]>\r\n" "To: \"B\"<[email protected]>\r\n" "Subject: Jason!\r\n\r\n" "come from China!";

 

    SendMail(EmailTo, EmailContents);

    getchar();

}

  

Guess you like

Origin www.cnblogs.com/gd-luojialin/p/10963038.html