Re: Email function using c instead of tclu

From: Christoph Haller <ch(at)rodos(dot)fzk(dot)de>
To: uzo(at)beya-records(dot)com (beyaRecords - The home Urban music)
Cc: pgsql-sql(at)postgresql(dot)org
Subject: Re: Email function using c instead of tclu
Date: 2004-01-16 10:01:08
Message-ID: 200401160901.KAA09998@rodos
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

>
> 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 int4
AS '/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;

}

In response to

Browse pgsql-sql by date

  From Date Subject
Next Message Philippe Lang 2004-01-16 11:30:56 sql query with join and parameter in postgresql function
Previous Message Thomas Wegner 2004-01-16 09:39:17 Problem with LEFT JOIN