zoukankan      html  css  js  c++  java
  • SMTP实现发送邮箱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 = '';
    
        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 SendMail(char*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, sizeof(their_addr));
    
        their_addr.sin_family = AF_INET;
    
        their_addr.sin_port = htons(25);
    
        hostent*hptr = gethostbyname("smtp.163.com"); // 用的是163服务器
    
        memcpy(&their_addr.sin_addr.S_un.S_addr, hptr->h_addr_list[0], hptr->h_length);
    
        // 连接邮件服务器,如果连接后没有响应,则2 秒后重新连接
    
        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
    ";
    
        sprintf_s(buf, "EHLO HYL-PC
    ");
    
        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
    ");
    
        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, "noname_2000@163.com");
    
        memset(login, 0, 128);
    
        EncodeBase64(login, buf, strlen(buf));
    
        sprintf_s(buf, "%s
    ", 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");//你的邮箱密码
    
        memset(pass, 0, 128);
    
        EncodeBase64(pass, buf, strlen(buf));
    
        sprintf_s(buf, "%s
    ", 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: <noname_2000@163.com>
    ");
    
        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>
    ", 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
    ");
    
        send(sockfd, buf, strlen(buf), 0);
    
        memset(rbuf, 0, 1500);
    
        recv(sockfd, rbuf, 1500, 0);
    
        cout << "Send Mail Prepare Receive: " << rbuf << endl;
    
        // 发送邮件内容,
    .
    内容结束标记
    
        sprintf_s(buf, "%s
    .
    ", 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
    ");
    
        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[] = "XXX_XXX@163.com";//发给的邮箱
    
        char EmailContents[1000] = "From: "A"<XXX_XXX@163.com>
    " "To: "B"<XXX_XXX@163.com>
    " "Subject: Jason!
    
    " "come from China!";
    
     
    
        SendMail(EmailTo, EmailContents);
    
        getchar();
    
    }
    

      

  • 相关阅读:
    淘宝客服务费和佣金的区别是什么
    java编程出现的错误对应的解决方法
    若遇到APP无法抓包怎么办,可以通过安装drony 进行转发抓包
    Android逆向—苏宁金融app的data参数分析
    GMSSL 支持SM2/SM3/SM4
    Frida安装和使用
    JS 解析 bytearray 成字符串
    Pytorch-tensor的创建,索引,切片
    深度学习实战之线性回归1
    CCF CSP 201803-2 碰撞的小球
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/10963038.html
Copyright © 2011-2022 走看看