Thread: Email function using c instead of tclu

Email function using c instead of tclu

From
beyaRecords - The home Urban music
Date:
Hi,
I have tried without any success to get this pgmail for tclu resolved. 
Does anyone have or know of the same sort of function as pgmail but 
supporting c, as this is one of the installed languages I have access 
to under postgresql. So for instance:

CREATE FUNCTION sendemail(x,x)
....
LANGUAGE 'c';

regards


Uzo



Re: Email function using c instead of tclu

From
Christoph Haller
Date:
> 
> Hi,
> I have tried without any success to get this pgmail for tclu resolved. 
> Does anyone have or know of the same sort of function as pgmail but 
> supporting c, as this is one of the installed languages I have access 
> to under postgresql. So for instance:
> 
> CREATE FUNCTION sendemail(x,x)
> ....
> LANGUAGE 'c';
> 
> regards
> 
> 
> Uzo
> 
> 
Pretty late and pretty old stuff of mine (Sep 19  2001) 
but it should still work or at least give you some hint. 

Regards, Christoph


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;

}