I'm working on a HP-UX system, so some of the
following has to be adapted, but in principle
it's the same on every system and it works.
First piece of code is a standalone program,
which you should always write and test before
you start creating C functions inside PostgreSQL.
Second piece is your sendemail function slightly
modified to make it run on my system.
When I do a
select sendemail('ch', 'was soll das?') ;
I'm receiving an email from postgres.
Regards, Christoph
First piece:
/*
cc -Aa -g -I/opt/pgsql/include/ -c sendemtest.c
cc sendemail.o sendemtest.o -o sendemtest
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "postgres.h"
void main() { char buf[1024]; int ln; text *res; text *to; int sendemail(text *email,text *message);
strcpy(buf,"Kissenminister Aussinger \n"); ln = strlen(buf); res = (text *) malloc(VARHDRSZ + ln); memset(res, 0,
VARHDRSZ+ ln); res->vl_len = VARHDRSZ + ln; memcpy(res->vl_dat, buf, (int) ln); strcpy(buf, "ch"); ln =
strlen(buf); to = (text *) malloc(VARHDRSZ + ln); memset(to, 0, VARHDRSZ + ln); to->vl_len = VARHDRSZ + ln;
memcpy(to->vl_dat,buf, (int) ln); sendemail(to, res);
}
Second piece:
/*
cc -Aa -g -I/opt/pgsql/include/ +z -c sendemail.c
ld -b -o sendemail.sl sendemail.o
CREATE FUNCTION sendemail(text,text) RETURNS int4AS '/fdsk2/users/ch/tools/pgsql.mydoc/sendemail.sl' LANGUAGE 'c';
DROP FUNCTION sendemail(text,text);
*/#include <stdio.h>#include <stdlib.h>#include "postgres.h"
int sendemail(text *email,text *message){ int result = 0 ;
char string_tosend [300];
sprintf(string_tosend,"/usr/bin/echo \"%s\" >/tmp/mailtmp.txt\n",VARDATA(message));
result += system(string_tosend);
sprintf(string_tosend,"/usr/bin/mail -dt %s </tmp/mailtmp.txt \n", VARDATA(email));
result += system(string_tosend);
result += system("/usr/bin/rm /tmp/mailtmp.txt");
return result;
}