当前位置:首页 » 编程语言 » c语言smtp

c语言smtp

发布时间: 2022-07-06 08:46:20

1. c语言邮件程序 如何发送附件

C语言发送邮件 完整代码:

#include<windows.h>
#include<stdio.h>
#include<WinSock.h>
#include<iostream>
usingnamespacestd;
#pragmacomment(lib,"ws2_32.lib")

structBase64Date6
{
unsignedintd4:6;
unsignedintd3:6;
unsignedintd2:6;
unsignedintd1:6;
};
//协议中加密部分使用的是base64方法
charConvertToBase64(charc6);
voidEncodeBase64(char*dbuf,char*buf128,intlen);
voidSendMail(char*email,char*body);
intOpenSocket(structsockaddr*addr);

intmain()
{
charEmailTo[]="[email protected]";
charEmailContents[]="From:"lucy"<[email protected]> "
"To:"dasiy"<[email protected]> "
"Subject:Hello "
"HelloWorld,HelloEmail!"
//"DATA "//告诉服务器下面是邮件
//下面是邮件头
"TO:[email protected] "
"FROM:[email protected] "
"SUBJECT:SMTP协议测试 "
"Date:2015-04-20 "
"X-Mailer:fice'smailer "
"MIMI-Version:1.0 "
"Content-Type:multipart/mixed;boundary="#BOUNDARY#" "//设置边界值,区分邮件内容的两个回车换行
"Content-Transfer-Encoding:7bit "
"Thisisamulti-partmessageinMIMEformat "
//发送邮件内容头部信息
"--#BOUNDARY# "
"Content-Type:text/plain;charset=gb2312 "
"Content-Transfer-Encoding:printable "
//发送邮件的内容部分
"SMTP协议测试:发送附件/n----byfice2015.04.20 "
//发送附件头部信息
"--#BOUNDARY# "
"Content-Type:text/plain;name=student.txt "
"Content-Transfer-Encoding:base64 "
"Content-Disposition:attachment;filename="test.txt" ";
SendMail(EmailTo,EmailContents);
return0;
}

charConvertToBase64(charuc)
{
if(uc<26)
{
return'A'+uc;
}
if(uc<52)
{
return'a'+(uc-26);
}
if(uc<62)
{
return'0'+(uc-52);
}
if(uc==62)
{
return'+';
}
return'/';
}

