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 ...
随机推荐
- python-day17--列表推导式,生成器表达式
# for i in range(100):# print(i*i) 列表推导式: # l =[i*i for i in range(100)]# print(l) # l = [{'name':'v ...
- jquery自动填充输入框
1,这是一个比较简单的页面,你可以复制下来就可以使用.<!doctype html><html lang="en"><head> <met ...
- PL/SQL 中 dbms_output.put_line 输出字符长度限制的问题
可以使用dbms_out.enable()函数来设定允许的长度. PL/SQL 中 dbms_output.put_line 输出字符长度限制的问题
- spring cloud图形化dashboard是如何实现指标的收集展示的
spring cloud图形化dashboard是如何实现指标的收集展示的 1.dashboard图形化界面入口 http://localhost:10000/hystrix.stream 说明:端口 ...
- 【CSS】清除浮动的五种方式
清除浮动是一件功德无量的事情23333 这里记录一下清除浮动的多种方式 *首先要明确的是,为什么要清除浮动? A 影响其他元素定位 父盒子高度为0,子盒子全部浮动.定位,子盒子不会撑开父盒子,下面的元 ...
- forget word out2
1★ dictionary / dik ʃ ən əri dict 2★ fy => faction f æk ʃ ən 派别
- office2013安装和破解教程
office2013安装和破解教程(非常简单) 工具/原料 ·电脑 ·office2013 ·HEU_KMS_Activator_CH_v7.6a(激活软件) 方法/步骤 1.1下载Microsoft ...
- Transfer files Using sshpass
#! /bin/bash user=root password=12345678 remote_ip=192.168.3.140 remote_dir=/usr/bin/ local_file_dir ...
- 玩转X-CTR100 l STM32F4 l DRV8825 A4988 步进电机控制
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器控制步进电机 ...
- DevExpress v17.2新版亮点—Analytics Dashboard篇(一)
用户界面套包DevExpress v17.2日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了Analytics Dashboard v17.2 的新功能,快来下载试用新版本! ...