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 ...
随机推荐
- hdu5253 MST
连接的管道 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU-3506 Monkey Party (环形石子合并)
题目大意:n堆石子围成一圈,每堆石子的块数已知,每次可以将相邻的两堆合并到一堆,块数变为两堆之和,代价也为两堆石子块数之和.求合并到一堆的最小代价. 题目分析:先通过将前n-1依次个移到第n个后面,将 ...
- OAF中为MessageTextInput添加加事件处理
需求:现在OAF页面上有俩输入框,单价,数量,根据单价数量,自动计算MessageStyledText金额中的值,对应的基于EO的VO的字段为UnitPrice,Quantity,Total. 实现方 ...
- vue上传文件
<div> <input type="file" class="file" name="file" @change=&qu ...
- Java多线程的同步控制记录
Java多线程的同步控制记录 一.重入锁 重入锁完全可以代替 synchronized 关键字.在JDK 1.5 早期版本,重入锁的性能优于 synchronized.JDK 1.6 开始,对于 sy ...
- httpclient 连接管理器
连接操作器 连接操作是客户端的底层套接字或可以通过外部实体,通常称为连接操作的被操作的状态的连接. OperatedClientConnection接口扩展了HttpClientConnection接 ...
- css 初始包含块
continuous media ,paged media 关于continuous media[连续媒体]和paged media[分页媒体] 直白的讲,continuous和paged media ...
- Java——线程池
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- ansible 删除路径下的多个文件[收集的参考]
How to delete multiple files / directories in Ansible ansible - find, file modules to delete files a ...
- 自定义iconfont 图标库下载本地在移动App的使用及svg彩色图标
自定义iconfont 图标库扩展 在Hbuilder开发移动App的使用及svg彩色图标(或mui图标库的自定义扩展) 前提准备:1.登录阿里iconfont图标库,创建自己的项目,地址:http: ...