//base64的实现
voidEncodeBase64(char*dbuf,char*buf128,intlen)
{
structBase64Date6*ddd=NULL;
inti=0;
charbuf[256]={0};
char*tmp=NULL;
charcc='';

memset(buf,0,256);
strcpy_s(buf,256,buf128);
for(i=1;i<=len/3;i++)
{
tmp=buf+(i-1)*3;
cc=tmp[2];
tmp[2]=tmp[0];
tmp[0]=cc;
ddd=(structBase64Date6*)tmp;
dbuf[(i-1)*4+0]=ConvertToBase64((unsignedint)ddd->d1);
dbuf[(i-1)*4+1]=ConvertToBase64((unsignedint)ddd->d2);
dbuf[(i-1)*4+2]=ConvertToBase64((unsignedint)ddd->d3);
dbuf[(i-1)*4+3]=ConvertToBase64((unsignedint)ddd->d4);
}
if(len%3==1)
{
tmp=buf+(i-1)*3;
cc=tmp[2];
tmp[2]=tmp[0];
tmp[0]=cc;
ddd=(structBase64Date6*)tmp;
dbuf[(i-1)*4+0]=ConvertToBase64((unsignedint)ddd->d1);
dbuf[(i-1)*4+1]=ConvertToBase64((unsignedint)ddd->d2);
dbuf[(i-1)*4+2]='=';
dbuf[(i-1)*4+3]='=';
}
if(len%3==2)
{
tmp=buf+(i-1)*3;
cc=tmp[2];
tmp[2]=tmp[0];
tmp[0]=cc;
ddd=(structBase64Date6*)tmp;
dbuf[(i-1)*4+0]=ConvertToBase64((unsignedint)ddd->d1);
dbuf[(i-1)*4+1]=ConvertToBase64((unsignedint)ddd->d2);
dbuf[(i-1)*4+2]=ConvertToBase64((unsignedint)ddd->d3);
dbuf[(i-1)*4+3]='=';
}
return;
}
//发送邮件
voidSendMail(char*email,char*body)
{
intsockfd={0};
charbuf[1500]={0};
charrbuf[1500]={0};
charlogin[128]={0};
charpass[128]={0};
WSADATAWSAData;
structsockaddr_intheir_addr={0};
WSAStartup(MAKEWORD(2,2),&WSAData);
memset(&their_addr,0,sizeof(their_addr));

their_addr.sin_family=AF_INET;
their_addr.sin_port=htons(25);
hostent*hptr=gethostbyname("smtp.126.com");
memcpy(&their_addr.sin_addr.S_un.S_addr,hptr->h_addr_list[0],hptr->h_length);
printf("IPofsmpt.126.comis:%d:%d:%d:%d ",
their_addr.sin_addr.S_un.S_un_b.s_b1,
their_addr.sin_addr.S_un.S_un_b.s_b2,
their_addr.sin_addr.S_un.S_un_b.s_b3,
their_addr.sin_addr.S_un.S_un_b.s_b4);

//连接邮件服务器,如果连接后没有响应,则2秒后重新连接
sockfd=OpenSocket((structsockaddr*)&their_addr);
memset(rbuf,0,1500);
while(recv(sockfd,rbuf,1500,0)==0)
{
cout<<"reconnect..."<<endl;
Sleep(2);
sockfd=OpenSocket((structsockaddr*)&their_addr);
memset(rbuf,0,1500);
}

cout<<rbuf<<endl;

//EHLO
memset(buf,0,1500);
sprintf_s(buf,1500,"EHLOHYL-PC ");
send(sockfd,buf,strlen(buf),0);
memset(rbuf,0,1500);
recv(sockfd,rbuf,1500,0);
cout<<"EHLOREceive:"<<rbuf<<endl;

//AUTHLOGIN
memset(buf,0,1500);
sprintf_s(buf,1500,"AUTHLOGIN ");
send(sockfd,buf,strlen(buf),0);
memset(rbuf,0,1500);
recv(sockfd,rbuf,1500,0);
cout<<"AuthLoginReceive:"<<rbuf<<endl;

//USER
memset(buf,0,1500);
sprintf_s(buf,1500,"[email protected]");//你的邮箱账号
memset(login,0,128);
EncodeBase64(login,buf,strlen(buf));
sprintf_s(buf,1500,"%s ",login);
send(sockfd,buf,strlen(buf),0);
cout<<"Base64UserName:"<<buf<<endl;
memset(rbuf,0,1500);
recv(sockfd,rbuf,1500,0);
cout<<"UserLoginReceive:"<<rbuf<<endl;

//PASSWORD
sprintf_s(buf,1500,"********");//你的邮箱密码
memset(pass,0,128);
EncodeBase64(pass,buf,strlen(buf));
sprintf_s(buf,1500,"%s ",pass);
send(sockfd,buf,strlen(buf),0);
cout<<"Base64Password:"<<buf<<endl;

memset(rbuf,0,1500);
recv(sockfd,rbuf,1500,0);
cout<<"SendPasswordReceive:"<<rbuf<<endl;

//MAILFROM
memset(buf,0,1500);
sprintf_s(buf,1500,"MAILFROM:<[email protected]> ");
send(sockfd,buf,strlen(buf),0);
memset(rbuf,0,1500);
recv(sockfd,rbuf,1500,0);
cout<<"setMailFromReceive:"<<rbuf<<endl;

//RCPTTO第一个收件人
sprintf_s(buf,1500,"RCPTTO:<%s> ",email);
send(sockfd,buf,strlen(buf),0);
memset(rbuf,0,1500);
recv(sockfd,rbuf,1500,0);
cout<<"TellSendtoReceive:"<<rbuf<<endl;

//DATA准备开始发送邮件内容
sprintf_s(buf,1500,"DATA ");
send(sockfd,buf,strlen(buf),0);
memset(rbuf,0,1500);
recv(sockfd,rbuf,1500,0);
cout<<"SendMailPrepareReceive:"<<rbuf<<endl;

//发送邮件内容, . 内容结束标记
sprintf_s(buf,1500,"%s . ",body);
send(sockfd,buf,strlen(buf),0);//发送邮件,不带附件的内容

//用二进制方式读取附件文件内容并转为base64格式
FILE*pf=fopen("D:\test.txt","rb");
fseek(pf,0,SEEK_END);
intfilelen=ftell(pf);
char*filebuf=(char*)malloc(filelen);
char*filebase64=(char*)malloc(filelen*2);
memset(filebase64,0,filelen*2);
fseek(pf,0,SEEK_SET);
fread(filebuf,1,filelen,pf);
EncodeBase64(filebase64,filebuf,filelen);

send(sockfd,filebase64,strlen(filebase64),0);//发送邮件的内容
memset(rbuf,0,1500);
recv(sockfd,rbuf,1500,0);
cout<<"SendMailReceive:"<<rbuf<<endl;

//QUIT
sprintf_s(buf,1500,"QUIT ");
send(sockfd,buf,strlen(buf),0);
memset(rbuf,0,1500);
recv(sockfd,rbuf,1500,0);
cout<<"QuitReceive:"<<rbuf<<endl;

//清理工作
closesocket(sockfd);
WSACleanup();
return;
}
//打开TCPSocket连接
intOpenSocket(structsockaddr*addr)
{
intsockfd=0;
sockfd=socket(PF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
cout<<"Opensockfd(TCP)error!"<<endl;
exit(-1);
}
if(connect(sockfd,addr,sizeof(structsockaddr))<0)
{
cout<<"Connectsockfd(TCP)error!"<<endl;
exit(-1);
}
returnsockfd;
}

