C语言利用SMTP协议发送邮件
#ifdef WIN32
#include <windows.h>
#include <stdio.h>
#else #include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>
#endif
struct data6
{
unsigned int d4:;
unsigned int d3:;
unsigned int d2:;
unsigned int d1:;
};
// 协议中加密部分使用的是base64方法
char con628(char c6);
void base64(char *dbuf,char *buf128,int len);
void sendemail(char *email,char *body);
int open_socket(struct sockaddr *addr); int main()
{
char email[] = "987654321@qq.com";
char body[] = "From: \"lucy\"<123456789@qq.com>\r\n"
"To: \"dasiy\"<987654321@qq.com>\r\n"
"Subject: Hello\r\n\r\n"
"Hello World, Hello Email!";
sendemail(email, body);
return ;
} char con628(char c6)
{
char rtn = '\0';
if (c6 < ) rtn = c6 + ;
else if (c6 < ) rtn = c6 + ;
else if (c6 < ) rtn = c6 - ;
else if (c6 == ) rtn = ;
else rtn = ;
return rtn;
} // base64的实现
void base64(char *dbuf, char *buf128, int len)
{
struct data6 *ddd = NULL;
int i = ;
char buf[] = {};
char *tmp = NULL;
char cc = '\0';
memset(buf, , );
strcpy(buf, buf128);
for(i = ; i <= len/; i++)
{
tmp = buf+(i-)*;
cc = tmp[];
tmp[] = tmp[];
tmp[] = cc;
ddd = (struct data6 *)tmp;
dbuf[(i-)*+] = con628((unsigned int)ddd->d1);
dbuf[(i-)*+] = con628((unsigned int)ddd->d2);
dbuf[(i-)*+] = con628((unsigned int)ddd->d3);
dbuf[(i-)*+] = con628((unsigned int)ddd->d4);
}
if(len% == )
{
tmp = buf+(i-)*;
cc = tmp[];
tmp[] = tmp[];
tmp[] = cc;
ddd = (struct data6 *)tmp;
dbuf[(i-)*+] = con628((unsigned int)ddd->d1);
dbuf[(i-)*+] = con628((unsigned int)ddd->d2);
dbuf[(i-)*+] = '=';
dbuf[(i-)*+] = '=';
}
if(len% == )
{
tmp = buf+(i-)*;
cc = tmp[];
tmp[] = tmp[];
tmp[] = cc;
ddd = (struct data6 *)tmp;
dbuf[(i-)*+] = con628((unsigned int)ddd->d1);
dbuf[(i-)*+] = con628((unsigned int)ddd->d2);
dbuf[(i-)*+] = con628((unsigned int)ddd->d3);
dbuf[(i-)*+] = '=';
}
return;
}
// 发送邮件
void sendemail(char *email, char *body)
{
int sockfd = ;
struct sockaddr_in their_addr = {};
char buf[] = {};
char rbuf[] = {};
char login[] = {};
char pass[] = {};
#ifdef WIN32
WSADATA WSAData;
WSAStartup(MAKEWORD(, ), &WSAData);
#endif
memset(&their_addr, , sizeof(their_addr));
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons();
their_addr.sin_addr.s_addr = inet_addr("112.90.141.71");//qq smtp 服务器
// 连接邮件服务器,如果连接后没有响应,则2 秒后重新连接
sockfd = open_socket((struct sockaddr *)&their_addr);
memset(rbuf,,);
while(recv(sockfd, rbuf, , ) == )
{
printf("reconnect...\n");
Sleep();
//close(sockfd);
sockfd = open_socket((struct sockaddr *)&their_addr); memset(rbuf,,);
} printf("%s\n", rbuf); // EHLO
memset(buf, , );
sprintf(buf, "EHLO abcdefg-PC\r\n");
send(sockfd, buf, strlen(buf), );
memset(rbuf, , );
recv(sockfd, rbuf, , );
printf("%s\n", rbuf); // AUTH LOGIN
memset(buf, , );
sprintf(buf, "AUTH LOGIN\r\n");
send(sockfd, buf, strlen(buf), );
printf("%s\n", buf);
memset(rbuf, , );
recv(sockfd, rbuf, , );
printf("%s\n", rbuf); // USER
memset(buf, , );
sprintf(buf,"");//你的qq号
memset(login, , );
base64(login, buf, strlen(buf));
sprintf(buf, "%s\r\n", login);
send(sockfd, buf, strlen(buf), );
printf("%s\n", buf);
memset(rbuf, , );
recv(sockfd, rbuf, , );
printf("%s\n", rbuf); // PASSWORD
sprintf(buf, "qqpassword");//你的qq密码
memset(pass, , );
base64(pass, buf, strlen(buf));
sprintf(buf, "%s\r\n", pass);
send(sockfd, buf, strlen(buf), );
printf("%s\n", buf); memset(rbuf, , );
recv(sockfd, rbuf, , );
printf("%s\n", rbuf); // MAIL FROM
memset(buf, , );
sprintf(buf, "MAIL FROM: <123456789@qq.com>\r\n");
send(sockfd, buf, strlen(buf), );
memset(rbuf, , );
recv(sockfd, rbuf, , );
printf("%s\n", rbuf); // RCPT TO 第一个收件人
sprintf(buf, "RCPT TO:<%s>\r\n", email);
send(sockfd, buf, strlen(buf), );
memset(rbuf, , );
recv(sockfd, rbuf, , );
printf("%s\n", rbuf); // DATA 准备开始发送邮件内容
sprintf(buf, "DATA\r\n");
send(sockfd, buf, strlen(buf), );
memset(rbuf, , );
recv(sockfd, rbuf, , );
printf("%s\n", rbuf); // 发送邮件内容,\r\n.\r\n内容结束标记
sprintf(buf, "%s\r\n.\r\n", body);
send(sockfd, buf, strlen(buf), );
memset(rbuf, , );
recv(sockfd, rbuf, , );
printf("%s\n", rbuf); // QUIT
sprintf(buf, "QUIT\r\n");
send(sockfd, buf, strlen(buf), );
memset(rbuf, , );
recv(sockfd, rbuf, , );
printf("%s\n", rbuf); // VC2005 需要使用
closesocket(sockfd);
// close(sockfd);
#ifdef WIN32
WSACleanup();
#endif
return; }
// 打开TCP Socket连接
int open_socket(struct sockaddr *addr)
{
int sockfd = ;
sockfd=socket(PF_INET, SOCK_STREAM, );
if(sockfd < )
{
fprintf(stderr, "Open sockfd(TCP) error!\n");
exit(-);
}
if(connect(sockfd, addr, sizeof(struct sockaddr)) < )
{
fprintf(stderr, "Connect sockfd(TCP) error!\n");
exit(-);
}
return sockfd;
}
出处:http://blog.csdn.net/zx824/article/details/7387418
C语言利用SMTP协议发送邮件的更多相关文章
- 通过telnet使用smtp协议发送邮件
smtp协议是一个简单的邮件传输协议,利用它我们可以将邮件发送给别人,这里将通过telnet这个程序利用smtp协议从网易向gmail发送一封邮件 网上不少有说使用telnet发送邮件的文章,我也看过 ...
- python3:利用SMTP协议发送QQ邮件+附件
转载请表明出处:https://www.cnblogs.com/shapeL/p/9115887.html 1.发送QQ邮件,首先必须知道QQ邮箱的SMTP服务器 http://service.mai ...
- 使用java语言基于SMTP协议手写邮件客户端
使用java语言基于SMTP协议手写邮件客户端 1. 说明 电子邮件是互联网上常见的应用,他是互联网早期的产品,直至今日依然受到广大用户的喜爱(在中国可能因为文化背景不同,电子邮件只在办公的时候常用) ...
- SMTP 协议发送邮件的整体过程
使用 SMTP 发送邮件_使用 SMTP 发送邮件_发送邮件_用户指南_邮件推送-阿里云 https://help.aliyun.com/knowledge_detail/51622.html 通过 ...
- java实现发送邮件服务器,SMTP协议发送邮件
1.采用SMTP的邮件发送协议.准备:在网易注册一个邮箱,进入设置开启SMTP/pop3协议 2.接下来就是java代码实现了,下面都有注释,就不多做解释了. public class mail { ...
- 使用SMTP协议发送邮件
class Program { static void Main(string[] args) { ) { try { inputmodel obj = new inputmodel(args); S ...
- 使用java mail的网易smtp协议 发送邮件
package com.enation.newtest; import java.security.GeneralSecurityException; import java.util.Propert ...
- C#利用SMTP服务器发送邮件
使用.net(C#)发送邮件学习手册(带成功案例) 1.了解发送邮件的三种方式 2.实例介绍使用client.DeliveryMethod = System.Net.Mail.SmtpDelivery ...
- C# 利用SMTP异步发送邮件
C#实现收发邮件功能需要用到两个命名空间 System.Net; 和 System.Net.Mail; SmtpClient client = new SmtpClient("smtp.g ...
随机推荐
- 正睿 2019 省选附加赛 Day1 T1 考考试
比较奇怪的一个枚举题. 注意到10=2*5,所以10^k的二进制表示一定恰好在末尾有k个0. 考虑从小到大去填这个十进制数. 填的时候记录一下当前的二进制表示. 每次尝试去填0或者10^k. 如果要填 ...
- linux中whereis、which、find、location的区别和用法
摘自:https://www.cnblogs.com/kex1n/p/5233821.html 1. find find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件. find的使用格式 ...
- 『PyTorch』第一弹_静动态图构建if逻辑对比
对比TensorFlow和Pytorch的动静态图构建上的差异 静态图框架设计好了不能够修改,且定义静态图时需要使用新的特殊语法,这也意味着图设定时无法使用if.while.for-loop等结构,而 ...
- 『Python』pycharm常用设置
学习一下pycharm的快捷操作,提升速度,也提升舒适度,笑. 常用快捷键 ctrl + d :复制粘贴本行到下一行 ctrl + y :删除本行 ctrl + 鼠标点击 :跳转 ctrl + / : ...
- 数据库到jsp页面报错(一)
数据库到jsp页面报错(一) 这个错误的确比较坑. 控制台: 页面: 解决: 神坑啊!!!
- forget word qz_out_b1
1★ be bi prep 使~成为: 2★ bene b əni 好,善 :祈祷 3★ bi 2, 双重, 两个 bi 4★ by b æ / 通过,在~之前
- mongodb控制台中文乱码
问题描述: 使用命令行打开mongo,查询的结果里中文都是乱码,检查了文件编码均正常: 解决方法: 该问题是cmd字体引起的,设置cmd的字体即可,cmd的默认字体是“点阵字体”,选择其他两个均可,如 ...
- 小程序公用js提取到app.js中调用的实例
index.wxml: <view "> <text>{{page}}</text> </view> <view "> ...
- jsonp 跨域2
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- 一道sql 关于pivot的面试题
分析:其实它是对时间月份行转列的 表结构设计: 结果: select Name,moth,ISNULL([01],0) as Value1,ISNULL([02],0) as Value2,ISNUL ...