SMTP协议初探(二)----linux下c编程实现发邮件

仿照,SMTP协议初探(一)--我的前一篇博客,结合网上的材料,利用socket,写了个Linux下c编程实现的发邮件程序。

大家可以拿自己的邮箱去做实验啦,base64是一种编码方式,网上可以找到一个网页,可以查询密码的base64编码是多少。当然也可以自己手工计算(我没试过)。

具体源码如下:

//#include<iostream>
#include <sys/types.h>      
#include <sys/socket.h>      
#include <netinet/in.h>      
#include <netdb.h>      
#include <stdio.h> 
#include <string.h>     
//using namespace std;      
#define EHLO "EHLO ***\r\n" //***为邮箱用户名     
#define DATA "data\r\n"      
#define QUIT "QUIT\r\n" 

//#define h_addr h_addr_list[0]     
//FILE *fin;     
int sock;     
struct sockaddr_in server;     
struct hostent *hp, *gethostbyname();     
char buf[BUFSIZ+1];     
int len;     
char *host_id="smtp.126.com";     
char *from_id="***@126.com";     
char *to_id="60462****@qq.com";     
char *sub="testmail\r\n";     
char wkstr[100]="hello how r u\r\n";      

/*=====Send a string to the socket=====*/      
void send_socket(char *s)     
{         
	write(sock,s,strlen(s));         
	//write(1,s,strlen(s));         
	//printf("Client:%s\n",s);     
}      

//=====Read a string from the socket=====*/      
void read_socket()     
{
	len = read(sock,buf,BUFSIZ);
	write(1,buf,len);
	//printf("Server:%s\n",buf);     
}      

/*=====MAIN=====*/     
int main(int argc, char* argv[])     
{      

	/*=====Create Socket=====*/
	sock = socket(AF_INET, SOCK_STREAM, 0);     
	if (sock==-1)     
	{
		perror("opening stream socket");
		//exit(1);  
		return 1;   
	}     
	else       
		//cout << "socket created\n";
		printf("socket created\n");

	/*=====Verify host=====*/
	server.sin_family = AF_INET;
	hp = gethostbyname(host_id);
	if (hp==(struct hostent *) 0)
	{
		fprintf(stderr, "%s: unknown host\n", host_id);
		//exit(2);
		return 2;
	}

	/*=====Connect to port 25 on remote host=====*/
	memcpy((char *) &server.sin_addr, (char *) hp->h_addr, hp->h_length);     	 				
	server.sin_port=htons(25); /* SMTP PORT */
	if (connect(sock, (struct sockaddr *) &server, sizeof server)==-1)
	{
		perror("connecting stream socket");
		//exit(1);
		return 1;
	}     
	else       
		//cout << "Connected\n";
		printf("Connected\n");

	/*=====Write some data then read some =====*/
	read_socket(); /* SMTP Server logon string */
	send_socket(EHLO); /* introduce ourselves */
	read_socket(); /*Read reply */

	/*
	**added by fupeng
	*/
	send_socket("AUTH LOGIN");
	send_socket("\r\n");
	read_socket();
	send_socket("*******");//用户名的base64编码
	send_socket("\r\n");
	read_socket();
	send_socket("******");//密码的base64编码
	send_socket("\r\n");
	read_socket();

	send_socket("mail from <");
	send_socket(from_id);
	send_socket(">");
	send_socket("\r\n");
	read_socket(); /* Sender OK */

	//send_socket("VRFY ");
	//send_socket(from_id);
	//send_socket("\r\n");     
	//read_socket(); // Sender OK */
	send_socket("rcpt to <"); /*Mail to*/
	send_socket(to_id);
	send_socket(">");
	send_socket("\r\n");
	read_socket(); // Recipient OK*/

	send_socket(DATA);// body to follow*/
	read_socket(); 
	//send_socket("from:***@126.com");
	send_socket("subject:");
	send_socket(sub);
	//read_socket(); // Recipient OK*/
	send_socket("\r\n\r\n");
	send_socket(wkstr);
	send_socket(".\r\n");
	read_socket();
	send_socket(QUIT); /* quit */
	read_socket(); // log off */

	//=====Close socket and finish=====*/
	close(sock);
	//exit(0);
	return 0;
} 

具体结果如下图片所示:


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//初始化邮件类 void InitEmail(C01waSendMail* m_globalEmail,String sendermail,String sender,String senderpwd,String srv,int port = 25,bool bSsl = false) { m_globalEmail->m_Auth = CPJNSMTPConnection::AuthenticationMethod::AUTH_AUTO; m_globalEmail->m_bAutoDial = true; m_globalEmail->m_bSSL = bSsl; m_globalEmail->m_sUsername = sender.c_str(); m_globalEmail->m_sAddress = sendermail.c_str(); m_globalEmail->m_sPassword = senderpwd.c_str(); m_globalEmail->m_sHost = srv.c_str(); m_globalEmail->m_nPort = port; m_globalEmail->m_sEncodingFriendly = _T("Chinese Simplified (GB2312)"); m_globalEmail->m_sEncodingCharset = _T("gb2312"); m_globalEmail->m_bMime = 1; m_globalEmail->m_bHTML = 1; m_globalEmail->m_Priority = CPJNSMTPMessage::PRIORITY::NormalPriority; m_globalEmail->m_bDSN = FALSE; m_globalEmail->m_bDSNSuccess = FALSE; m_globalEmail->m_bDSNFailure = FALSE; m_globalEmail->m_bDSNDelay = FALSE; m_globalEmail->m_bDSNHeaders = FALSE; m_globalEmail->m_bDNSLookup = FALSE; } //发送邮件 void SendEmail(const char* recvemail,const char* subject,const char* body,const char * sCC=NULL,const char * bCC = NULL,const char * attach = NULL) { //初始化邮箱 //注意释放内存 C01waSendMail *m_globalEmail = new C01waSendMail; if(strlen(m_con1.m_eamil)>0&&strlen(m_con1.m_pwd)&&strlen(m_con1.m_smtpsrv)&&m_con1.port>0) { char * p = strdup(m_con1.m_eamil); char * pp = strstr(p,"@"); if(pp>0) pp[0] = '\0'; InitEmail(m_globalEmail,m_con1.m_eamil,p,m_con1.m_pwd,m_con1.m_smtpsrv,m_con1.port,m_con1.ssl); free(p); if(subject>0) m_globalEmail->m_sSubject.Format("%s",subject); if(sCC>0) m_globalEmail->m_sCC.Format("%s",sCC); if(bCC>0) m_globalEmail->m_sBCC.Format("%s",bCC); if(body>0) m_globalEmail->m_sBody.Format("%s",body); if(attach>0) m_globalEmail->m_sFile.Format("%s",attach); if(recvemail>0) m_globalEmail->m_sTo.Format("%s",recvemail); m_globalEmail->SendEmail(); } }
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值