#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. Python 自学笔记(四)

    1.for...in...循环语句 1-1.遍历列表 1-2.遍历字典 1-2-1.遍历字典的键和值 1-2-2.遍历字典的键值(一) 1-2-3.遍历字典的键值(二) 1-2-4.遍历字典的值 1- ...

  2. mysql密码设置为空怎么办?

    由于很多童鞋安装使用MySQL时,安装时没有设置密码,或者像我一样图省事设置密码为空,想为其设置新密码: 1.点击  开始------>运行----在弹出的对话框中输入cmd 如下图: 2.使用 ...

  3. Servlet的入门案例

    编写入门案例 1)编写java类,继承HttpServlet类 2)重新doGet和doPost方法 3)Servlet程序交给tomcat服务器运行!! 3.1 servlet程序的class码拷贝 ...

  4. 04Flutter仿京东商城项目 首页商品列表布局

    Home.dart import 'package:flutter/material.dart'; import 'package:flutter_swiper/flutter_swiper.dart ...

  5. leetcode刷题-559. Maximum Depth of N-ary Tree

    题目: https://leetcode.com/problems/maximum-depth-of-n-ary-tree/description/ n-ary-tree的数据结果表示 // Defi ...

  6. PAT 甲级 1021 Deepest Root (25 分)(bfs求树高,又可能存在part数part>2的情况)

    1021 Deepest Root (25 分)   A graph which is connected and acyclic can be considered a tree. The heig ...

  7. LODOP直接导出图片不弹框

    之前有博文测试了导出图片的图片长度关系,是直接弹窗的选择保存路径的方式:Lodop导出图片,导出单页内容的图片最近测试下不弹窗保存图片是否可以,样例是保存的excel,测试了下图片,图片也是可以的,该 ...

  8. Hadoop 部署之 Hive (五)

    目录 一.Hive 简介 1.什么是 Hive 2.为什么使用 Hive 3.Hive 的特点 4.Hive 的架构 二.Hive 安装 1.MySQL 安装(datanode01) 2.MySQL ...

  9. 【ABAP系列】SAP ABAP 高级业务应用程序编程(ABAP)

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 高级业务应用程 ...

  10. KVM虚拟化介绍(1)

    一.虚拟化分类    1.虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独 立的空间内运 ...