2. 用C语言写一个邮件收发程序,不知道该怎么做!求大神指导!

你可以用smtp协议来发送邮件

用pop3来接收邮件
具体发送的代码全是api函数,直接调用就行了
想加界面的话用c++的mfc或者调用api建窗口
网络搜都有的

3. 谁能写个c语言发邮件代码(能编译通过并且能成功发送的)

详细的代码网络下,一大堆。网络文库中就有很多免费的文档,所以这里就大致写一下思路吧。

你知道服务器的地址,使用gethostbyname函数就可以得到对应的IP,然后就可以用socket连接服务器了。
连接上以后,先用smtp协议通用方法和服务器完成身份验证,也就是完成登录的过程。一般来说也就是发个HELLO到服务器,然后服务器回个响应。在收到响应的时候,在发用户名密码,然后在等服务器响应。这些都完成,则表示登录成功了。
然后就构造mail格式的消息发消息出去即可。

4. C语言发送邮件

基本框架就是这,需要其他功能自己添加吧
C语言实现简单的SMTP发送邮件
#include <windows.h>
#include <stdio.h>
#include <WinSock.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")

struct Base64Date6
{
unsigned int d4:6;
unsigned int d3:6;
unsigned int d2:6;
unsigned int d1:6;
};
// 协议中加密部分使用的是base64方法
char ConvertToBase64 (char c6);
void EncodeBase64 (char *dbuf, char *buf128, int len);
void SendMail (char *email,char *body);
int OpenSocket (struct sockaddr *addr);

int main()
{
char EmailTo[] = "[email protected]";
char EmailContents[] = "From: \"lucy\"<[email protected]>\r\n"
"To: \"dasiy\"<[email protected]>\r\n"
"Subject: Hello\r\n\r\n"
"Hello World, Hello Email!";
SendMail(EmailTo, EmailContents);
return 0;
}

char ConvertToBase64(char uc)
{
if(uc < 26)
{
return 'A' + uc;
}
if(uc < 52)
{
return 'a' + (uc - 26);
}
if(uc < 62)
{
return '0' + (uc - 52);
}
if(uc == 62)
{
return '+';
}
return '/';
}

