#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. RMQ板子

    对于RMQ这种静态最值询问, 用线段树的话查询过慢, 一般用ST表预处理后O(1)查询, 下以最大值查询为例, 这里假定$n$不超过5e5 void init() { Log[0] = -1; REP ...

  2. amoba读写分离

    原文链接:http://www.abcdocker.com/abcdocker/81 Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件.这个软件致 ...

  3. hdu-6324-博弈

    Problem F. Grab The Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Ja ...

  4. UVA-10655 Contemplation! Algebra (矩阵)

    题目大意:给出a+b的值和ab的值,求a^n+b^n的值. 题目分析:有种错误的方法是这样的:利用已知的两个方程联立,求解出a和b,进而求出答案.这种方法之所以错,是因为这种方法有局限性.联立之后会得 ...

  5. IOS UI-Button按钮

    #import "ViewController.h" @interface ViewController () { UILabel *lable; BOOL moveFlag; N ...

  6. Sql Server约束的学习一(主键约束、外键约束、唯一约束)

    一.约束的分类 1.实体约束 实体约束是关于行的,比如某一行出现的值不允许出现在其他行,例如主键约束. 2.域约束 域约束是关于列的,对于所有行,某一列有那些约束,例如检查约束. 3.参照完整性约束 ...

  7. NodeJS express不是外部或内部命令的解决办法

    今天在用express生成项目的时候,使用cmd命令窗口发现express不是“内部或外部命令......”.但是我已经使用了npm install -g express成功安装了express模块插 ...

  8. MyEclipse移动开发教程:设置所需配置的iOS应用(四)

    MyEclipse个人授权 折扣低至冰点!立即开抢>> [MyEclipse最新版下载] 三.创建配置文件 Provisioning profiles授权文件应用程序在iOS设备上安装并运 ...

  9. & | ^ ~ << >> 按位运算符

    与(&) |(或) ^(异或)  ~(取反) <<(左移) 先将两个数全部转化成为2进制再进行比较,再进行比较,位数不同则前面添0变为位数相同,然后再将得到的结果转化为你想要的类型 ...

  10. ESET Smart Security 6 – 免费60天(SG)

    ESS 60天 - 活动消息来自新加坡脸谱https://www.facebook.com/esetsingapore/app_190322544333196IP限制Sg,suiss提供个在线代理ht ...