📄 smtp.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 + -