Mailer kommented
git-svn-id: file:///home/jan/tmp/wetterstation/trunk@43 dd492736-c11a-0410-ad51-8c26713eaf7f
This commit is contained in:
parent
b9c6d9761a
commit
2268f06d6e
|
|
@ -3,6 +3,8 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <libesmtp.h>
|
#include <libesmtp.h>
|
||||||
|
#include <auth-client.h>
|
||||||
|
#include <openssl/ssl.h>
|
||||||
#include "definitions.h"
|
#include "definitions.h"
|
||||||
#include "mailer.h"
|
#include "mailer.h"
|
||||||
|
|
||||||
|
|
@ -12,11 +14,14 @@
|
||||||
#define CC_LINE "Cc: "
|
#define CC_LINE "Cc: "
|
||||||
#define BCC_LINE "Bcc: "
|
#define BCC_LINE "Bcc: "
|
||||||
|
|
||||||
|
/* Test */
|
||||||
FILE * ft = NULL;
|
FILE * ft = NULL;
|
||||||
char *bufft = NULL;
|
char *bufft = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
/* Funktionen */
|
||||||
static int build_header( address_struct *, address_struct *, address_struct *, address_struct *, char *, FILE *);
|
static int build_header( address_struct *, address_struct *, address_struct *, address_struct *, char *, FILE *);
|
||||||
char * gen_from_mailbox();
|
static char * gen_from_mailbox();
|
||||||
static char * gen_address_line(char *, const char *, address_struct *);
|
static char * gen_address_line(char *, const char *, address_struct *);
|
||||||
static const char *read_mail_tmp_file (void **, int *, void *);
|
static const char *read_mail_tmp_file (void **, int *, void *);
|
||||||
static int add_recipients(smtp_message_t , address_struct *);
|
static int add_recipients(smtp_message_t , address_struct *);
|
||||||
|
|
@ -24,139 +29,157 @@ static int add_recipients(smtp_message_t , address_struct *);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Funktion zum versenden von Mails */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int mail_message(address_all_struct *addresses, char *subject, int eightbit, mail_linereader_cb line_read_cb){
|
int mail_message(address_all_struct *addresses, char *subject, int eightbit, mail_linereader_cb line_read_cb){
|
||||||
FILE *fd = NULL;
|
|
||||||
int i;
|
FILE *fd = NULL; /* Zeiger auf Temporaere Datei */
|
||||||
char *buf;
|
int i; /* Laufvariable */
|
||||||
smtp_session_t session;
|
char *buf; /* Puffer zum anlegen der temp. Datei */
|
||||||
smtp_message_t message;
|
smtp_session_t session; /* SMTP - Session */
|
||||||
const smtp_status_t *status;
|
smtp_message_t message; /* SMTP - Message */
|
||||||
|
const smtp_status_t *status; /* Uebertragungsstatus */
|
||||||
|
|
||||||
if((fd = tmpfile()) == NULL)
|
if((fd = tmpfile()) == NULL) /* Temporäre Datei anlegen */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(addresses->from == NULL){
|
if(addresses->from == NULL){ /* Wenn absenderstruktur nicht gesetzt ist */
|
||||||
addresses->from = malloc(sizeof(address_struct));
|
addresses->from = malloc(sizeof(address_struct)); /* Dann speicher allokieren */
|
||||||
addresses->from->mailbox = NULL;
|
addresses->from->mailbox = NULL; /* struktur initialisieren (NULL-Pointer als addresse) */
|
||||||
addresses->from->next = NULL;
|
addresses->from->next = NULL; /* nachfolgezeiger auf NULL setzen (gibt eh nur einen absender) */
|
||||||
}
|
|
||||||
if(addresses->from->mailbox == NULL){
|
|
||||||
addresses->from->mailbox = gen_from_mailbox();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
build_header(addresses->from, addresses->to, addresses->cc, addresses->bcc, subject, fd);
|
if(addresses->from->mailbox == NULL){ /* Wenn Absenderaddresse nicht gesetzt */
|
||||||
|
addresses->from->mailbox = gen_from_mailbox(); /* Dann eine Addresse nach dem schema user@host generieren */
|
||||||
|
}
|
||||||
|
|
||||||
|
build_header(addresses->from, addresses->to, addresses->cc, addresses->bcc, subject, fd); /* Header in die Temporäre Datei schreiben */
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
while((buf = line_read_cb(i)) != NULL){
|
while((buf = line_read_cb(i)) != NULL){ /* Solange die Callbackfunktion einen Zeiger auf einen Puffer liefert */
|
||||||
fputs(buf, fd);
|
fputs(buf, fd); /* Schreibe dessen Inhalt in eine Datei */
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((session = smtp_create_session()) == NULL)
|
if((session = smtp_create_session()) == NULL) /* SMTP - Session erstellen */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(!smtp_set_server(session, "atlantis.wh2.tu-dresden.de:25"))
|
if(!smtp_set_server(session, "atlantis.wh2.tu-dresden.de:25")) /* Den Server für die Übertragung setzen */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if((message = smtp_add_message(session)) == NULL)
|
if((message = smtp_add_message(session)) == NULL) /* Eine Nachicht zur Session hinzufügen */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(! smtp_set_reverse_path(message,addresses->from->mailbox))
|
if(! smtp_set_reverse_path(message,addresses->from->mailbox)) /* Absenderaddresse setzen */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(!smtp_set_messagecb(message, read_mail_tmp_file, fd))
|
if(!smtp_set_messagecb(message, read_mail_tmp_file, fd)) /* Callback - Funktion zum lesen der temp. Datei */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(!(add_recipients(message, addresses->to) && add_recipients(message, addresses->cc) && add_recipients(message, addresses->bcc) ) )
|
if(!(add_recipients(message, addresses->to) && add_recipients(message, addresses->cc) && add_recipients(message, addresses->bcc) ) ) /* Empfänger setzen */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(!smtp_start_session(session))
|
if(!smtp_start_session(session)) /* Session Starten (Mail versenden) */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
status = smtp_message_transfer_status (message);
|
status = smtp_message_transfer_status (message); /* uebertragungsstatus holen */
|
||||||
DEBUGOUT3( "SMTP sending: %d %s", status->code, status->text);
|
DEBUGOUT3( "SMTP sending: %d %s", status->code, status->text); /* und anzeigen */
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Baut den Mail-header zusammen */
|
/* Baut den Mail-header zusammen
|
||||||
|
* from ist die Liste mit den Absenderaddressen (sollte nur eine sein)
|
||||||
|
* to ist diie Liste der Emfaenger
|
||||||
|
* cc ist die Liste der CC - Empfaenger
|
||||||
|
* bcc iste die Liste der BCC - Empfaenger
|
||||||
|
* subject ist der Betreff der Mail
|
||||||
|
* fd ist der Zeiger auf die temp. Datei */
|
||||||
static int build_header(address_struct * from, address_struct *to, address_struct *cc, address_struct *bcc, char *subject, FILE *fd){
|
static int build_header(address_struct * from, address_struct *to, address_struct *cc, address_struct *bcc, char *subject, FILE *fd){
|
||||||
char *buf;
|
char *buf; /* Puffer für die Zeilen */
|
||||||
if(from == NULL || to == NULL || fd == NULL){
|
if(from == NULL || to == NULL || fd == NULL){ /* wenn absender, Empfaenger oder Dateizeiger NULL */
|
||||||
return 0;
|
return 0; /* Dann abbrechen */
|
||||||
}
|
}
|
||||||
buf = malloc(sizeof(char)*BUFFSIZE);
|
buf = malloc(sizeof(char)*BUFFSIZE); /* Speicher für Puffer holen */
|
||||||
fprintf(fd, "From: %s\r\n", from->mailbox);
|
|
||||||
fputs(gen_address_line(buf, TO_LINE, to), fd);
|
fprintf(fd, "From: <%s>\r\n", from->mailbox); /* Absender setzen */
|
||||||
fputs(gen_address_line(buf, CC_LINE, cc), fd);
|
fputs(gen_address_line(buf, TO_LINE, to), fd); /* To setzen */
|
||||||
fputs(gen_address_line(buf, BCC_LINE, bcc), fd);
|
fputs(gen_address_line(buf, CC_LINE, cc), fd); /* Cc setzen */
|
||||||
fprintf(fd, "Subject: %s\r\n", subject);
|
fputs(gen_address_line(buf, BCC_LINE, bcc), fd); /* Bcc setzen */
|
||||||
fputs("Reply-To:\r\n\r\n", fd);
|
fprintf(fd, "Subject: %s\r\n", subject); /* Betreff setzen */
|
||||||
free(buf);
|
fputs("Reply-To:\r\n\r\n", fd); /* Reply-To + Leerzeile anhängen */
|
||||||
|
|
||||||
|
free(buf); /* Puffer freigeben */
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Baut eine neue Absenderaddresse nach der Form user@host */
|
/* Baut eine neue Absenderaddresse nach der Form user@host */
|
||||||
#define MAXHOSTNAMELEN 256
|
#define MAXHOSTNAMELEN 256
|
||||||
char * gen_from_mailbox(){
|
static char * gen_from_mailbox(){
|
||||||
char *host, *user, *new_from;
|
char *host, *user, *new_from;
|
||||||
|
|
||||||
host = malloc(sizeof(char)*MAXHOSTNAMELEN);
|
host = malloc(sizeof(char)*MAXHOSTNAMELEN); /* Speicher fuer den Hostnamen holen */
|
||||||
user = getlogin();
|
user = getlogin(); /* den Usernamen holen */
|
||||||
gethostname(host, MAXHOSTNAMELEN);
|
gethostname(host, MAXHOSTNAMELEN); /* den Hostnamen holen */
|
||||||
|
|
||||||
new_from = malloc(sizeof(char)*(MAXHOSTNAMELEN + strlen(user) + 10));
|
new_from = malloc(sizeof(char)*(MAXHOSTNAMELEN + strlen(user) + 10)); /* Speicher fuer die gesammtaddresse belegen */
|
||||||
snprintf(new_from, (MAXHOSTNAMELEN + strlen(user) + 10), "%s@%s",user,host);
|
snprintf(new_from, (MAXHOSTNAMELEN + strlen(user) + 10), "%s@%s",user,host); /* gesammtaddresse zusammenbauen */
|
||||||
|
|
||||||
free(host);
|
free(host); /* den speicher der den hostnamen beinhaltete freigeben */
|
||||||
return new_from;
|
return new_from;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char * gen_address_line(char *buf, const char *line_type, address_struct *address){
|
|
||||||
address_struct *addr = address;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
strcpy(buf, line_type);
|
/* Eine Zeile mit addressen generieren
|
||||||
for(; addr; addr = addr->next){
|
* buff ist der Puffer fuer die Zeile
|
||||||
if(i){
|
* line_type ist eine der Konstanten TO_LINE, CC_LINE oder BCC_LINE
|
||||||
buf = strcat(buf, ", ");
|
* address sind die Addressen fuer die Zeile */
|
||||||
}
|
static char * gen_address_line(char *buf, const char *line_type, address_struct *address){
|
||||||
buf = strcat(buf, addr->mailbox);
|
address_struct *addr = address; /* Temporärer Zeiger */
|
||||||
i++;
|
int i = 0 ; /* zum unterscheiden, ob die erste Addresse oder nicht */
|
||||||
|
|
||||||
|
strcpy(buf, line_type); /* Das Keyword ('To: ', 'Cc: ', ...) an den Zeilenanfang setzen */
|
||||||
|
for(; addr; addr = addr->next){ /* Addressen durchlaufen */
|
||||||
|
if(i) /* Wenn nicht erste Addresse... */
|
||||||
|
strcat(buf, ", "); /* dann ein ', ' davorsetzen */
|
||||||
|
|
||||||
|
strcat(buf, "<"); /* '<' setzen (va Addressen in <> eingeschlossen sind) */
|
||||||
|
strcat(buf, addr->mailbox); /* addresse in den puffer schreiben */
|
||||||
|
strcat(buf, ">"); /* '>' dahintersetzen */
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
buf = strcat(buf, "\r\n");
|
strcat(buf, "\r\n"); /* Wagenrücklauf + Zeilenvorschub anhängen */
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Mail aus temporärer Datei lesen (Callbackfkt.)
|
||||||
|
* buf ist ein Zeiger auf einen Zeichenpuffer
|
||||||
|
* len ist NULL (dann rewind des Files) oder nicht NULL (dann Daten lesen)
|
||||||
|
* arg ist der Zeiger auf die temp. Datei */
|
||||||
static const char *read_mail_tmp_file (void **buf, int *len, void *arg){
|
static const char *read_mail_tmp_file (void **buf, int *len, void *arg){
|
||||||
int octets;
|
int octets; /* Anzahl der Zeichen die gelesen wurden */
|
||||||
|
|
||||||
if (*buf == NULL)
|
if (*buf == NULL) /* Wenn Puffer noch nicht initialisiert */
|
||||||
*buf = malloc (BUFFSIZE);
|
*buf = malloc (BUFFSIZE); /* Dann speicher dafuer allokieren */
|
||||||
|
|
||||||
if (len == NULL) {
|
if (len == NULL) { /* Wenn len NULL */
|
||||||
rewind ((FILE *) arg);
|
rewind ((FILE *) arg); /* Dann die Datei 'zuruechspulen */
|
||||||
return NULL;
|
return NULL; /* und NULL zurueckgeben */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fgets (*buf, BUFFSIZE - 2, (FILE *) arg) == NULL) {
|
if (fgets (*buf, BUFFSIZE - 2, (FILE *) arg) == NULL) { /* Wenn keine Daten mehr im File */
|
||||||
octets = 0;
|
octets = 0; /* dann gelesene Zeichen auf 0 setzen */
|
||||||
}
|
} else { /* Ansonsten */
|
||||||
else {
|
char *p = strchr (*buf, '\0'); /* Das Terminierungszeichen suchen */
|
||||||
char *p = strchr (*buf, '\0');
|
|
||||||
|
|
||||||
if (p[-1] == '\n' && p[-2] != '\r') {
|
if (p[-1] == '\n' && p[-2] != '\r') { /* Wenn kein Wagenruecklauf */
|
||||||
strcpy (p - 1, "\r\n");
|
strcpy (p - 1, "\r\n"); /* dann einen ergänzen */
|
||||||
p++;
|
p++; /* und den String ein Zeichen länger machen */
|
||||||
}
|
}
|
||||||
octets = p - (char *) *buf;
|
octets = p - (char *) *buf; /* Gelesene Zeichen berechnen */
|
||||||
}
|
}
|
||||||
|
|
||||||
*len = octets;
|
*len = octets;
|
||||||
|
|
@ -164,11 +187,14 @@ static const char *read_mail_tmp_file (void **buf, int *len, void *arg){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Empfaenger zu einer Mail hinzufügen
|
||||||
|
* message ist die SMTP - Message
|
||||||
|
* address ist die Liste mit den Empfaengeraddressen */
|
||||||
static int add_recipients(smtp_message_t message, address_struct *address){
|
static int add_recipients(smtp_message_t message, address_struct *address){
|
||||||
address_struct *adr = address;
|
address_struct *adr = address; /* Temp. Zeiger auf die Addressen */
|
||||||
for(; adr; adr = adr->next){
|
for(; adr; adr = adr->next){ /* Addressen durchgehen */
|
||||||
if(adr->mailbox){
|
if(adr->mailbox){ /* Wenn eine gueltige gefunden */
|
||||||
if(!smtp_add_recipient(message, adr->mailbox))
|
if(!smtp_add_recipient(message, adr->mailbox)) /* Dann hinzufügen */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -191,10 +217,10 @@ main(char argc[], int arglen){
|
||||||
address_struct *to, *cc, *bcc;
|
address_struct *to, *cc, *bcc;
|
||||||
to = malloc(sizeof(address_struct));
|
to = malloc(sizeof(address_struct));
|
||||||
to->mailbox = "losinski@wh2.tu-dresden.de";
|
to->mailbox = "losinski@wh2.tu-dresden.de";
|
||||||
//to->next = NULL;
|
to->next = NULL;
|
||||||
to->next = malloc(sizeof(address_struct));
|
/* to->next = malloc(sizeof(address_struct));
|
||||||
to->next->mailbox = "jooschi@wh2.tu-dresden.de";
|
to->next->mailbox = "jooschi@wh2.tu-dresden.de";
|
||||||
to->next->next = NULL;
|
to->next->next = NULL;*/
|
||||||
cc = malloc(sizeof(address_struct));
|
cc = malloc(sizeof(address_struct));
|
||||||
cc->mailbox = "losinski@wh2.tu-dresden.de";
|
cc->mailbox = "losinski@wh2.tu-dresden.de";
|
||||||
cc->next = NULL;
|
cc->next = NULL;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue