#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 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\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, "noname_2000@163.com");

    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");//你的邮箱密码

    memset(pass, 0, 128);

    EncodeBase64(pass, buf, strlen(buf));

    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: <noname_2000@163.com>\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[] = "XXX_XXX@163.com";//发给的邮箱

    char EmailContents[1000] = "From: \"A\"<XXX_XXX@163.com>\r\n" "To: \"B\"<XXX_XXX@163.com>\r\n" "Subject: Jason!\r\n\r\n" "come from China!";

    SendMail(EmailTo, EmailContents);

    getchar();

}

  

SMTP实现发送邮箱1的更多相关文章

  1. SMTP实现发送邮箱2(封装版)

    SMTP.h #ifndef __SMTP_H__ //避免重复包含 #define __SMTP_H__ #include <iostream> #include <list> ...

  2. java代码发送邮箱验证码与qq邮箱smtp服务

    发送邮箱的类封装,在此之前需要一个jar包  javax.mail.jar 下载链接https://github.com/javaee/javamail/releases/download/JAVAM ...

  3. PHP发送邮箱的方法smtp方法

    PHP发送邮箱的方法 采用的smtp方式首先进入163邮箱 设置  POP3/SMTP服务打勾 然后会提示你设置授权密码就是SMTP服务器的用户密码smtp.php文件代码<pre>< ...

  4. C#使用SMTP协议发送验证码到QQ邮箱

    C#使用SMTP协议发送验证码到QQ邮箱 在程序设计中,发送验证码是常见的一个功能,用户在注册账号时或忘记密码后,通常需要发送验证码到手机短信或邮箱来验证身份,此篇博客介绍在C#中如何使用SMTP协议 ...

  5. C# WinForm 使用SMTP协议发送QQ邮箱验证码

    文章来自:https://blog.csdn.net/IT_xiao_guang_guang/article/details/104336604 前言   在程序设计中,发送验证码是常见的一个功能,用 ...

  6. C#发送邮箱

    之前自己从来没有做过发送邮箱的功能,前段时间项目需要,在找了很多帖子之后,终于实现了. 之后有整理了一下,写了一个类.直接给类传递信息,就可以发送了. 这里还需要说明的是,发送邮箱需要开通POP3/S ...

  7. tornado web高级开发项目之抽屉官网的页面登陆验证、form验证、点赞、评论、文章分页处理、发送邮箱验证码、登陆验证码、注册、发布文章、上传图片

    本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tornado的后端和ajax的 ...

  8. java实现smtp邮件发送

    一.准备工作 首先你需要已一个发送邮箱,一般的邮箱都有SMTP.POP3服务,比如QQ邮箱,登陆QQ邮箱开启SMTP服务,开启是服务器会提示你设置独立密码,这个密码是跟邮箱正常登陆的密码不同的,这个是 ...

  9. python学习笔记(SMTP邮件发送:带附件)

    博主有段时间没有更新博客了 先整理一个之前整理过的SMTP邮件发送,这次是带附件的功能 #!/usr/bin/env python # -*- coding: utf_8 -*- from email ...

随机推荐

  1. 【原创】FltSendMessage蓝屏分析

    INVALID_PROCESS_DETACH_ATTEMPT (6)Arguments:Arg1: 00000000Arg2: 00000000Arg3: 00000000Arg4: 00000000 ...

  2. zookeeper源码 — 三、集群启动—leader、follower同步

    zookeeper集群启动的时候,首先读取配置,接着开始选举,选举完成以后,每个server根据选举的结果设置自己的角色,角色设置完成后leader需要和所有的follower同步.上面一篇介绍了le ...

  3. Qt数据库编程_基本

    QtSql模块提供了一个平台无关且数据库无关的访问SQL数据库的接口. Qt中的每个数据库连接用一个QSqlDatabase对象来表示:Qt使用不同driver来和各种不同数据库的API进行通讯. Q ...

  4. Flutter移动电商实战 --(32)列表页_小类高亮交互效果制作

    点击大类右侧的横向的小类红色显示当前的小类别 解决之前溢出的问题: 先解决一个bug,之前右侧的这里设置的高度是1000,但是有不同的虚拟机和手机设别的问题造成了溢出的问题 Expaned是有伸缩能力 ...

  5. javascript-类型、值和变量

    基本类型和引用类型 MDN-JavaScript 数据类型和数据结构 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是 简单的数据段,而引用类型值指那些 ...

  6. code review 20190705

    命名规范: 做了什么? 目的是什么? 在什么基础上进行? 注释说明 sql update,where 先行????? 警告: 清空所有警告:所有隐藏比较深入的bug,都是由警告带来的 + 忽略警告 枚 ...

  7. mysql软件升降级及配置参数

    1.下载mysql5.7的软件 https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.20-linux-glibc2.12-x86_64.tar.g ...

  8. shell变量默认值

    ${var:-string},${var:+string},${var:=string},${var:?string} 1. ${var:-string}和${var:=string}:若变量var为 ...

  9. js或者jquery直接下载网页上的图片代码

    1.jquery方式 使用jquery直接下载图片 function downloadImage(src) { var a = $("<a></a>").a ...

  10. Jmeter综合运用 之 接口测试

    Jmeter用的最多的就是做接口和性能测试了,着实比较好用,今天给大家分享下如何利用Jmeter做接口测试. 在做接口测试之前,我们起码需要了解: 1.接口涉及的业务 2.接口的基本信息:访问地址.传 ...