Added some error-handling to the mailer
git-svn-id: file:///home/jan/tmp/wetterstation/trunk@47 dd492736-c11a-0410-ad51-8c26713eaf7f
This commit is contained in:
parent
d50e20977b
commit
747241658b
|
|
@ -52,9 +52,6 @@ static int add_recipients(smtp_message_t , address_struct *);
|
||||||
static void event_cb (smtp_session_t , int , void *,...);
|
static void event_cb (smtp_session_t , int , void *,...);
|
||||||
static int default_auth_cb (auth_client_request_t , char **, int , void *);
|
static int default_auth_cb (auth_client_request_t , char **, int , void *);
|
||||||
|
|
||||||
/* Variablen */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Funktion zum versenden von Mails */
|
/* Funktion zum versenden von Mails */
|
||||||
int mail_message(address_all_struct *addresses, char *subject, int eightbit, mail_linereader_cb line_read_cb, server_vars *servopts){
|
int mail_message(address_all_struct *addresses, char *subject, int eightbit, mail_linereader_cb line_read_cb, server_vars *servopts){
|
||||||
|
|
@ -70,7 +67,7 @@ int mail_message(address_all_struct *addresses, char *subject, int eightbit, ma
|
||||||
const smtp_status_t *status = NULL; /* Uebertragungsstatus */
|
const smtp_status_t *status = NULL; /* Uebertragungsstatus */
|
||||||
|
|
||||||
if(servopts == NULL)
|
if(servopts == NULL)
|
||||||
return 0;
|
return MAILER_STATUS_FAILTURE_SERVOPTS_MISSING;
|
||||||
|
|
||||||
if(addresses->from == NULL){ /* Wenn absenderstruktur nicht gesetzt ist */
|
if(addresses->from == NULL){ /* Wenn absenderstruktur nicht gesetzt ist */
|
||||||
addresses->from = malloc(sizeof(address_struct)); /* Dann speicher allokieren */
|
addresses->from = malloc(sizeof(address_struct)); /* Dann speicher allokieren */
|
||||||
|
|
@ -83,9 +80,10 @@ int mail_message(address_all_struct *addresses, char *subject, int eightbit, ma
|
||||||
}
|
}
|
||||||
|
|
||||||
if((fd = tmpfile()) == NULL) /* Temporäre Datei anlegen */
|
if((fd = tmpfile()) == NULL) /* Temporäre Datei anlegen */
|
||||||
return 0;
|
return MAILER_STATUS_FAILTURE_TEMPFILE_CREATE;
|
||||||
|
|
||||||
build_header(addresses->from, addresses->to, addresses->cc, addresses->bcc, subject, fd); /* Header in die Temporäre Datei schreiben */
|
if(!build_header(addresses->from, addresses->to, addresses->cc, addresses->bcc, subject, fd)) /* Header in die Temporäre Datei schreiben */
|
||||||
|
return MAILER_STATUS_FAILTURE_CREATE_HEADER;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
while((buf = line_read_cb(i)) != NULL){ /* Solange die Callbackfunktion einen Zeiger auf einen Puffer liefert */
|
while((buf = line_read_cb(i)) != NULL){ /* Solange die Callbackfunktion einen Zeiger auf einen Puffer liefert */
|
||||||
|
|
@ -94,7 +92,7 @@ int mail_message(address_all_struct *addresses, char *subject, int eightbit, ma
|
||||||
}
|
}
|
||||||
|
|
||||||
if((session = smtp_create_session()) == NULL) /* SMTP - Session erstellen */
|
if((session = smtp_create_session()) == NULL) /* SMTP - Session erstellen */
|
||||||
return 0;
|
return MAILER_STATUS_FAILTURE_SESSION_CREATE;
|
||||||
|
|
||||||
switch (servopts->ssl_use) { /* gucken ob SSL benutzt werden soll */
|
switch (servopts->ssl_use) { /* gucken ob SSL benutzt werden soll */
|
||||||
case SSL_ENABLED:
|
case SSL_ENABLED:
|
||||||
|
|
@ -114,11 +112,11 @@ int mail_message(address_all_struct *addresses, char *subject, int eightbit, ma
|
||||||
DEBUGOUT2("SMTP: Send Mail over: \"%s\"\n",hostportstr);
|
DEBUGOUT2("SMTP: Send Mail over: \"%s\"\n",hostportstr);
|
||||||
|
|
||||||
if(!smtp_set_server(session, hostportstr)) /* Den Server fuer die Übertragung setzen */
|
if(!smtp_set_server(session, hostportstr)) /* Den Server fuer die Übertragung setzen */
|
||||||
return 0;
|
return MAILER_STATUS_FAILTURE_SETSERVER;
|
||||||
|
|
||||||
if (servopts->auth_use) { /* Wenn Authentifizierung eingeschaltet */
|
if (servopts->auth_use) { /* Wenn Authentifizierung eingeschaltet */
|
||||||
if ((authctx = auth_create_context ()) == NULL) /* Authentifizierungskontext erstellen */
|
if ((authctx = auth_create_context ()) == NULL) /* Authentifizierungskontext erstellen */
|
||||||
return 0;
|
return MAILER_STATUS_FAILTURE_CREATEAUTHCTX;
|
||||||
auth_set_mechanism_flags (authctx, AUTH_PLUGIN_PLAIN, 0); /* Plain-Text-Plugin auswählen */
|
auth_set_mechanism_flags (authctx, AUTH_PLUGIN_PLAIN, 0); /* Plain-Text-Plugin auswählen */
|
||||||
if(servopts->auth_cb == NULL){ /* wenn keine Callback-fkt. gesetzt */
|
if(servopts->auth_cb == NULL){ /* wenn keine Callback-fkt. gesetzt */
|
||||||
auth_set_interact_cb (authctx, default_auth_cb, servopts); /* dann die standart-fkt nehmen */
|
auth_set_interact_cb (authctx, default_auth_cb, servopts); /* dann die standart-fkt nehmen */
|
||||||
|
|
@ -126,32 +124,36 @@ int mail_message(address_all_struct *addresses, char *subject, int eightbit, ma
|
||||||
auth_set_interact_cb (authctx, servopts->auth_cb, servopts); /* die gegebene verwenden */
|
auth_set_interact_cb (authctx, servopts->auth_cb, servopts); /* die gegebene verwenden */
|
||||||
}
|
}
|
||||||
if (!smtp_auth_set_context (session, authctx)) /* Kontext der session übergeben */
|
if (!smtp_auth_set_context (session, authctx)) /* Kontext der session übergeben */
|
||||||
return 0;
|
return MAILER_STATUS_FAILTURE_SETAUTHCTX;
|
||||||
}
|
}
|
||||||
|
|
||||||
smtp_set_eventcb(session, event_cb, servopts); /* Callbackfunktion angeben, welche die Events der Verbindung (falsches Zertifikat, ..) hanhelt */
|
smtp_set_eventcb(session, event_cb, servopts); /* Callbackfunktion angeben, welche die Events der Verbindung (falsches Zertifikat, ..) hanhelt */
|
||||||
|
|
||||||
if((message = smtp_add_message(session)) == NULL) /* Eine Nachicht zur Session hinzufügen */
|
if((message = smtp_add_message(session)) == NULL) /* Eine Nachicht zur Session hinzufügen */
|
||||||
return 0;
|
return MAILER_STATUS_FAILTURE_ADDMESSAGE;
|
||||||
|
|
||||||
if(! smtp_set_reverse_path(message,addresses->from->mailbox)) /* Absenderaddresse setzen */
|
if(! smtp_set_reverse_path(message,addresses->from->mailbox)) /* Absenderaddresse setzen */
|
||||||
return 0;
|
return MAILER_STATUS_FAILTURE_SETREVPATH;
|
||||||
|
|
||||||
if(eightbit) /* Weinn eightbit-Flag gesetzt, */
|
if(eightbit) /* Weinn eightbit-Flag gesetzt, */
|
||||||
smtp_8bitmime_set_body(message, E8bitmime_8BITMIME); /* dann das auch in der libesmtp setzen */
|
smtp_8bitmime_set_body(message, E8bitmime_8BITMIME); /* dann das auch in der libesmtp setzen */
|
||||||
|
|
||||||
if(!smtp_set_messagecb(message, read_mail_tmp_file, fd)) /* Callback - Funktion zum lesen der temp. Datei */
|
if(!smtp_set_messagecb(message, read_mail_tmp_file, fd)) /* Callback - Funktion zum lesen der temp. Datei */
|
||||||
return 0;
|
return MAILER_STATUS_FAILTURE_SETMESSAGECB;
|
||||||
|
|
||||||
if(!(add_recipients(message, addresses->to) && add_recipients(message, addresses->cc) && add_recipients(message, addresses->bcc) ) ) /* Empfänger setzen */
|
if(!(add_recipients(message, addresses->to) && add_recipients(message, addresses->cc) && add_recipients(message, addresses->bcc) ) ) /* Empfänger setzen */
|
||||||
return 0;
|
return MAILER_STATUS_FAILTURE_ADDRECIPIENTS;
|
||||||
|
|
||||||
if(!smtp_start_session(session)) /* Session Starten (Mail versenden) */
|
if(!smtp_start_session(session)) /* Session Starten (Mail versenden) */
|
||||||
return 0;
|
return MAILER_STATUS_FAILTURE_STARTSESSION;
|
||||||
|
|
||||||
status = smtp_message_transfer_status (message); /* uebertragungsstatus holen */
|
status = smtp_message_transfer_status (message); /* uebertragungsstatus holen */
|
||||||
DEBUGOUT3( "SMTP: sending result: %d %s", status->code, status->text); /* und anzeigen */
|
DEBUGOUT3( "SMTP: sending result: %d %s", status->code, status->text); /* und anzeigen */
|
||||||
|
|
||||||
|
if (status->code < 200 || status->code > 299) {
|
||||||
|
return MAILER_STATUS_FAILTURE_SENDING;
|
||||||
|
}
|
||||||
|
|
||||||
/* aufräumen */
|
/* aufräumen */
|
||||||
if(fd != NULL)
|
if(fd != NULL)
|
||||||
fclose(fd);
|
fclose(fd);
|
||||||
|
|
@ -162,7 +164,7 @@ int mail_message(address_all_struct *addresses, char *subject, int eightbit, ma
|
||||||
if(authctx != NULL)
|
if(authctx != NULL)
|
||||||
auth_destroy_context(authctx);
|
auth_destroy_context(authctx);
|
||||||
|
|
||||||
return 1;
|
return MAILER_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -397,3 +399,35 @@ server_vars *get_default_servopts(){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *get_mail_status_text(int error_no){
|
||||||
|
switch (error_no){
|
||||||
|
case MAILER_STATUS_OK:
|
||||||
|
return "SMTP: Sending Ok";
|
||||||
|
case MAILER_STATUS_FAILTURE_SERVOPTS_MISSING:
|
||||||
|
return "SMTP: Server-options missing";
|
||||||
|
case MAILER_STATUS_FAILTURE_TEMPFILE_CREATE:
|
||||||
|
return "SMTP: Cannot create tempfile";
|
||||||
|
case MAILER_STATUS_FAILTURE_SESSION_CREATE:
|
||||||
|
return "SMTP: Cannot create Session";
|
||||||
|
case MAILER_STATUS_FAILTURE_SETSERVER:
|
||||||
|
return "SMTP: Cannot set server";
|
||||||
|
case MAILER_STATUS_FAILTURE_CREATEAUTHCTX:
|
||||||
|
return "SMTP: Cannot create authentification context";
|
||||||
|
case MAILER_STATUS_FAILTURE_SETAUTHCTX:
|
||||||
|
return "SMTP: Cannot set authentification context";
|
||||||
|
case MAILER_STATUS_FAILTURE_ADDMESSAGE:
|
||||||
|
return "SMTP: Cannot add message";
|
||||||
|
case MAILER_STATUS_FAILTURE_SETREVPATH:
|
||||||
|
return "SMTP: Cannot set from-address";
|
||||||
|
case MAILER_STATUS_FAILTURE_SETMESSAGECB:
|
||||||
|
return "SMTP: Cannot add message-callback";
|
||||||
|
case MAILER_STATUS_FAILTURE_ADDRECIPIENTS:
|
||||||
|
return "SMTP: Cannot add recipients";
|
||||||
|
case MAILER_STATUS_FAILTURE_STARTSESSION:
|
||||||
|
return "SMTP: Cannot start session";
|
||||||
|
case MAILER_STATUS_FAILTURE_SENDING:
|
||||||
|
return "SMTP: Failture while sending";
|
||||||
|
case MAILER_STATUS_FAILTURE_CREATE_HEADER:
|
||||||
|
return "SMTP: Cannot create header";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,18 +28,38 @@
|
||||||
|
|
||||||
#include <auth-client.h>
|
#include <auth-client.h>
|
||||||
|
|
||||||
#define SSL_ENABLED 0
|
/* SSL-Benutzung */
|
||||||
#define SSL_DISABLED 1
|
#define SSL_ENABLED 0 /* auf jeden Fall eingschaltet */
|
||||||
#define SSL_REQUIRED 2
|
#define SSL_DISABLED 1 /* Ausgeschaltet */
|
||||||
|
#define SSL_REQUIRED 2 /* Wenn benötigt */
|
||||||
|
|
||||||
#define SSL_ACCEPT 1
|
/* Zertifikat akzeptieren */
|
||||||
#define SSL_DECLINE 0
|
#define SSL_ACCEPT 1 /* Ja */
|
||||||
|
#define SSL_DECLINE 0 /* Nein */
|
||||||
|
|
||||||
#define AUTH_YES 1
|
/* Authentifizieren */
|
||||||
#define AUTH_NO 0
|
#define AUTH_YES 1 /* Ja */
|
||||||
|
#define AUTH_NO 0 /* Nein */
|
||||||
|
|
||||||
#define EINGHTBIT_Y 1
|
/* eightbit setzen */
|
||||||
#define EINGHTBIT_N 0
|
#define EINGHTBIT_Y 1 /* ja */
|
||||||
|
#define EINGHTBIT_N 0 /*nein */
|
||||||
|
|
||||||
|
/* Rueckgabestatus */
|
||||||
|
#define MAILER_STATUS_OK 0 /* Erfolgreich versandt */
|
||||||
|
#define MAILER_STATUS_FAILTURE_SERVOPTS_MISSING 1 /* Server-einstellungen fehlen */
|
||||||
|
#define MAILER_STATUS_FAILTURE_TEMPFILE_CREATE 2 /* Tempfile kann nicht angelegt werden */
|
||||||
|
#define MAILER_STATUS_FAILTURE_SESSION_CREATE 3 /* Session kann nicht erzeugt werden */
|
||||||
|
#define MAILER_STATUS_FAILTURE_SETSERVER 4 /* Server kann nicht gesetzt werden */
|
||||||
|
#define MAILER_STATUS_FAILTURE_CREATEAUTHCTX 5 /* Authentifizierungskontext kann nicht angelegt werden */
|
||||||
|
#define MAILER_STATUS_FAILTURE_SETAUTHCTX 6 /* Authentifizierungskontext kann nicht gesetzt werden */
|
||||||
|
#define MAILER_STATUS_FAILTURE_ADDMESSAGE 7 /* Message kann nicht hinzugefügt werden */
|
||||||
|
#define MAILER_STATUS_FAILTURE_SETREVPATH 8 /* Serveraddresse kann nicht gesetzt werden */
|
||||||
|
#define MAILER_STATUS_FAILTURE_SETMESSAGECB 9 /* Message-Callback-fkt kann nicht gesetzt werden */
|
||||||
|
#define MAILER_STATUS_FAILTURE_ADDRECIPIENTS 10 /* Empfaenger kkoennen nicht hinzugefügt werden */
|
||||||
|
#define MAILER_STATUS_FAILTURE_STARTSESSION 11 /* Session kann nicht gestartet werden */
|
||||||
|
#define MAILER_STATUS_FAILTURE_SENDING 12 /* Fehler beim senden */
|
||||||
|
#define MAILER_STATUS_FAILTURE_CREATE_HEADER 13 /* Header kann nicht gebaut werden */
|
||||||
|
|
||||||
|
|
||||||
/* Die Callback-fkt. zum lesen einer Zeile. das Argument ist die momentane Zeilennummer (beginnend bei 0) */
|
/* Die Callback-fkt. zum lesen einer Zeile. das Argument ist die momentane Zeilennummer (beginnend bei 0) */
|
||||||
|
|
@ -81,10 +101,15 @@ typedef struct server_vars_t {
|
||||||
* 2. Argument: Betreff der Nachicht
|
* 2. Argument: Betreff der Nachicht
|
||||||
* 3. Argument: eightbit-flag setzen oder nicht
|
* 3. Argument: eightbit-flag setzen oder nicht
|
||||||
* 4. Argument: Callback-Fkt. zum lesen einer Zeile
|
* 4. Argument: Callback-Fkt. zum lesen einer Zeile
|
||||||
* 5. Argument: Server-Einstellungen */
|
* 5. Argument: Server-Einstellungen
|
||||||
|
* gibt einen Statusnummer zurueck */
|
||||||
int mail_message(address_all_struct *, char *, int, mail_linereader_cb, server_vars *);
|
int mail_message(address_all_struct *, char *, int, mail_linereader_cb, server_vars *);
|
||||||
|
|
||||||
|
|
||||||
/* Gibt ein grundgerüst mit default-servereinstellungen
|
/* Gibt ein grundgerüst mit default-servereinstellungen
|
||||||
* zurueck, damit man nicht immer alles selbst angeben muss */
|
* zurueck, damit man nicht immer alles selbst angeben muss */
|
||||||
server_vars *get_default_servopts();
|
server_vars *get_default_servopts();
|
||||||
|
|
||||||
|
|
||||||
|
/* Liefert einen Text zur Statusmeldung */
|
||||||
|
const char *get_mail_status_text(int error_no);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue