⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smtp.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
字号:
/* smtp protocol for uC/IP

 * $Id: SMTP.C,v 1.1.1.1 2004/12/22 10:02:09 zyu Exp $

 * Copyright (C)2002 Jiang Wei.

 */



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <asixwin.h>
#include <asixapp.h>
#include <ppsm.h>

#include <..\syssrc\net\nettypes.h>
#include "InetAddr.h" 

#include <..\app\email\email.h>
#include <..\app\email\emlfunc.h>
#include <..\app\email\emldb.h>

#include "netcfg.h"

#include "nettcp.h"
//#include "asixmail.h"
#include "domain.h"

#define SMTP_PORT 25



char *smtpserver;
short smtpport;
char *smtpname;
char *smtpmailfrom;
char *smtpsendto;
char *smtpdata;
char *smtpsub;
char *date;


//extern char *buf;

extern char buf[16384];

//extern unsigned int  bufsize;
extern int bufsize;
extern int mail_finish; 

extern NET_SERVER_STRU	net_server_stru;
extern LOCALSEARCHLIST  *global_email_list;


int mailsend_count;





struct netcfg *netcfg_smtp;

//struct mail_head	smtp_mailhead[MAXBOXITEM];

enum {
	STAT_OK = 0,
	STAT_IDLE,
	STAT_HELO,
	STAT_MAIL,
	STAT_RCPT,
	STAT_WRITE,
	STAT_DATA,
	STAT_QUIT,
	STAT_ERROR = -1,
};



char *smtp_cmd[] = {
	"HELO ",
	"MAIL FROM: ",
	"RCPT TO: ",
	"DATA",
	"\r\n.\r\n",
	"QUIT",
};



char *smtp_reply[] = {
	"220",
	"250",
	"221",
	"354",
};

char *str_crnl_smtp = "\r\n";

void init_smtp();
int mailsend_smtp();
int do_smtp(int control,int mailnum,int mailtotal);
char * gethead(char *index);

void init_smtp(st)
{
	u_long server_addr;
	int32 ip_addr;
	char *dnsp;
//	register U8		i;
	register U8     n;
//	register char		*ptr;


	int l = 0;
	int value;
	char string[100];

	DBLACB		*emaillacb;			//定义一个数据库控制块的变量
	char        box_type;
	EMAIL_STRU	*email_stru;
	EMAIL_SEARCH_STRU	email_search_stru;
	LOCALSEARCHLIST *global_email_list;
	
//	strcat(net_server_stru.dns_srv, "202.119.24.12");

//	strcat(net_server_stru.smtp_srv, "email.seu.edu.cn");


	smtpserver = net_server_stru.smtp_srv;
    smtpport = SMTP_PORT;
    smtpname = net_server_stru.helo;

	dnsp = net_server_stru.dns_srv;
    //server_addr = inet_addr("202.119.24.12");	//Primary DNS server
	server_addr = inet_addr(net_server_stru.dns_srv);	//Primary DNS server
    ip_addr = *((int32 *)&server_addr);
    add_nameserver(ip_addr);


	emaillacb =  LinkDataBase( EMAIL_DATA_BASE );	//链接电子邮件数据库
	box_type = EMAIL_UNSEND_BOX;
	email_search_stru.field = EMAIL_BOX;
	email_search_stru.keystring = &box_type;
	email_search_stru.mode = PRECISE_PART_MATCH;
	global_email_list = TransSearchEmail( &email_search_stru, 0 );
//	global_email_list = LocalFindRecord( emaillacb, EMAIL_BOX, &box_type, PRECISE_PART_MATCH );

	for( n = 0; n < global_email_list->num; n++ )
	{    
		sprintf(string,"正发送第%d封邮件(共%d封)",n+1,global_email_list->num);
		SetWindowText( st, string, NULL );
		email_stru = TransReadEmail( global_email_list, n, 0 );
	//	smtpmailfrom = email_stru->addressee;
		smtpmailfrom = cur_account;
		smtpsendto = email_stru->addresser;
		smtpdata = email_stru->content;
		smtpsub = email_stru->subject;
		date = email_stru->time;
		if(n == 0) 
			value = do_smtp(1,1,global_email_list->num);
		else
			value = do_smtp(0,n+1,global_email_list->num);

		if( value == 0 )
		{
			*(email_stru->box) = EMAIL_SEND_BOX;
			*(email_stru->type) = EMAIL_SEND;
			TransModifyEmail( global_email_list, n, email_stru, 0 );
			SysLfree( email_stru );
		}else{
			SysLfree( email_stru );


		}

	}

	if(n == global_email_list->num) {
		if(n == 0)
			SetWindowText( st, "发件箱中没有邮件可以发送...", NULL );
		else
			SetWindowText( st, "邮件发送成功...", NULL );
	}
	else
		SetWindowText( st, "邮件发送失败,请重试...", NULL );
	
	DelOldSearchList( global_email_list );




	if( DetachDataBase( emaillacb ) != DB_OK )
		MessageBox(0, "数据库断开失败!", "友情提醒", MB_OK|MB_ICONERROR);
}



