(2005-02-01) (2005-04-28) PIC_SERVER (10) SMTP E-mail PIC_SERVER (event driven) E-mail PIC_SERVER SMTP E-mail 1. E-mail E-mail 1 (1) (2) (3) (4) 1
1. 2 E-mail A E-mail B E-mail SMTP(Simple Mail Transfer Protocol) POP3(Post Office version 3) E-mail (1) A (Mail User Agent, MUA) Outlook E-mail SMTP (2) A (Mail Transfer Agent, MTA) Mail Server A E-mail (3) B POP3 B Mail Server E-mail MTA SMTP IP POP3 Outlook SMTP POP3 E-mail 2
2. E-mail PIC_SERVER E-mail 3 PIC_SERVER MUA MTA E-mail SMTP MTA PIC_SERVER E-mail SMTP MTA 3. PIC_SERVER E-mail 3
2. SMTP SMTP TCP Port 25 ASCII 4 SMTP SMTP 5 SMTP E-mail 4. SMTP SMTP server 4 SMPT SMTP server HELO E-mail. E-mail SMTP server Mail accepted SMTP server HELO SMTP IP msa.hinet.net Hello 4
[140.138.40.129], pleased to meet you IP SMTP IP MAIL FROM: E-mail @ SMTP 5 telnet SMTP server E-mail s919204 SMTP 5 SMTP server 6 E-mail IP ping ping msa.hinet.net 5. telnet SMTP server 6. E-mail 5
5 SMTP E-mail SMTP E-mail 7 E-mail TO: s919204@mail.yzu.edu.tw Subject: This E-mail is sent from PIC_SERVER 7. E-mail 3. PIC_SERVER SMTP E-mail PIC_SERVER E-mail SMTP Mail server IP TCP port 25 SMTP server PIC_SERVER E-mail (1) SMTP server SMTP server IP PIC_SERVER TCP UDP SERVER (2) E-mail E-mail (3) SMTP E-mail E-mail E-mail (4) TCP port 25 SMTP (5) SMTP HELO E-mail ex_9_send_email.c PIC_SERVER E-mail E-mail TCP client PIC_SERVER (9) (10) ex_8_tcp_client.c ex_9_send_email.c ex_8_tcp_client.c 6
pic_server_email.c SMTP dosmtpsendemail() PIC_SERVER E-mail 3.1 sendemail_to_smtpserver() 3.3 sendemail_to_smtpserver() 3.2 11 3.1 SMTP server E-mail ICP SMTP server SMTP server 140.138.36.11 port 25 8 bios_initarptable() 8. ICP SMTP server 9 SMTP E-mail I_WANT_EMAIL TCP port 25 SMTP DEBUG_MAIL RS-232 SMTP server PIC_SERVER E-mail 7
#ignore_warnings 201, 203, 204 #include <18F4620.H> // <18F452.H> <18F6680.H> #define PIC_SERVER_PCB_V_2 TRUE // 'FALSE' for V_1.0, default 'TRUE' #define I_WANT_EMAIL 1 // set '1' for E-mail via SMTP #define DEBUG_MAIL 1 // set '1' for debugging #define MAIL_TIMEOUT 10 // int8 mail_sender [48]; // int8 mail_recipient[80]; // int8 mail_subject [80]; // int8 mail_data [300]; //... 1.3 kb for 1.5 kb Ether frame #include "pic_server_lib.h" // default baud rate 115200 9. E-mail 3.2 10 LCD PIC_SERVER IP bios_initarptable() PIC_SERVER TCP UDP SERVER E-mail disp_arptable() E-mail ( sendemail_to_smtpserver()) while (1) PIC_SERVER E-mail m E-mail sendemail_to_smtpserver() E-mail mail_data 3.3 12 (2) bios_ethernethandler() TCPserver callback_tcpserverdataarrival() TCPserver SMTP_PORT(TCP port 25) SMTP server dosmtpsendemail() SMTP server E-mail mail_data printf( nic_putc, %s, mail_data) SMTP dosmtpsendemail() pic_server_email.c 8
(3) TCP E-mail dohousekeeping() pic_server.h TCP_TIMEOUT 10 MAIL_TIMEOUT 20 9 void main() char keyin; printf( PROJ_TITLE_VERSION ); pic_server_init(); lcd_init(); lcd_dispip(); disp_arptable(); bios_initarptable(); disp_arptable(); disp_picports(); beep(440,500); delay_ms(200); beep(880,200); printf("\r\n"); while(1) // // system clock and hardware I/O configuration // read Internet configuration from Data EEPROM //LCD // PIC_SERVER IP LCD // // // PIC bios_ethernethandler(); //... // ARP/IP/ICMP/UDP/TCP/HTTP/SMTP/dhcp... // Callback function. dohousekeeping(); // E-mail TCP if( kbhit() ) // PC putc ( keyin = getc() ); if ( keyin == 'm' ) sendemail_to_smtpserver(); // m E-mail else disp_arptable(); disp_picports(); // ---- Callback functions ---------------------------------------------------- void callback_httpclientcmdhandler(void) void callback_httpclientrequestdata(void) void callback_udpserverdataarrival(void) void callback_udpclientdataarrival(void) void callback_timeserverdataarrival(void) void callback_tcpserverdataarrival (void) if ( rtcpserver.port == SMTP_PORT ) dosmtpsendemail(); void callback_tcpclientdataarrival(void) // ---- Callback functions ---- over ------------------------------------------ // TCP port 25 // 10. 9
3.3 11 sendemail_to_smtpserver() E-mail E-mail E-mail 12 E-mail sprintf(mail_data, ) mail_data bios_connectremotehost() strcpy(temp_str, something more to say, ); strcat(mail_data, temp_str); strcpy(temp_str, Happy new year! ); strcat(mail_data, temp_str); mail_data CCS-C strcat(mail_data, something more ) mail_data CCS-C C CCS-C 10
void sendemail_to_smtpserver(void) if (!tcpclienttask.isrunning ) // client task if ( arp.rtcpserver_ok ) // --- SMTP --- \r\n --- // sprintf( mail_sender, "s919204@mail.yzu.edu.tw\r\n" ); sprintf( mail_recipient, "s919204@mail.yzu.edu.tw\r\n" ); // --- SMTP --- - \r\n? -- // sprintf( mail_subject, "Subject36.14: Something happened at %02u:%02u:%02u\r\n", clock.hour,clock.min,clock.sec); // --- SMTP --- ---------------------------- // sprintf( mail_data, "Analog input, AN0 = %lu\r\n", read_analog(0) ); mail_state = MAIL_INIT; // e-mail state machine, start up condition tcpipheader.rem_ip = rtcpserver.ip; // IP tcpipheader.rem_port = rtcpserver.port; // PORT tcpipheader.loc_port = mypic.tcpclient.port; // PORT bios_connectremotehost(); // sendout a request to remote host else putc('!'); // arp.rtcpserver_ok => failed! else putc('?'); // client task is still running! 11. sendemail_to_smtpserver() dosmtpsendemail() 12 pic_server_email.c SMTP server SMTP HELO localnet MAIL FROM RCPT TO DATA QUIT dohousekeeping() 13 TCP E-mail dotcpclienthousekeeping() 14 pic_server.c TCP E-mail 11
void dosmtpsendemail(void) char c, e; if ( nic_getc(&c) ) #if DEBUG_MAIL printf("\r\nsmtp_server: "); while (nic_getc(&e) && e!='\n') #else while (nic_getc(&e) && e!='\n'); #endif if (e!= '\n') putc('!'); else if (c == '2' ) if putc(c); putc(e); (mail_state == MAIL_INIT) printf(nic_putc,"helo localnet\r\n"); else if(mail_state == MAIL_HELO)printf(nic_putc,"MAIL FROM: ");print_sender(); else if (mail_state == MAIL_FROM)printf(nic_putc,"RCPT TO: "); print_recipient(); else if (mail_state == MAIL_TO ) printf(nic_putc,"data\r\n"); else if (mail_state == MAIL_END ) printf(nic_putc,"quit\r\n"); else if (mail_state!= MAIL_QUIT) mail_state--; mail_state++; else if (c == '3') if (mail_state == MAIL_DATA) printf(nic_putc,"from: ");print_sender(); printf(nic_putc,"to: "); print_recipient(); printf(nic_putc,"%s", mail_subject ); // // printf(nic_putc,"%s", mail_type ); // printf(nic_putc,"%s", mail_data ); // printf(nic_putc,"\r\n.\r\n"); mail_state++; // <CRLF>.<CRLF> else mail_state = MAIL_DONE; printf("\r\ne-mail failed!\r\n"); if (mail_state == MAIL_DONE)printf("\r\nE-mail done.\r\n");tcpclienttask.action=tfin+tack; 12. dosmtpsendemail() 12
void dohousekeeping (void) SYSLED = time.tick > 1000; nic_check_error(); dotcpclienthousekeeping(); // LED if( (mail_state &&!tcpclienttask.isrunning) // timeout? mail_state == MAIL_DONE ) // or finished. mail_state = MAIL_IDLE; tcpclienttask.isrunning = 0; 13. dohousekeeping() void dotcpclienthousekeeping(void) // called by dohousekeeping() in main() if( tcpclienttask.isrunning ) if( tcpclienttask.flag_2_resend ) tcpclienttask.flag_2_resend= 0; putc('>'); // tcpclienttask.ncountsresend++; bios_resendtcpsegment(); // socket 5 if((mail_state && tcpclienttask.ncountsresend > MAIL_TIMEOUT) // (!mail_state && tcpclienttask.ncountsresend > TCP_TIMEOUT) ) tcpclienttask.state = TCP_CLIENT_IDLE; tcpclienttask.ncountsresend = 0; tcpclienttask.isrunning = 0; putc('!'); // 14. dotcpclienthousekeeping() PIC_SERVER PIC_SERVER 10 E-mail 10 40 E-mail 13