SMTPCLI.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:5k
源码类别:

操作系统开发

开发平台:

DOS

  1. #include <rtos.h>
  2. #include <net.h>
  3. #include <stdio.h>
  4. #include <ctype.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <time.h>
  8. #define SMTPHOST   "SMTP.HOSTNAME"
  9. #define SMTPGATE   "SMTP.GATEWAY"
  10. #define SMTPLOG    "SMTP.LOG"
  11. static DWORD defaultgate = 0L;
  12. static char *hostname = NULL;
  13. static char *smtplogfile = NULL;
  14. static void (*oldinit)(char*,char*);
  15. static void newinit( char *directive, char *value )
  16. {
  17.     if (!stricmp( directive, SMTPHOST ))
  18.         hostname = kstrdup( value );
  19.     else if (!stricmp( directive, SMTPLOG ))
  20.         smtplogfile = kstrdup( value );
  21.     else if (!stricmp( directive, SMTPGATE ))
  22.         defaultgate = inet_addr( value );
  23.     else
  24.         if (oldinit) (*oldinit)( directive, value );
  25. }
  26. static void (*oldpost)(void);
  27. static void newpostinit( void )
  28. {
  29.     char *buffer;
  30.     buffer = kcalloc( 128 , 1 );
  31.     if ( hostname == NULL ) {
  32. #ifdef __DJGPP__   /* using Watt-32 lib */
  33.         if (reverse_resolve_ip4 (gethostid(), buffer))
  34. #else
  35.         if ( reverse_addr_lookup( gethostid(), buffer ))
  36. #endif
  37.             hostname = kstrdup( buffer );
  38.         else
  39.             rt_halt("no hostname set, smtp.hostname=... in TCP.CFG and reverse addr lookup failed");
  40.     }
  41.     kfree( buffer );
  42.     if ( oldpost ) (*oldpost)();
  43. }
  44. #ifdef __DJGPP__
  45. __attribute__((constructor))
  46. #endif
  47. static void smtp_init( void )
  48. {
  49.     oldinit = usr_init;
  50.     usr_init = newinit;
  51.     oldpost = usr_post_init;
  52.     usr_post_init = newpostinit;
  53. }
  54. #if defined(__TURBOC__) || defined(__BORLANDC__)
  55. #pragma startup smtp_init 100
  56. #endif
  57. static void smtplog( char *direction, char *value )
  58. {
  59.     FILE *f;
  60.     if ( smtplogfile != NULL ) {
  61.         dos_enter();
  62.         if ( (f = fopen( smtplogfile, "at")) != NULL ) {
  63.             fprintf( f, "%s %sn", direction, value );
  64.             fclose( f );
  65.         }
  66.         dos_exit();
  67.     }
  68. }
  69. static int getres( tcp_Socket *s, char *buffer )
  70. {
  71.     buffer[3] = 0;
  72.     do {
  73.         if ( tcp_tick( s ) == NULL ) return( 600 );
  74.         if ( !sock_dataready( s ) ) continue;
  75.         sock_gets( s, buffer, 128 );
  76.     } while ( buffer[3] != ' ');
  77.     smtplog( "<<<", buffer );
  78.     return( atoi( buffer ));
  79. }
  80. static void sendline( tcp_Socket *s, char *cmd, char *arg1, char *arg2 )
  81. {
  82.     char buffer[ 128 ];
  83.     if ( tcp_tick( s ) == NULL ) return;
  84.     strcpy( buffer, cmd );
  85.     if ( arg1 != NULL ) strcat( buffer, arg1 );
  86.     if ( arg2 != NULL ) strcat( buffer, arg2 );
  87.     sock_puts( s, buffer );
  88.     smtplog( ">>>", buffer );
  89. }
  90. #define SMTPPORT 25
  91. int smtp_client( DWORD host, char *from, char *to, char *subject, char *msg )
  92. {
  93.     int x;
  94.     tcp_Socket *s;
  95.     char buffer[ 256 ];
  96.     int result = -1;
  97.     s = kcalloc( sizeof( tcp_Socket ), 1 );
  98.     if ( s == NULL ) return( -4 );
  99.     if ( host == 0 ) host = defaultgate;
  100.     if ( host == 0 ) rt_halt("no smtp gateway set (smtp.gateway=... in TCP.CFG)");
  101.     if ( hostname == NULL )
  102.         rt_halt("no hostname set for SMTP");
  103.     if ( ! tcp_open( s, 0, host , SMTPPORT, NULL )) return( -3 );
  104.     sock_mode( s, TCP_MODE_ASCII );
  105.     while ( 1 ) {
  106.         /* expect 220 welcome */
  107.         if ( getres( s, buffer ) != 220 ) break;
  108.         sendline( s, "HELO ", hostname, NULL );
  109.         if ( getres( s , buffer ) != 250 ) break;
  110.         strcpy( buffer, from );
  111.         if ( strchr( buffer, '@')== NULL ) {
  112.             strcat( buffer, "@");
  113.             strcat( buffer, hostname );
  114.         }
  115.         sendline( s, "mail from: <", buffer, ">" );
  116.         if ( getres( s, buffer ) != 250 ) break;
  117.         strcpy( buffer, to );
  118.         if ( strchr( buffer, '@') == NULL ) {
  119.             strcat( buffer, "@");
  120.             strcat( buffer, hostname );
  121.         }
  122.         sendline( s, "rcpt to: <", buffer, ">" );
  123.         if ( getres( s, buffer ) != 250 ) break;
  124.         sendline( s, "data", NULL, NULL );
  125.         if ( getres( s, buffer ) != 354 ) break;
  126.         if ( strchr( from , '@'))
  127.             sendline( s, "From: ", from, NULL);
  128.         sendline( s, "To: ", to , NULL );
  129.         sendline( s, "Subject: ", subject, NULL );
  130.         smtplog( ">>>", "...message body...");
  131.         sock_puts( s, "");
  132.         sock_puts( s, msg);
  133.         sock_puts(s,".");
  134.         if ( getres( s, buffer ) == 250 ) result = 0;
  135.         break;
  136.     }
  137.     sendline( s, "QUIT", NULL, NULL );
  138.     getres( s, buffer );
  139.     sock_close( s );
  140.     sock_wait_closed( s, 3, NULL, &x );
  141. sock_err:
  142.     sock_abort( s );
  143.     kfree( s );
  144.     return( result );
  145. }