php邮件代码c语言,C语言实现邮件发送功能(SMTP)源码

【实例简介】C 语言编写的邮件发送器是SMTP协议的源代码和EXE执行程序均在里面使用VS2013开发环境生成,填写对应参数即可成功进行邮件发送,不用配置邮件服务器,只需一个支持SMTP协议的邮箱账号密码即可

【实例截图】

cc238e83a9e44b667ee39d9b0c2ee1de.png

【核心代码】

#include

#include

#include

#pragma comment(lib, "ws2_32.lib")

/**

*连接服务器

*/

SOCKET connect_server(char *host, int port);

void disconnect(SOCKET c);

void send_msg(SOCKET c, char *msg);

void recv_msg(SOCKET c);

char* base64_encode(const char* data, int data_len);

const char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 /=";

SOCKET connect_server(char *host, int port)

{

WSADATA wd;

int ret = 0;

SOCKET c;

SOCKADDR_IN saddr;

struct hostent *pHostent;

ret = WSAStartup(MAKEWORD(2, 2), &wd);

if (ret != 0)

{

return 0;

}

if (HIBYTE(wd.wVersion) != 2 || LOBYTE(wd.wVersion) != 2)

{

printf("Failed to initialize");

WSACleanup();

return 1;

}

c = socket(AF_INET, SOCK_STREAM, 0);

pHostent = gethostbyname(host);

// printf("%s", inet_ntoa(*((struct in_addr*)pHostent->h_addr_list[0])));

saddr.sin_addr.S_un.S_addr = *((unsigned long*)pHostent->h_addr_list[0]);

saddr.sin_family = AF_INET;

saddr.sin_port = htons(port);

connect(c, (SOCKADDR*)&saddr, sizeof(SOCKADDR));

return c;

}

void disconnect(SOCKET c)

{

closesocket(c);

WSACleanup();

}

void recv_msg(SOCKET c)

{

char text[BUFSIZ];

strnset(text, '\0', BUFSIZ);

recv(c, text, BUFSIZ, 0);

printf("\nrecv:%s\n", text);

}

void send_msg(SOCKET c, char *msg)

{

printf("\nsend:%s\n", msg);

send(c, msg, strlen(msg), 0);

}

char *base64_encode(const char* data, int data_len)

{

//int data_len = strlen(data);

int prepare = 0;

int ret_len;

int temp = 0;

char *ret = NULL;

char *f = NULL;

int tmp = 0;

char changed[4];

int i = 0;

ret_len = data_len / 3;

temp = data_len % 3;

if (temp > 0)

{

ret_len = 1;

}

ret_len = ret_len * 4 1;

ret = (char *)malloc(ret_len);

if (ret == NULL)

{

printf("No enough memory.\n");

exit(0);

}

memset(ret, 0, ret_len);

f = ret;

while (tmp < data_len)

{

temp = 0;

prepare = 0;

memset(changed, '\0', 4);

while (temp < 3)

{

//printf("tmp = %d\n", tmp);

if (tmp >= data_len)

{

break;

}

prepare = ((prepare << 8) | (data[tmp] & 0xFF));

tmp ;

temp ;

}

prepare = (prepare << ((3 - temp) * 8));

//printf("before for : temp = %d, prepare = %d\n", temp, prepare);

for (i = 0; i < 4; i )

{

if (temp < i)

{

changed[i] = 0x40;

}

else

{

changed[i] = (prepare >> ((3 - i) * 6)) & 0x3F;

}

*f = base[changed[i]];

//printf("%.2X", changed[i]);

f ;

}

}

*f = '\0';

return ret;

}

int main(void)

