From 747241658b79bad7007193a4fe3eb61498bb6fda Mon Sep 17 00:00:00 2001 From: losinshi Date: Sat, 26 Aug 2006 09:24:33 +0000 Subject: [PATCH] Added some error-handling to the mailer git-svn-id: file:///home/jan/tmp/wetterstation/trunk@47 dd492736-c11a-0410-ad51-8c26713eaf7f --- cronjob/checksensor/mailer.c | 68 +++++++++++++++++++++++++++--------- cronjob/checksensor/mailer.h | 45 ++++++++++++++++++------ 2 files changed, 86 insertions(+), 27 deletions(-) diff --git a/cronjob/checksensor/mailer.c b/cronjob/checksensor/mailer.c index 09432ba..e63378a 100644 --- a/cronjob/checksensor/mailer.c +++ b/cronjob/checksensor/mailer.c @@ -52,9 +52,6 @@ static int add_recipients(smtp_message_t , address_struct *); static void event_cb (smtp_session_t , int , void *,...); static int default_auth_cb (auth_client_request_t , char **, int , void *); -/* Variablen */ - - /* 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){ @@ -70,7 +67,7 @@ int mail_message(address_all_struct *addresses, char *subject, int eightbit, ma const smtp_status_t *status = NULL; /* Uebertragungsstatus */ if(servopts == NULL) - return 0; + return MAILER_STATUS_FAILTURE_SERVOPTS_MISSING; if(addresses->from == NULL){ /* Wenn absenderstruktur nicht gesetzt ist */ addresses->from = malloc(sizeof(address_struct)); /* Dann speicher allokieren */ @@ -83,10 +80,11 @@ int mail_message(address_all_struct *addresses, char *subject, int eightbit, ma } if((fd = tmpfile()) == NULL) /* Temporäre Datei anlegen */ - return 0; + return MAILER_STATUS_FAILTURE_TEMPFILE_CREATE; + + 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; - build_header(addresses->from, addresses->to, addresses->cc, addresses->bcc, subject, fd); /* Header in die Temporäre Datei schreiben */ - i = 0; while((buf = line_read_cb(i)) != NULL){ /* Solange die Callbackfunktion einen Zeiger auf einen Puffer liefert */ fputs(buf, fd); /* Schreibe dessen Inhalt in eine Datei */ @@ -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 */ - return 0; + return MAILER_STATUS_FAILTURE_SESSION_CREATE; switch (servopts->ssl_use) { /* gucken ob SSL benutzt werden soll */ 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); 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 ((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 */ if(servopts->auth_cb == NULL){ /* wenn keine Callback-fkt. gesetzt */ auth_set_interact_cb (authctx, default_auth_cb, servopts); /* dann die standart-fkt nehmen */ @@ -126,31 +124,35 @@ int mail_message(address_all_struct *addresses, char *subject, int eightbit, ma auth_set_interact_cb (authctx, servopts->auth_cb, servopts); /* die gegebene verwenden */ } 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 */ 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 */ - return 0; + return MAILER_STATUS_FAILTURE_SETREVPATH; if(eightbit) /* Weinn eightbit-Flag gesetzt, */ 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 */ - 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 */ - return 0; + return MAILER_STATUS_FAILTURE_ADDRECIPIENTS; if(!smtp_start_session(session)) /* Session Starten (Mail versenden) */ - return 0; + return MAILER_STATUS_FAILTURE_STARTSESSION; status = smtp_message_transfer_status (message); /* uebertragungsstatus holen */ 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 */ if(fd != NULL) @@ -162,7 +164,7 @@ int mail_message(address_all_struct *addresses, char *subject, int eightbit, ma if(authctx != NULL) 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"; + } +} diff --git a/cronjob/checksensor/mailer.h b/cronjob/checksensor/mailer.h index b9ef4ea..22cc28a 100644 --- a/cronjob/checksensor/mailer.h +++ b/cronjob/checksensor/mailer.h @@ -28,18 +28,38 @@ #include -#define SSL_ENABLED 0 -#define SSL_DISABLED 1 -#define SSL_REQUIRED 2 +/* SSL-Benutzung */ +#define SSL_ENABLED 0 /* auf jeden Fall eingschaltet */ +#define SSL_DISABLED 1 /* Ausgeschaltet */ +#define SSL_REQUIRED 2 /* Wenn benötigt */ -#define SSL_ACCEPT 1 -#define SSL_DECLINE 0 +/* Zertifikat akzeptieren */ +#define SSL_ACCEPT 1 /* Ja */ +#define SSL_DECLINE 0 /* Nein */ -#define AUTH_YES 1 -#define AUTH_NO 0 +/* Authentifizieren */ +#define AUTH_YES 1 /* Ja */ +#define AUTH_NO 0 /* Nein */ -#define EINGHTBIT_Y 1 -#define EINGHTBIT_N 0 +/* eightbit setzen */ +#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) */ @@ -81,10 +101,15 @@ typedef struct server_vars_t { * 2. Argument: Betreff der Nachicht * 3. Argument: eightbit-flag setzen oder nicht * 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 *); /* Gibt ein grundgerüst mit default-servereinstellungen * zurueck, damit man nicht immer alles selbst angeben muss */ server_vars *get_default_servopts(); + + +/* Liefert einen Text zur Statusmeldung */ +const char *get_mail_status_text(int error_no);