#define SQL_TEXT Latin_Text
#include <sqltypes_td.h>
#include <stdio.h>
#include <stdlib.h>
/******************************************************************/
/* exec sendmail to send the mail. It returns -1 if it failed. */
/******************************************************************/
static int send_to_system(char *mail_msg, int from_addr)
{
char c;
char *mailcmd;
FILE *mailhndl;
/*********************************/
/* sets up the send mail command */
/*********************************/
/* If the caller did not provide a from user then supply ""mailmgr" */
if (from_addr == -1)
mailcmd = "/usr/sbin/sendmail -oi -f mailmgr -oem -t";
else
mailcmd = "/usr/sbin/sendmail -oi -oem -t";
/* Execute the send mail command */
mailhndl = (FILE *) popen(mailcmd, "w");
/* If the handle is not null then at least it took it */
if (mailhndl == NULL)
return -1;
/* Pipe the message otherwise there is not going to be any mail */
while ((c= *mail_msg++) != 0)
putc(c,mailhndl);
/* sent the whole message- close the pipe to let it know we are done */
pclose(mailhndl);
return 0;
}
/*********************************/
/* The External Stored Procedure */
/*********************************/
void tdmail( VARCHAR_LATIN *From, /* who it is from */
VARCHAR_LATIN *To, /* For who Name@domain from */
VARCHAR_LATIN *Subject, /* Need a subject */
VARCHAR_LATIN *Message, /* What you want to say */
int *i_from,
int *i_to,
int *i_subject,
int *i_message,
char sqlstate[6],
SQL_TEXT extname[129],
SQL_TEXT specific_name[129],
SQL_TEXT error_message[257])
{
char *mailbuf;
int status;
char *from_usr;
char *subject_usr;
char *message_usr;
/* Format the email into standard form for mail. */
/* If there is no "TO" address then it is not going anywhere. */
/* There might me other problems. We probably should check for a */
/* properly formated sender address of the form <name>@<domain>. */
if (*i_to == -1)
{
strcpy((char *) sqlstate, "U0001");
strcpy((char *) error_message, "There is no 'To' address");
return;
}
/* If no "FROM" user, then use mailmgr. */
if (*i_from == -1)
from_usr = "mailmgr";
else
from_usr = (char *) From;
/* No subject. Just substitute or make one up. */
if (*i_subject == -1)
subject_usr = "<no subject>";
else
subject_usr = (char *) Subject;
/* No message. Just make one up. */
if (*i_message == -1)
message_usr = "<Empty Message>";
else
message_usr = (char *) Message;
/* Need to allocate memory to hold formated message. */
mailbuf = FNC_malloc(strlen(From)+
strlen(To) +
strlen(Subject)+
strlen(Message)+ 1000);
/* This will format it. The assumption is that the message */
/* part is already formatted with returns and the like. */
sprintf(mailbuf,
"From: %s\nTo: %s\nSubject: %s\n\n%s\n\0",
from_usr,
To,
subject_usr,
message_usr);
/* Call sendmail to send it off. */
status = send_to_system(mailbuf, *i_from);
FNC_free(mailbuf);
/* Well we got an error back. At this point just send a warning. */
if (status < 0)
{
strcpy(sqlstate, "01H001");
strcpy((char *) error_message, "Error: mail not sent");
}
}