static void open_server(SendMail_T *S) { MailServer_T mta = Run.mailservers; if (mta) { S->server = mta->host; S->port = mta->port; S->username = mta->username; S->password = mta->password; S->ssl = mta->ssl; } else { THROW(IOException, "No mail servers are defined -- see manual for 'set mailserver' statement"); } do { /* wait with ssl-connect if SSL_TLS* is set (rfc2487) */ if (! S->ssl.use_ssl || S->ssl.version == SSL_TLSV1 || S->ssl.version == SSL_TLSV11 || S->ssl.version == SSL_TLSV12) S->socket = Socket_new(S->server, S->port, Socket_Tcp, Socket_Ip, false, Run.mailserver_timeout); else S->socket = Socket_create(S->server, S->port, Socket_Tcp, Socket_Ip, S->ssl, Run.mailserver_timeout); if (S->socket) break; LogError("Cannot open a connection to the mailserver '%s:%i' -- %s\n", S->server, S->port, STRERROR); if (mta && (mta = mta->next)) { S->server = mta->host; S->port = mta->port; S->username = mta->username; S->password = mta->password; S->ssl = mta->ssl; LogInfo("Trying the next mail server '%s:%i'\n", S->server, S->port); continue; } else { THROW(IOException, "No mail servers are available"); } } while (true); S->quit = true; }
static int send_msg( char *dest_addr, char *return_addr, NodeMessage *msg ) { int dest_port, buflen = SENDBUF_LEN; char *colon, buf[SENDBUF_LEN], dest_host[16]; int sock; colon = strchr( (const char*)dest_addr, ':' ); if (colon == NULL) { Dbg_printf( NODE, ERROR, "send_msg, ':' not found in the dest_addr=%s\n", dest_addr ); return -1; } memcpy( dest_host, dest_addr, sizeof(char) * (colon - dest_addr) ); dest_host[colon - dest_addr] = '\0'; dest_port = atoi( colon + 1 ); if ((sock = Socket_create()) < 0 ) { Dbg_printf( NODE, ERROR, "send_msg, socket creation failed\n" ); return -1; } node_set_return_addr( msg, return_addr ); if (Socket_connect( sock, dest_host, dest_port ) < 0) { Dbg_printf( NODE, ERROR, "send_msg, socket connect failed\n" ); return -1; } if (node_stringify_msg( msg, buf, &buflen ) < 0 ) { Dbg_printf( NODE, ERROR, "send_msg, msg stringify failed\n" ); return -1; } Socket_send_data( sock, buf, buflen ); Socket_close( sock ); Dbg_printf( NODE, API, "%s message sent to %s\n", node_msgid2str( msg->msgid ), dest_addr ); return 0; }