source: trunk/src/libsrc/winnt/sendmail.c @ 2168

Revision 2168, 7.7 KB checked in by dietz, 14 years ago (diff)

Added argument to SendMail?() so user can specify the "From" field of
outgoing email. Defaults to %USERNAME%@%COMPUTERNAME% if a null pointer
or empty string is passed in the argument. Previously defaulted to
"root@mailserver".

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1
2/*
3 *   THIS FILE IS UNDER RCS - DO NOT MODIFY UNLESS YOU HAVE
4 *   CHECKED IT OUT USING THE COMMAND CHECKOUT.
5 *
6 *    $Id$
7 *
8 *    Revision history:
9 *     $Log$
10 *     Revision 1.6  2006/05/19 23:47:51  dietz
11 *     Added argument to SendMail() so user can specify the "From" field of
12 *     outgoing email. Defaults to %USERNAME%@%COMPUTERNAME% if a null pointer
13 *     or empty string is passed in the argument. Previously defaulted to
14 *     "root@mailserver".
15 *
16 *     Revision 1.5  2003/06/11 19:13:14  kohler
17 *     Increased BUFFSIZE from 200 to 250 in define statment.
18 *
19 *     Revision 1.4  2002/09/30 19:34:52  alex
20 *     changed 'printf' to 'logit'
21 *     Alex
22 *
23 *     Revision 1.3  2001/10/02 18:15:18  dietz
24 *     Changed to use COMPUTERNAME in the email sender field
25 *     instead of Earthworm.
26 *
27 *     Revision 1.2  2000/05/23 18:05:31  dietz
28 *     Changed blat sender to root@<MailHost>
29 *
30 *     Revision 1.1  2000/02/14 18:53:30  lucky
31 *     Initial revision
32 *
33 *
34 */
35
36     /*****************************************************************
37      *                            sendmail                           *
38      *                                                               *
39      *         Function to send email.  Windows NT version.          *
40      *                                                               *
41      *  This function requires a mail server computer.               *
42      *                                                               *
43      *  person:     List of email recipients                         *
44      *  nmail:      The number of recipients                         *
45      *  mailProg:   Mail program to use - for solaris compatibility  *
46      *  subject:    Subject of the message                           *
47      *  msg  :      The body of the email message                    *
48      *  msgPrefix : Prefix to the body of the message                *
49      *  msgSuffix : Suffix to the body of the message                *
50      *  mailServer: Computer that sends the mail message.            *
51      *                                                               *
52      *  Returns -1 if an error occurred, 0 otherwise                 *
53      *                                                               *
54      *  mailProg, subject, msgPrefix, and msgSuffix added by         *
55      *    Lucky Vidmar  Tue Jan 19 16:17:01 MST 1999                 *
56      *                                                               *
57      *****************************************************************/
58
59#include <string.h>
60#include <ctype.h>
61#include <stdio.h>
62#include <stdlib.h>
63#include <windows.h>
64#include <earthworm.h>
65
66#define BUFFSIZE 250
67
68static char Sender[BUFFSIZE];
69static int  SenderInit = 0;
70
71int SendMail( char person[][60], int nmail, char *mailProg, char *subject, 
72              char *msg, char *msgPrefix, char *msgSuffix, char *mailServer,
73              char *from )
74{
75   FILE                *fp;
76   DWORD               pathSize;
77   char                tmp[BUFFSIZE];
78   char                pathBuffer[BUFFSIZE];
79   char                tempFilename[MAX_PATH];
80   char                commandLine[BUFFSIZE*4];
81   STARTUPINFO         startUpInfo;
82   BOOL                success;
83   DWORD               priorityClass;
84   PROCESS_INFORMATION procInfo;
85   DWORD               exitCode;
86   DWORD               rc;
87   int                 i;
88
89/* Check arguments
90   ***************/
91   if ( nmail < 1 )  return -1;
92
93/* Do once: load Sender with thisuser@thiscomputer
94   ***********************************************/
95   if ( !SenderInit ) 
96   { 
97      char *user     = getenv( "USERNAME" );
98      char *computer = getenv( "COMPUTERNAME" );
99      int   len = strlen(user)+strlen(computer)+1;
100      if( len < BUFFSIZE )   sprintf( Sender, "%s@%s", user, computer );
101      else if( strlen(computer) < BUFFSIZE ) strcpy( Sender, computer );
102      else                                   strcpy( Sender, "nobody" );
103      SenderInit = 1;
104   }
105
106/* Get the path of the temporary file directory
107   ********************************************/
108   pathSize = GetTempPath( BUFFSIZE, pathBuffer );
109   if ( pathSize < BUFFSIZE )
110      pathBuffer[pathSize] = 0;
111   else
112   {
113      logit("","Error getting path of temporary file directory." );
114      return -1;
115   }
116
117/* Create a unique file in the temporary file directory
118   ****************************************************/
119   if ( GetTempFileName( pathBuffer, "mai", 0, tempFilename ) == 0 )
120   {
121      logit("","Error getting name of temporary file.\n" );
122      return -1;
123   }
124
125/* Write the mail message to the temporary file
126   ********************************************/
127   fp = fopen( tempFilename, "w" );
128   if ( fp == NULL )
129   {
130      logit("","Error opening the temporary file.\n" );
131      return -1;
132   }
133 
134   if (msgPrefix != NULL)
135       fputs( msgPrefix, fp );
136
137   fputs( msg, fp );
138
139   if (msgSuffix != NULL)
140       fputs( msgSuffix, fp );
141
142   fclose( fp );
143
144/* Build a command line for the Blat program, which sends
145   the temporary file to the mail server computer.
146   ******************************************************/
147   strcpy( commandLine, "blat " );
148   strcat( commandLine, tempFilename );
149
150   if( subject != NULL )
151   {
152       sprintf( tmp, " -s \"%s\"", subject );
153       strcat( commandLine, tmp );
154   }
155
156   strcat( commandLine, " -f " );
157   if( from && strlen(from)!=0 ) strcat( commandLine, from );
158   else                          strcat( commandLine, Sender );
159
160   strcat( commandLine, " -server " );
161   strcat( commandLine, mailServer );
162
163   strcat( commandLine, " -t " );
164   strcat( commandLine, &person[0][0] );
165   for ( i = 1; i < nmail; i++ )
166   {
167      strcat( commandLine, "," );
168      strcat( commandLine, &person[i][0] );
169   }
170
171   /* logit("","sendmail command line:\n.%s.\n",commandLine); */
172
173/* Invoked the Blat program
174   ************************/
175   GetStartupInfo( &startUpInfo );
176
177   priorityClass = GetPriorityClass( GetCurrentProcess() );
178
179   success = CreateProcess( 0,
180                            commandLine,      /* Command line to invoke child */
181                            0, 0,                   /* No security attributes */
182                            FALSE,                    /* No inherited handles */
183                            0 |                /* Child does not get a window */
184                            priorityClass,      /* Same as priority of parent */
185                            0,              /* Not passing environmental vars */
186                            0,                  /* Current dir same as parent */
187                            &startUpInfo,     /* Attributes of process window */
188                            &procInfo );       /* Attributes of child process */
189   if ( !success )
190   {
191      logit("","Error starting Blat: %d\n", GetLastError() );
192      return -1;
193   }
194
195/* Wait 5 minutes for Blat to complete.
196   Check the process exit code for abnormal termination.
197   ****************************************************/
198   rc = WaitForSingleObject( procInfo.hProcess, 300000 );
199
200   if ( rc == WAIT_FAILED )
201   {
202      logit("","Blat WaitForSingleObject() failed with error: %d\n", GetLastError() );
203      return -1;
204   }
205   if ( rc == WAIT_TIMEOUT )
206   {
207      logit("","Error. Blat not completed within 5 minutes.\n" );
208      return -1;
209   }
210   success = GetExitCodeProcess( procInfo.hProcess, &exitCode );
211   if ( !success )
212   {
213      logit("","Error getting the Blat exit code: %d\n", GetLastError() );
214      return -1;
215   }
216   if ( exitCode != 0 )
217   {
218      logit("","Blat failed.\n" );
219      return -1;
220   }
221
222/* Delete the mail file
223   ********************/
224   success = DeleteFile( tempFilename );
225   if ( !success )
226   {
227      logit("","Error deleting temporary file: %s\n", tempFilename );
228      return -1;
229   }
230
231/* Everything went smoothly
232   ************************/
233   return 0;
234}
235
Note: See TracBrowser for help on using the repository browser.