#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. spaCy 第二篇:语言模型

    spaCy处理文本的过程是模块化的,当调用nlp处理文本时,spaCy首先将文本标记化以生成Doc对象,然后,依次在几个不同的组件中处理Doc,这也称为处理管道.语言模型默认的处理管道依次是:tagg ...

  2. docker安装mysql挂载外部配置和数据目录

    从docker hub上可以找到mysql外挂配置和数据目录的一些文档说明 https://hub.docker.com/_/mysql 从该文档中可以了解到,mysql的默认配置为/etc/mysq ...

  3. $this->request->post 和input 区别

    $this->request->post 和input 区别 Request是对象,而input是内置函数     文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论

  4. concurrency parallel 并发 并行 parallelism

    在传统的多道程序环境下,要使作业运行,必须为它创建一个或几个进程,并为之分配必要的资源.当进程运行结束时,立即撤销该进程,以便能及时回收该进程所占用的各类资源.进程控制的主要功能是为作业创建进程,撤销 ...

  5. Swift 自动引用计数(ARC)

    Swift 使用自动引用计数(ARC)这一机制来跟踪和管理应用程序的内存 通常情况下我们不需要去手动释放内存,因为 ARC 会在类的实例不再被使用时,自动释放其占用的内存. 但在有些时候我们还是需要在 ...

  6. SpringBoot 部署到Linux开机自启动和运行

    前文 SpringBoot是一个强大的微服务框架,通常都是打包项目成Jar包,并部署到服务器上,本文以Linux服务器部署为主 开机自启动 博文:<https://www.cnblogs.com ...

  7. JAVA 基础编程练习题41 【程序 41 猴子分桃】

    41 [程序 41 猴子分桃] 题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把 多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了 ...

  8. 开发CLI命令行

    命令行工具:CLI 是在命令行终端使用的工具,如git, npm, vim 都是CLI工具.比如我们可以通过 git clone 等命令简单把远程代码复制到本地 和 cli 相对的是图形用户界面(gu ...

  9. [C++]单源最短路径:迪杰斯特拉(Dijkstra)算法(贪心算法)

    1 Dijkstra算法 1.1 算法基本信息 解决问题/提出背景 单源最短路径(在带权有向图中,求从某顶点到其余各顶点的最短路径) 算法思想 贪心算法 按路径长度递增的次序,依次产生最短路径的算法 ...

  10. Vue 2.x指令综合小练习

    实现效果如下: 代码实现如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset ...