SSL works fine while sending Mails
git-svn-id: file:///home/jan/tmp/wetterstation/trunk@44 dd492736-c11a-0410-ad51-8c26713eaf7f
This commit is contained in:
parent
2268f06d6e
commit
304f509762
|
|
@ -25,12 +25,14 @@ 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 *);
|
||||||
|
static void event_cb (smtp_session_t , 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){
|
int mail_message(address_all_struct *addresses, char *subject, int eightbit, mail_linereader_cb line_read_cb, server_vars *servopts){
|
||||||
|
|
||||||
FILE *fd = NULL; /* Zeiger auf Temporaere Datei */
|
FILE *fd = NULL; /* Zeiger auf Temporaere Datei */
|
||||||
int i; /* Laufvariable */
|
int i; /* Laufvariable */
|
||||||
|
|
@ -39,7 +41,7 @@ int mail_message(address_all_struct *addresses, char *subject, int eightbit, ma
|
||||||
smtp_message_t message; /* SMTP - Message */
|
smtp_message_t message; /* SMTP - Message */
|
||||||
const smtp_status_t *status; /* Uebertragungsstatus */
|
const smtp_status_t *status; /* Uebertragungsstatus */
|
||||||
|
|
||||||
if((fd = tmpfile()) == NULL) /* Temporäre Datei anlegen */
|
if(servopts == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(addresses->from == NULL){ /* Wenn absenderstruktur nicht gesetzt ist */
|
if(addresses->from == NULL){ /* Wenn absenderstruktur nicht gesetzt ist */
|
||||||
|
|
@ -52,6 +54,9 @@ int mail_message(address_all_struct *addresses, char *subject, int eightbit, ma
|
||||||
addresses->from->mailbox = gen_from_mailbox(); /* Dann eine Addresse nach dem schema user@host generieren */
|
addresses->from->mailbox = gen_from_mailbox(); /* Dann eine Addresse nach dem schema user@host generieren */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if((fd = tmpfile()) == NULL) /* Temporäre Datei anlegen */
|
||||||
|
return 0;
|
||||||
|
|
||||||
build_header(addresses->from, addresses->to, addresses->cc, addresses->bcc, subject, fd); /* Header in die Temporäre Datei schreiben */
|
build_header(addresses->from, addresses->to, addresses->cc, addresses->bcc, subject, fd); /* Header in die Temporäre Datei schreiben */
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
@ -63,9 +68,24 @@ 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 0;
|
||||||
|
|
||||||
|
switch (servopts->ssl_use) { /* gucken ob SSL benutzt werden soll */
|
||||||
|
case SSL_ENABLED:
|
||||||
|
smtp_starttls_enable(session, Starttls_ENABLED); /* SSL soll auf jeden Fall benutzt werden */
|
||||||
|
break;
|
||||||
|
case SSL_REQUIRED:
|
||||||
|
smtp_starttls_enable(session, Starttls_REQUIRED); /* SSL soll ren benötigt benutzt werden */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
smtp_starttls_enable(session, Starttls_DISABLED); /* SSL soll nicht benutzt werden */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if(!smtp_set_server(session, "atlantis.wh2.tu-dresden.de:25")) /* Den Server für die Übertragung setzen */
|
if(!smtp_set_server(session, "atlantis.wh2.tu-dresden.de:25")) /* Den Server für die Übertragung setzen */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
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 0;
|
||||||
|
|
||||||
|
|
@ -82,7 +102,7 @@ int mail_message(address_all_struct *addresses, char *subject, int eightbit, ma
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
status = smtp_message_transfer_status (message); /* uebertragungsstatus holen */
|
status = smtp_message_transfer_status (message); /* uebertragungsstatus holen */
|
||||||
DEBUGOUT3( "SMTP sending: %d %s", status->code, status->text); /* und anzeigen */
|
DEBUGOUT3( "SMTP: sending result: %d %s", status->code, status->text); /* und anzeigen */
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -201,7 +221,92 @@ static int add_recipients(smtp_message_t message, address_struct *address){
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void event_cb (smtp_session_t session, int event_no, void *arg,...){
|
||||||
|
va_list alist;
|
||||||
|
int *ok;
|
||||||
|
server_vars *servopt = NULL;
|
||||||
|
|
||||||
|
va_start(alist, arg);
|
||||||
|
servopt = (server_vars*)arg;
|
||||||
|
switch(event_no) {
|
||||||
|
case SMTP_EV_CONNECT:
|
||||||
|
case SMTP_EV_MAILSTATUS:
|
||||||
|
case SMTP_EV_RCPTSTATUS:
|
||||||
|
case SMTP_EV_MESSAGEDATA:
|
||||||
|
case SMTP_EV_MESSAGESENT:
|
||||||
|
case SMTP_EV_DISCONNECT:
|
||||||
|
break;
|
||||||
|
case SMTP_EV_WEAK_CIPHER: {
|
||||||
|
int bits;
|
||||||
|
bits = va_arg(alist, long);
|
||||||
|
ok = va_arg(alist, int*);
|
||||||
|
DEBUGOUT3("SMTP: Weak cipher! bits:%d continue: %d\n", bits, servopt->ssl_ctx_peer_wrong);
|
||||||
|
*ok = servopt->ssl_weak_cipher;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SMTP_EV_STARTTLS_OK: {
|
||||||
|
DEBUGOUT1("SMTP: Starting using TLS ... OK\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SMTP_EV_INVALID_PEER_CERTIFICATE: {
|
||||||
|
long vfy_result;
|
||||||
|
vfy_result = va_arg(alist, long);
|
||||||
|
ok = va_arg(alist, int*);
|
||||||
|
DEBUGOUT3("SMTP: Invalid peer certificate! verify-Result: %d continue: %d\n", vfy_result, servopt->ssl_ctx_peer_invalid);
|
||||||
|
*ok = servopt->ssl_ctx_peer_invalid;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SMTP_EV_NO_PEER_CERTIFICATE: {
|
||||||
|
ok = va_arg(alist, int*);
|
||||||
|
DEBUGOUT2("SMTP: No peer certificate! continue: %d\n", servopt->ssl_ctx_peer_no);
|
||||||
|
*ok = servopt->ssl_ctx_peer_no;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SMTP_EV_WRONG_PEER_CERTIFICATE: {
|
||||||
|
ok = va_arg(alist, int*);
|
||||||
|
DEBUGOUT2("SMTP: Wrong peer certificate! continue: %d\n", servopt->ssl_ctx_peer_wrong);
|
||||||
|
*ok = servopt->ssl_ctx_peer_wrong;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SMTP_EV_NO_CLIENT_CERTIFICATE: {
|
||||||
|
ok = va_arg(alist, int*);
|
||||||
|
DEBUGOUT2("SMTP: No client certificate! continue: %d\n", servopt->ssl_ctx_peer_wrong);
|
||||||
|
*ok = servopt->ssl_ctx_client_no;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SMTP_EV_EXTNA_DSN: {
|
||||||
|
DEBUGOUT1("SMTP: Extension DSN not supportet by MTA\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SMTP_EV_EXTNA_STARTTLS: {
|
||||||
|
DEBUGOUT1("SMTP: Extension StartTLS not supportet by MTA\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SMTP_EV_EXTNA_8BITMIME: {
|
||||||
|
DEBUGOUT1("SMTP: Extension 8BITMIME not supportet by MTA\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
DEBUGOUT2("SMTP: Unhandled event ID: %d - ignored\n", event_no);
|
||||||
|
}
|
||||||
|
va_end(alist);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
server_vars *get_default_servopts(){
|
||||||
|
server_vars *servopts = malloc(sizeof(server_vars));
|
||||||
|
servopts->host = "localhost";
|
||||||
|
servopts->port = 25;
|
||||||
|
servopts->ssl_use = SSL_REQUIRED;
|
||||||
|
servopts->ssl_weak_cipher = SSL_ACCEPT;
|
||||||
|
servopts->ssl_ctx_client_no = SSL_ACCEPT;
|
||||||
|
servopts->ssl_ctx_peer_no = SSL_ACCEPT;
|
||||||
|
servopts->ssl_ctx_peer_wrong = SSL_ACCEPT;
|
||||||
|
servopts->ssl_ctx_peer_invalid = SSL_ACCEPT;
|
||||||
|
servopts->auth_use = AUTH_NO;
|
||||||
|
servopts->auth_user = NULL;
|
||||||
|
servopts->auth_pass = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static char * test_read(int line){
|
static char * test_read(int line){
|
||||||
|
|
@ -234,10 +339,16 @@ main(char argc[], int arglen){
|
||||||
adr.cc = NULL;//cc;
|
adr.cc = NULL;//cc;
|
||||||
adr.bcc = NULL;//bcc;
|
adr.bcc = NULL;//bcc;
|
||||||
|
|
||||||
|
server_vars *servo = get_default_servopts();
|
||||||
|
//servo->ssl_use = SSL_ENABLED;
|
||||||
|
//servo->ssl_use = SSL_DISABLED;
|
||||||
|
servo->host = "atlantis.wh2.tu-dresden.de";
|
||||||
|
servo->port = 465;
|
||||||
|
|
||||||
ft = fopen("test_data", "r");
|
ft = fopen("test_data", "r");
|
||||||
rewind(ft);
|
rewind(ft);
|
||||||
printf("rufe mail_message auf...\n");
|
printf("rufe mail_message auf...\n");
|
||||||
mail_message( &adr, "Powered by libesmtp", 0, test_read);
|
mail_message( &adr, "Powered by libesmtp", 0, test_read, servo);
|
||||||
|
|
||||||
|
|
||||||
printf("fertig...\n");
|
printf("fertig...\n");
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,13 @@
|
||||||
|
#define SSL_ENABLED 0
|
||||||
|
#define SSL_DISABLED 1
|
||||||
|
#define SSL_REQUIRED 2
|
||||||
|
|
||||||
|
#define SSL_ACCEPT 1
|
||||||
|
#define SSL_DECLINE 0
|
||||||
|
|
||||||
|
#define AUTH_YES 1
|
||||||
|
#define AUTH_NO 0
|
||||||
|
|
||||||
typedef char *(mail_linereader_cb)(int line);
|
typedef char *(mail_linereader_cb)(int line);
|
||||||
|
|
||||||
typedef struct address_t {
|
typedef struct address_t {
|
||||||
|
|
@ -12,3 +22,16 @@ typedef struct address_all_t {
|
||||||
address_struct *bcc;
|
address_struct *bcc;
|
||||||
} address_all_struct;
|
} address_all_struct;
|
||||||
|
|
||||||
|
typedef struct server_vars_t {
|
||||||
|
char *host;
|
||||||
|
int port;
|
||||||
|
char ssl_use;
|
||||||
|
char ssl_weak_cipher;
|
||||||
|
char ssl_ctx_client_no;
|
||||||
|
char ssl_ctx_peer_no;
|
||||||
|
char ssl_ctx_peer_wrong;
|
||||||
|
char ssl_ctx_peer_invalid;
|
||||||
|
char auth_use;
|
||||||
|
char *auth_user;
|
||||||
|
char *auth_pass;
|
||||||
|
}server_vars;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue