#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. linux C file format analysis

    c语言文件格式 source file file.c C source, ASCII text pretreatment 预处理文件 file.i C source, ASCII text assem ...

  2. Intellij IDEA导入JAVA项目并启动(哈哈哈,天天都有人问)

    最近有很多同学,竟然不知道如何使用Intellij IDEA打开Java项目并启动 现在来讲一下,希望不要忘记了 1.打开IDEA开机页面 Maven项目 2.Maven项目是以pom文件引入各项ja ...

  3. Jmeter-app接口

    1.IOS登录接口涉及的三个接口: 2.三个接口传入的参,第三个是判断用户是否登录成功的 http://118.178.247.67:8449/service/userLogin/phoneQuick ...

  4. kotlin函数的参数和返回值

    fun main(arg: Array<String>) { val asList = asList(, , , , , ) println(asList) } fun <T> ...

  5. Connection

    作用: * 获取执行sql语句对象 ** createStatement(): 获取Statement对象 ** prepareStatement(String sql): 获取预处理对象 ** pr ...

  6. 启动elasticsearch的时候报出Exception in thread "main" SettingsException[Failed to load settings from /usr/local/elasticsearch/config/elasticsearch.yml]; nested: MarkedYAMLException[while scanning a simple ke

    故障现象: [elasticsearch@tiantianml- ~]$ /usr/local/elasticsearch/bin/elasticsearch Exception in thread ...

  7. c++ for each

    #include <iostream>#include <vector>#include <list> using namespace std; int main( ...

  8. Linux Mint设置自定义快捷键

    我使用的是 Linux Mint 19.2 Tina 先搜索键盘,把键盘的功能调出来 快捷键--->>自定义快捷键--->>添加自定义快捷键 名称可自定义(这里我定义的是“截图 ...

  9. php开启短标签与<?xml version="1.0" encoding="UTF-8"?>冲突

    前两天写了个生成mapsite的源码,想提交到百度和谷歌,在本地测试一点问题都没有,但是在服务器上就显示500错误 最后废了九牛二虎之力,终于可以设置iis直接显示出错信息. 也搞懂了问题所在,默认服 ...

  10. 用Keras搭建神经网络 简单模版(六)——Autoencoder 自编码

    import numpy as np np.random.seed(1337) from keras.datasets import mnist from keras.models import Mo ...