int do_smtp(int control,int mailnum,int mailtotal)
{
	static int s;
	int i;
	int n;
	int m = 0;

	static struct sockaddr_in smtpad;
	static int connectsmtp;
	int smtp_stat;
	int testreturn;
	int testlen;


	if(control == 1) {

		if ((s = tcpOpen()) < 0)
			return s;

	//	if ((smtpad.sin_addr.s_addr = resolve(smtpserver)) == -1)
	//		return -1;

			while(1) {
			smtpad.sin_addr.s_addr = resolve(smtpserver);
			m++;
			if(smtpad.sin_addr.s_addr) break;
			if(m == 5) {
				//	SetWindowText( st, "DNS解析失败,请重试...", NULL );
					return -1;
			}
	}
		

		smtpad.sin_family = AF_INET;
#ifndef SIM_ON_PC
		smtpad.sin_port = htons(smtpport);
#else
		smtpad.sin_port = smtpport;
#endif
	//	if ((i = tcpConnect(s, &smtpad, 0)) < 0)
	//		return i;

			do{
		connectsmtp = tcpConnectJiffy(s, &smtpad, 0, 300);
		++n;
		if(n == 5) break;
		} while(connectsmtp != 0);



		smtp_stat = STAT_IDLE;
	}else{
		smtp_stat = STAT_MAIL;
		strcpy(buf, smtp_cmd[1]);
		strcat(buf, smtpmailfrom);
		strcat(buf, str_crnl_smtp);

		tcpWrite(s, buf, strlen(buf));
		delay(1000);
	}

	

//	while ((i = tcpRead(s, buf, bufsize)) >= 0) {
	while ((i = tcpReadJiffy(s,buf,bufsize,1200)) >=0) {

		switch (smtp_stat) {

		case STAT_IDLE:

			if (strncmp(buf, smtp_reply[0], strlen(smtp_reply[0]))) {
				smtp_stat = STAT_ERROR;
				break;
			}

			if (i < bufsize) {
				strcpy(buf, smtp_cmd[0]);
				strcat(buf, smtpname);
				strcat(buf, str_crnl_smtp);
				++smtp_stat;
				break;
			}
			break;

		case STAT_HELO:
			if (strncmp(buf, smtp_reply[1], strlen(smtp_reply[1]))) {
				smtp_stat = STAT_ERROR;
				break;
			}

	

			if (i < bufsize) {
				strcpy(buf, smtp_cmd[1]);
				strcat(buf, smtpmailfrom);
				strcat(buf, str_crnl_smtp);
				++smtp_stat;
				break;
			}
			break;

		case STAT_MAIL:

			if (strncmp(buf, smtp_reply[1], strlen(smtp_reply[1]))) {
				smtp_stat = STAT_ERROR;
				break;
			}

			if (i < bufsize) {
				strcpy(buf, smtp_cmd[2]);
				strcat(buf, smtpsendto);
				strcat(buf, str_crnl_smtp);
				++smtp_stat;
				break;
			}
			break;

		case STAT_RCPT:

			if (strncmp(buf, smtp_reply[1], strlen(smtp_reply[1]))) {
				smtp_stat = STAT_ERROR;
				break;
			}

			

			if (i < bufsize) {
				strcpy(buf, smtp_cmd[3]);
				//strcat(buf, smtpdata);
				strcat(buf, str_crnl_smtp);
				++smtp_stat;
				break;
			}
			break;

		case STAT_WRITE:
			if (strncmp(buf, smtp_reply[3], strlen(smtp_reply[3]))) {
				smtp_stat = STAT_ERROR;
				break;
			}

			if(i < bufsize) {
				
				strcpy(buf,"Subject: ");
				strcat(buf,smtpsub);
				strcat(buf,"\r\n");
			

			    strcat(buf,"From: ");
				strcat(buf,smtpmailfrom);
				strcat(buf,"\r\n");

				strcat(buf,"To: ");
				strcat(buf,smtpsendto);
				strcat(buf,"\r\n");

				strcat(buf,"Date: ");
				strcat(buf,date);
				strcat(buf,"\r\n\r\n");
			//	strcat(buf,"\r\n");

				strcat(buf,smtpdata);
				strcat(buf, smtp_cmd[4]);
				++smtp_stat;
				break;
				}
			break;

		case STAT_DATA:
			if (strncmp(buf, smtp_reply[1], strlen(smtp_reply[1]))) {
				smtp_stat = STAT_ERROR;
				break;
				}

			if(mailnum < mailtotal)
				return 0;

			if (i < bufsize) {
				strcpy(buf, smtp_cmd[5]);
				strcat(buf, str_crnl_smtp);
				++smtp_stat;
				break;
			}
			break;

		case STAT_QUIT:
				if (strncmp(buf, smtp_reply[2], strlen(smtp_reply[2]))) {
				smtp_stat = STAT_ERROR;
				break;
			}

			if (i < bufsize) {
				smtp_stat = STAT_OK;
				break;
			}
			break;
		}

		

		if (smtp_stat > 0) {
			testlen = strlen(buf);
			testreturn = tcpWrite(s, buf, testlen);
					}
		else break;
	}

	tcpClose(s);

	if (smtp_stat < 0) {
		mail_finish = 1;
		return -1;
	}

	else return 0;

}



char * gethead(char *index)

{

	char *p;

	char *q;

	char *ptr;



	 

	

	p = (char *)Lmalloc(sizeof(index));

	q = p;

	memcpy(p,0x0,sizeof(index));



	for (ptr=index;*ptr!='\n';ptr++) 

		memcpy(p++,ptr,1);

		

	



	*p = '\0';

	return q;

}

	

	

	





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -