#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协议发送邮件的更多相关文章

  1. 通过telnet使用smtp协议发送邮件

    smtp协议是一个简单的邮件传输协议,利用它我们可以将邮件发送给别人,这里将通过telnet这个程序利用smtp协议从网易向gmail发送一封邮件 网上不少有说使用telnet发送邮件的文章,我也看过 ...

  2. python3:利用SMTP协议发送QQ邮件+附件

    转载请表明出处:https://www.cnblogs.com/shapeL/p/9115887.html 1.发送QQ邮件,首先必须知道QQ邮箱的SMTP服务器 http://service.mai ...

  3. 使用java语言基于SMTP协议手写邮件客户端

    使用java语言基于SMTP协议手写邮件客户端 1. 说明 电子邮件是互联网上常见的应用,他是互联网早期的产品,直至今日依然受到广大用户的喜爱(在中国可能因为文化背景不同,电子邮件只在办公的时候常用) ...

  4. SMTP 协议发送邮件的整体过程

    使用 SMTP 发送邮件_使用 SMTP 发送邮件_发送邮件_用户指南_邮件推送-阿里云 https://help.aliyun.com/knowledge_detail/51622.html 通过 ...

  5. java实现发送邮件服务器,SMTP协议发送邮件

    1.采用SMTP的邮件发送协议.准备:在网易注册一个邮箱,进入设置开启SMTP/pop3协议 2.接下来就是java代码实现了,下面都有注释,就不多做解释了. public class mail { ...

  6. 使用SMTP协议发送邮件

    class Program { static void Main(string[] args) { ) { try { inputmodel obj = new inputmodel(args); S ...

  7. 使用java mail的网易smtp协议 发送邮件

    package com.enation.newtest; import java.security.GeneralSecurityException; import java.util.Propert ...

  8. C#利用SMTP服务器发送邮件

    使用.net(C#)发送邮件学习手册(带成功案例) 1.了解发送邮件的三种方式 2.实例介绍使用client.DeliveryMethod = System.Net.Mail.SmtpDelivery ...

  9. C# 利用SMTP异步发送邮件

    C#实现收发邮件功能需要用到两个命名空间  System.Net; 和 System.Net.Mail; SmtpClient client = new SmtpClient("smtp.g ...

随机推荐

  1. 54 Django 模型层(1) 单表查询

    单表操作: 一 项目的操作顺序: 1 在model.py文件中创建表结构 class Book(models.Model): id=models.AutoField(primary_key=True) ...

  2. 斐波拉契数列(用JavaScript和Python实现)

    1.用JavaScript 判断斐波拉契数列第n个数是多少 //需求:封装一个函数,求斐波那契数列的第n项 //斐波拉契数列 var n=parseInt(prompt("输入你想知道的斐波 ...

  3. C/C++中的实参和形参,重点以及盲点,自己以前未知的

    C/C++中的实参和形参   今天突然看到一道关于形参和实参的题,我居然不求甚解.藐视过去在我的脑海里只有一个参数的概念,对于形参和实参的区别还真的不知道,作为学习了几年C++的人来说,真的深深感觉对 ...

  4. php表单提交安全方法

    1.$_SERVER["PHP_SELF"] 将表单数据发送到页面本身,而不是跳转到另一张页面.这样,用户就能够在表单页面获得错误提示信息.2.通过使用 htmlspecialch ...

  5. Spring Cloud Edgware之后版本 Zipkin+Kafka整合

    zipkin服务器端 1.依赖 <!-- zipkin server --> <dependency> <groupId>io.zipkin.java</gr ...

  6. String为什么不可变

    转载:http://www.importnew.com/7440.html https://www.cnblogs.com/leskang/p/6110631.html 什么是不可变对象? 众所周知, ...

  7. js数组与字符串之间的相互转换

    一.数组转字符串 需要将数组元素用某个字符连接成字符串,示例代码如下 <!doctype html> <html> <head> <meta charset= ...

  8. RK3288 GMAC整理

    一.源文件 源码路径:\drivers\net\ethernet\rockchip\gmac 源码阅读顺序: 二.重要探针函数stmmac_dvr_probe 1. alloc_etherdev 申请 ...

  9. 软工作业No.1。Java实现WC.exe

    网址:https://github.com/a249970271/WC WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有w ...

  10. DevExpress v17.2新版亮点——Data Access

    用户界面套包DevExpress v17.2日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了Data Access v17.2 的新功能,快来下载试用新版本! 新的API可在 ...