2024年物联网嵌入式最全C C++开发,基于SMTP协议的C++邮件接口实现_c(1),2024年最新物联网嵌入式开发自学

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

include_directories(${PROJECT_SOURCE_DIR}/src)

指定生成目标

add_executable(EmialTest ${source_h} ${source_cpp})


### 四、源码附件


SendMail.h:



// SendMail.h
#ifndef SEND_MAIL_H
#define SEND_MAIL_H

#ifdef WIN32
#include <windows.h>
#include <WinSock.h>
#else
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#endif
#include <stdio.h>
#include

using namespace std;

// 协议中加密部分使用的是base64方法
char ConvertToBase64(char c6);
void EncodeBase64(char *dbuf, char *buf128, int len);
void SendMail(char emailTo, const char body,char emailFrom, char emailKey);
int OpenSocket(struct sockaddr *addr);

#endif


SendMail.cpp:



// SendMail.cpp

#include “SendMail.h”

#pragma comment(lib, “ws2_32.lib”)

#ifdef linux
#define Sleep sleep
#define closesocket close

#define strcpy_s(buffer, size, arg)
do{ strcpy(buffer, arg); } while (0)

#define sprintf_s(buffer, size, arg…)
do{ sprintf(buffer, ##arg); } while (0)
#endif // linux

struct Base64Date6
{
unsigned int d4 : 6;
unsigned int d3 : 6;
unsigned int d2 : 6;
unsigned int d1 : 6;
};

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, 256, 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 emailTo, const char body,char emailFrom, char emailKey)
{
int sockfd = { 0 };
char buf[1500] = { 0 };
char rbuf[1500] = { 0 };
char login[128] = { 0 };
char pass[128] = { 0 };

struct sockaddr_in their_addr = { 0 };
#ifdef WIN32
WSADATA WSAData;
WSAStartup(MAKEWORD(2, 2), &WSAData);
#endif // WIN32
memset(&their_addr, 0, sizeof(their_addr));

their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(25); // 一般是25端口不需要改
hostent* hptr = gethostbyname(“smtp.163.com”); // 端口和服务器
#ifdef WIN32
memcpy(&their_addr.sin_addr.S_un.S_addr, hptr->h_addr_list[0], hptr->h_length);
printf(“IP of smpt.163.com is : %d:%d:%d:%d\n”,
their_addr.sin_addr.S_un.S_un_b.s_b1,
their_addr.sin_addr.S_un.S_un_b.s_b2,
their_addr.sin_addr.S_un.S_un_b.s_b3,
their_addr.sin_addr.S_un.S_un_b.s_b4);
#else
memcpy(&their_addr.sin_addr.s_addr, hptr->h_addr_list[0], hptr->h_length);
printf(“IP of smpt.163.com is : %d:%d:%d:%d\n”,
their_addr.sin_addr.s_addr & 0XFF,
their_addr.sin_addr.s_addr>>8 & 0XFF,
their_addr.sin_addr.s_addr>>16 & 0XFF,
their_addr.sin_addr.s_addr>>24 & 0XFF);
#endif
// 连接邮件服务器,如果连接后没有响应,则2 秒后重新连接
sockfd = OpenSocket((struct sockaddr *)&their_addr);
memset(rbuf, 0, 1500);
while (recv(sockfd, rbuf, 1500, 0) == 0)
{
cout << “reconnect…” << endl;
Sleep(2);
sockfd = OpenSocket((struct sockaddr *)&their_addr);
memset(rbuf, 0, 1500);
}

cout << rbuf << endl;

// EHLO
memset(buf, 0, 1500);
sprintf_s(buf, 1500, “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, 1500, “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 发送自己账户的用户名的base64编码
memset(buf, 0, 1500);
sprintf_s(buf, 1500, “%s”,emailFrom);//你的邮箱账号
memset(login, 0, 128);
EncodeBase64(login, buf, strlen(buf));
sprintf_s(buf, 1500, “%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 发送自己的密码的base64编码
sprintf_s(buf, 1500, “%s”,emailKey);//你的邮箱密码
memset(pass, 0, 128);
EncodeBase64(pass, buf, strlen(buf));
sprintf_s(buf, 1500, “%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 开始发送邮件,先发送邮件说明:MAIL FROM
memset(buf, 0, 1500);
sprintf_s(buf, 1500, “MAIL FROM: <%s>\r\n”,emailFrom); //此处要和发邮件的邮箱保持一致
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout << "set Mail From Receive: " << rbuf << endl;

// RCPT TO 第一个收件人,发送目的邮箱说明:RCPT TO
sprintf_s(buf, 1500, “RCPT TO:<%s>\r\n”, emailTo);
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout << "Tell Sendto Receive: " << rbuf << endl;

// DATA 准备开始发送邮件内容
/*
发送数据格式:
From: **_test@163.com
To: **_a_test@163.com
Subject: 测试一下
MIME-Version: 1.0
*/
sprintf_s(buf, 1500, “DATA\r\n”);
send(sockfd, buf, strlen(buf), 0);

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

就是希望能够帮助到想自学提升的朋友。**
[外链图片转存中…(img-gnzd58LA-1715648617917)]
[外链图片转存中…(img-KkbUNmtz-1715648617918)]

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值