{

char sendbuf[BUFSIZ], recvbuf[BUFSIZ], recv_email[BUFSIZ], subject[BUFSIZ], content[BUFSIZ], email[200], pass[200];

char *pstr = NULL;

char *host = "smtp.163.com";

int port = 25;

SOCKET c;

c = connect_server(host, port);

//接受服务器发来的数据

recv_msg(c);

//跟服务器打招呼

send_msg(c, "helo qq\r\n");

//接受服务器发来的数据

recv_msg(c);

//告诉服务器要登陆

send_msg(c, "auth login\r\n");

//接受服务器发来的数据

recv_msg(c);

//提示用户输入邮箱地址

printf("=====login email====\nemail ID:");

scanf("%s", email);

printf("password:");

scanf("%s", pass);

/*************发送邮箱地址和密码**************/

//加密邮箱地址

pstr = base64_encode(email, strlen(email));

//拼接邮箱地址, 用strcpy是为了省去清空sendbuf

strcpy(sendbuf, pstr);

//加回车换行

strcat(sendbuf, "\r\n\0");

send_msg(c, sendbuf);

//接收返回内容并显示

recv_msg(c);

//释放内存,在base64加密函数里面分配的

free(pstr);

//加密邮箱密码

pstr = base64_encode(pass, strlen(pass));

strcpy(sendbuf, pstr);

strcat(sendbuf, "\r\n\0");

send_msg(c, sendbuf);

recv_msg(c);

free(pstr);

/**************填写收件人,发件人信息***********************/

//告诉服务器发件人是谁

strcpy(sendbuf, "mail from:

strcat(sendbuf, email);

strcat(sendbuf, ">");

strcat(sendbuf, "\r\n\0");

send_msg(c, sendbuf);

recv_msg(c);

//告诉服务器收件人是谁

printf("Please enter the recipient mailbox:");

scanf("%s", recv_email);

strcpy(sendbuf, "rcpt to:

strcat(sendbuf, recv_email);

strcat(sendbuf, ">");

strcat(sendbuf, "\r\n\0");

send_msg(c, sendbuf);

recv_msg(c);

/******************发送邮件内容*********************************/

send_msg(c, "data\r\n");

recv_msg(c);

printf("please enter the title:");

scanf("%s", subject);

printf("please enter the content:");

scanf("%s", content);

//这里填写发件人,可以随便填写,可用于伪造邮件

strcpy(sendbuf, "From: ");

strcat(sendbuf, email);

strcat(sendbuf, "\n");

strcat(sendbuf, "To: ");

strcat(sendbuf, recv_email);

strcat(sendbuf, "\n");

//发送标题和内容

strcat(sendbuf, "subject:");

strcat(sendbuf, subject);

strcat(sendbuf, "\r\n\r\n");

strcat(sendbuf, content);

strcat(sendbuf, "\r\n.\r\n\0");

send_msg(c, sendbuf);

recv_msg(c);

disconnect(c);

printf("mail is already send to:%s\n", recv_email);

return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【线性筛】【质因数分解】【约数个数定理】hdu6069 Counting Divisors

d(x)表示x的约数个数&#xff0c;让你求&#xff08;l,r<10^12,r-l<10^6,k<10^7&#xff09; #include<cstdio> using namespace std; #define MOD 998244353ll #define MAXP 1000100 typedef long long ll; ll x,y; int T,K; bool isNotPrime[MAXP10]; int num…

python本地库_Python学习第71课-本地建立repository仓库

【每天几分钟&#xff0c;从零入门python编程的世界&#xff01;】我们在本地建立一个repository(仓库)&#xff0c;这个repository(仓库)就是用来对我们的文件版本进行跟踪的。repository(仓库)就是通过git命令中的init命令创建的&#xff0c;想要在shell中让git命令生效&…

C#/.Net 不要再使用Aspose和iTextSharp啦!QuestPDF操作生成PDF更快更高效!

QuestPDFQuestPDF是一个开源的工具库&#xff0c;可以在.NET或者.Net Core中生成pdf文档它提供了一个布局引擎&#xff0c;设计时考虑到了完整的分页支持以及灵活性要求&#xff01;比市面上常见的Aspose和iTextSharp好用太多了&#xff01;GitHub地址安装Install-Package Ques…

C#创建桌面快捷方式

1、添加引用Windows Script Host Object Model,并引用命名空间using IWshRuntimeLibrary; 2、代码 using System; using IWshRuntimeLibrary; using System.Windows.Forms;namespace WindowsFormsApplication1 {public partial class Form1 : Form{public Form1(){InitializeC…

linux shell之IFS分割字符串

1 问题 我们有段字符串data"chenyu:chenzixuan:chenzi",我们需要通过&#xff1a;分割&#xff0c;我们可以采用IFS 我们可以采用下面的模板 oldIFS$IFSIFS":"for item in $data; do******* doneIFS$oldIFS2 代码实现 #/bin/bashdata"chenyu, che…

Java报表工具FineReport导出EXCEL的四种API

在实际的应用中会经常需要将数据导出成excel&#xff0c;导出的方式除原样导出还有分页导出、分页分sheet导出和大数据量导出。对于excel 2003版&#xff0c;由于限制了每个sheet的最大行数和列数&#xff0c;大数据量导出时会默认时分多个sheet&#xff0c;而excel2007不会出现…

sql in 用法(mysql)

我们先看一个如下数据库表&#xff1a; 我们如果想查询这张表里面age为11和1的人该怎么办呢&#xff1f; 那么我们的 in 操作符就起作用了&#xff1a; SELECT * FROM table1 WHERE age1 IN(11,1); 查询来自表哥table1的数据&#xff0c;条件为age1 在(11,1)这两个数之中…

matlab的循环语句裁图,[MATLAB图像处理] 多幅图片处理的循环语句

多幅图片处理的循环语句 小弟毕业设计关于视频去雾处理&#xff0c;将视频截取为图片后对每张图片进行处理&#xff0c;其中需要用到循环语句来减少工作量&#xff0c;但自己对循环语句不怎么会&#xff0c;希望哪位大大能够给予帮助&#xff0c;谢谢了程序如下block_size 15;…

开源社·读书播客第一期:《大教堂与集市》

点击蓝字&#xff0c;关注我们&#xff5c;作者&#xff1a;许银&#xff5c;编辑&#xff1a;Corrie&#xff5c;设计&#xff1a;朱亿钦Hi&#xff0c;各位开源爱好者&#xff0c;在世界读书日这个特殊的日子里&#xff0c;我们开源社踩着潮流来了&#xff0c;近一年来&#…

LeetCode:Count Primes

Problem: Description: Count the number of prime numbers less than a non-negative number, n. Credits:Special thanks to mithmatt for adding this problem and creating all test cases. Solution:采用的为埃拉托斯特尼筛法 算法描述&#xff1a;&#xff08;来自百度…

华为交换机查看端口流量_华为交换机限速及流量统计配置

配置交换机限速时&#xff0c;cir和cbs的关系是什么配置交换机限速时&#xff0c;cir和cbs的关系如下&#xff1a;cbs要大于报文的最大长度。在连续流量的情况下对于cbs没有特殊的要求&#xff0c;保证平均速率是cir的速率。在突发流量需要保证的情况下&#xff0c;如果cbs换算…

利用Matlab拟合时序植被生长季曲线,并求解物候参数

研究表明,一元六次曲线比一元二次曲线更好地模拟植被生长季的整个生长周期,表征植被的生长特性。matlab软件功能强大,在遥感模型研究方面有很大的优势特点,对数学模型模拟轻而易举,也可直接对栅格数据进行运算。因此本文采用matlab软件,采用一元6次曲线来拟合植被生长季曲…

sql between...and 用法(mysql)

首先我们看如下数据库表&#xff1a; 如果我们想查询如上表中的age1的值在0到5的数据该如何查询&#xff1f; 那么在这里我们用到我们的sql操作符between…adn。 SELECT * FROM table1 WHERE age1 BETWEEN 0 AND 5 其中between后面的0 and 5 意思就是 查询寻数据&#xf…

轻松搞定各版本IE兼容问题,IE6,IE7,IE8,IE9,IE10,IE11

轻松搞定各版本IE兼容问题,IE6,IE7,IE8,IE9,IE10,IE11 在网站开发中不免因为各种兼容问题苦恼&#xff0c;针对兼容问题&#xff0c;其实IE给出了解决方案,Google也给出了解决方案,百度也应用了这种方案去解决IE的兼容问题。解决这种兼容问题只需要一行代码就可以了&#xff0c…

linux shell之通过标识测试文件系统属性

1 通过标识测试文件系统属性 [ -f $file_var ] :如果给定的变量包含正常的文件路径或文件名,则返回真。 [ -x $var ] :如果给定的变量包含的文件可执行,则返回真。 [ -d $var ] :如果给定的变量包含的是目录,则返回真。 [ -e $var ] :如果给定的变量包含的文件存在,则返回真。…

python中变量类型在程序中可以改变_详细解析Python当中的数据类型和变量

数据类型计算机顾名思义就是可以做数学计算的机器&#xff0c;因此&#xff0c;计算机程序理所当然地可以处理各种数值。但是&#xff0c;计算机能处理的远不止数值&#xff0c;还可以处理文本、图形、音频、视频、网页等各种各样的数据&#xff0c;不同的数据&#xff0c;需要…

php输出二维数组中指定内容,HP将MYSQL内容读到二维数组并按指定列输出

&#xff1c;?$host "localhost"; //主机名$user "root"; //mysql用户名$password ""; //mysql密码$database "doc"; //mysql数据库名$tables "mclass"; //表名$connmysql_connect("$host",&…

利用Excel VBA批量计算长时间序列植被物候动态阈值(逐像元)

本文演示利用Excel VBA编程实现多期栅格数据,逐像元计算物候参数:生长季始期(SOS)、生长季末期(EOS)和生长季长度(LOS),计算过程速度快! 说明: (1)利用Raster to Point工具将栅格数据转换为点图层,结果为38998个点,由于每年有24个数据(半月合成),所以得到的…

linux shell之字符串的比较

1 字符串常用的比较 字符串相等 [[ $str1 $str2 ]] 字符串不相等 [[ $str1 ! $str2 ]] 字符串大小比较 [[ $str1 > $str2 ]] 字符串等于空 [[ -z $str2 ]] 字符串不等于空 [[ -n $str2 ]] 用test代替[] if test $str1 $str2 2 测试代码 #/bin/bashstr1&quo…