// base64的实现
void EncodeBase64(char *dbuf, char *buf128, int len)
{
struct Base64Date6 *ddd = NULL;
int i = 0;
char buf[256] = {0};
char *tmp = NULL;
char cc = '\0';

memset(buf, 0, 256);
strcpy_s(buf, 256, buf128);
for(i = 1; i <= len/3; i++)
{
tmp = buf + (i-1)*3;
cc = tmp[2];
tmp[2] = tmp[0];
tmp[0] = cc;
ddd = (struct Base64Date6 *)tmp;
dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1);
dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2);
dbuf[(i-1)*4+2] = ConvertToBase64((unsigned int)ddd->d3);
dbuf[(i-1)*4+3] = ConvertToBase64((unsigned int)ddd->d4);
}
if(len % 3 == 1)
{
tmp = buf + (i-1)*3;
cc = tmp[2];
tmp[2] = tmp[0];
tmp[0] = cc;
ddd = (struct Base64Date6 *)tmp;
dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1);
dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2);
dbuf[(i-1)*4+2] = '=';
dbuf[(i-1)*4+3] = '=';
}
if(len%3 == 2)
{
tmp = buf+(i-1)*3;
cc = tmp[2];
tmp[2] = tmp[0];
tmp[0] = cc;
ddd = (struct Base64Date6 *)tmp;
dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1);
dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2);
dbuf[(i-1)*4+2] = ConvertToBase64((unsigned int)ddd->d3);
dbuf[(i-1)*4+3] = '=';
}
return;
}
// 发送邮件
void SendMail(char *email, char *body)
{
int sockfd = {0};
char buf[1500] = {0};
char rbuf[1500] = {0};
char login[128] = {0};
char pass[128] = {0};
WSADATA WSAData;
struct sockaddr_in their_addr = {0};
WSAStartup(MAKEWORD(2, 2), &WSAData);
memset(&their_addr, 0, sizeof(their_addr));

their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(25);
hostent* hptr = gethostbyname("smtp.126.com");
memcpy(&their_addr.sin_addr.S_un.S_addr, hptr->h_addr_list[0], hptr->h_length);
printf("IP of smpt.126.com is : %d:%d:%d:%d\n",
their_addr.sin_addr.S_un.S_un_b.s_b1,
their_addr.sin_addr.S_un.S_un_b.s_b2,
their_addr.sin_addr.S_un.S_un_b.s_b3,
their_addr.sin_addr.S_un.S_un_b.s_b4);

// 连接邮件服务器,如果连接后没有响应,则2 秒后重新连接
sockfd = OpenSocket((struct sockaddr *)&their_addr);
memset(rbuf, 0, 1500);
while(recv(sockfd, rbuf, 1500, 0) == 0)
{
cout<<"reconnect..."<<endl;
Sleep(2);
sockfd = OpenSocket((struct sockaddr *)&their_addr);
memset(rbuf, 0, 1500);
}

cout<<rbuf<<endl;

// EHLO
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "EHLO HYL-PC\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"EHLO REceive: "<<rbuf<<endl;

// AUTH LOGIN
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "AUTH LOGIN\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Auth Login Receive: "<<rbuf<<endl;

// USER
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "[email protected]");//你的邮箱账号
memset(login, 0, 128);
EncodeBase64(login, buf, strlen(buf));
sprintf_s(buf, 1500, "%s\r\n", login);
send(sockfd, buf, strlen(buf), 0);
cout<<"Base64 UserName: "<<buf<<endl;
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"User Login Receive: "<<rbuf<<endl;

// PASSWORD
sprintf_s(buf, 1500, "XXXXXXXXXXXX");//你的邮箱密码
memset(pass, 0, 128);
EncodeBase64(pass, buf, strlen(buf));
sprintf_s(buf, 1500, "%s\r\n", pass);
send(sockfd, buf, strlen(buf), 0);
cout<<"Base64 Password: "<<buf<<endl;

memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Send Password Receive: "<<rbuf<<endl;

// MAIL FROM
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "MAIL FROM: <[email protected]>\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"set Mail From Receive: "<<rbuf<<endl;

// RCPT TO 第一个收件人
sprintf_s(buf, 1500, "RCPT TO:<%s>\r\n", email);
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Tell Sendto Receive: "<<rbuf<<endl;

// DATA 准备开始发送邮件内容
sprintf_s(buf, 1500, "DATA\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Send Mail Prepare Receive: "<<rbuf<<endl;

// 发送邮件内容,\r\n.\r\n内容结束标记
sprintf_s(buf, 1500, "%s\r\n.\r\n", body);
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Send Mail Receive: "<<rbuf<<endl;

// QUIT
sprintf_s(buf, 1500, "QUIT\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Quit Receive: "<<rbuf<<endl;

//清理工作
closesocket(sockfd);
WSACleanup();
return;
}
// 打开TCP Socket连接
int OpenSocket(struct sockaddr *addr)
{
int sockfd = 0;
sockfd=socket(PF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
cout<<"Open sockfd(TCP) error!"<<endl;
exit(-1);
}
if(connect(sockfd, addr, sizeof(struct sockaddr)) < 0)
{
cout<<"Connect sockfd(TCP) error!"<<endl;
exit(-1);
}
return sockfd;
}

5. 我想编写一个SMTP用于向邮箱发送邮件,请高手给一段代码示例,我看了SMTP协议和命令,但具体格式不知道。

我帮你找了一下,有这个地址可以参考
《一组实现邮件发送功能的C++封装类 — SMailer》
应该比较适合你的,你可以看一下!
http://www.vckbase.com/document/viewdoc/?id=703

这个里面的内容就是C++语言的!

6. 邮件发送程序客户端(C语言源代码)

SMTP协议是用于发送电子邮件的主要通信协议,是C语言进行网络编程时经常都会使用到的基础协议之一。邮件发送客户端程序要求使用C语言socket通信来完成SMTP协议,实现邮件发送程序的客户端应用,通过该程序能够向远程的SMTP服务器发送电子邮件的请求,并发送到指定的电子邮箱之中。 第一阶段:只要求通过dos窗口实现简单文本邮件的发送,具体的要求如下: 程序启动后录入SMTP服务器地址; 录入SMTP服务器用户名和密码; 录入收件人地址和抄送人地址(允许录入多个,中间以分号分隔); 录入邮件主题; 录入邮件内容完成后发送邮件; 邮件发送成功后系统提供邮件发送成功; 第二阶段:要求能够实现发送MIME格式邮件或利用Win32编程将程序升级为桌面应用程序,进入第二阶段必须满足以下条件: 必须是在充分理解SMTP协议的基础上; 必须是在充分理解MIME格式的基础上; 利用C语言将发送的内容格式化为MIME格式; 可以首先考虑只实现MIME格式的一部分格式化需求; 升级桌面应用程序必须对Win32 API有一定的理解和掌握;

7. smtp C语言发邮件,收信有主体没内容。

发的时候,有没有带上body、、、、

~
~
~

8. C语言发送SMTP邮件和VB有什么不同呢,请教

你比我一个朋友强多了,我那朋友,到网上搜索点源码不管他理不理解,他都说是他自己编的,到我们面前显摆。

9. c语言中有发送邮件的函数吗

没有,需要第三方库函数。

10. 请问学习C语言哪些方面的内容可以编写最简易的收发邮件的客户端(smtp/pop3协议)

学习网络通讯协议 ,还有一些基础的编程知识,socket通讯 ,了解协议的初始化,

热点内容
滑板鞋脚本视频 发布:2025-02-02 09:48:54 浏览:433
群晖怎么玩安卓模拟器 发布:2025-02-02 09:45:23 浏览:557
三星安卓12彩蛋怎么玩 发布:2025-02-02 09:44:39 浏览:744
电脑显示连接服务器错误 发布:2025-02-02 09:24:10 浏览:537
瑞芯微开发板编译 发布:2025-02-02 09:22:54 浏览:147
linux虚拟机用gcc编译时显示错误 发布:2025-02-02 09:14:01 浏览:240
java驼峰 发布:2025-02-02 09:13:26 浏览:652
魔兽脚本怎么用 发布:2025-02-02 09:10:28 浏览:538
linuxadobe 发布:2025-02-02 09:09:43 浏览:212
sql2000数据库连接 发布:2025-02-02 09:09:43 浏览:726