Socket_T socket_create(void *port) { int s; Port_T p= port; ASSERT(port); if((s= create_generic_socket(p)) != -1) { Socket_T S= NULL; NEW(S); S->socket= s; S->length= 0; S->offset= 0; S->type= p->type; S->port= p->port; S->timeout= p->timeout; S->connection_type= TYPE_LOCAL; if(p->family==AF_UNIX) { S->host= xstrdup(LOCALHOST); } else { S->host= xstrdup(p->hostname); } if(p->SSL.use_ssl && !socket_switch2ssl(S, p->SSL)) { socket_free(&S); return NULL; } S->Port= port; return S; } return NULL; }
/** * Send mail messages via SMTP * @param mail A Mail object * @return FALSE if failed, TRUE if succeeded */ int sendmail(Mail_T mail) { int i; int rv; Mail_T m; SendMail_T S; char *b64 = NULL; char now[STRLEN]; ASSERT(mail); S.socket = NULL; if(sigsetjmp(S.error, TRUE)) { rv = FALSE; goto exit; } else { rv = TRUE; } open_server(&S); Time_gmtstring(Time_now(), now); snprintf(S.localhost, sizeof(S.localhost), "%s", Run.mail_hostname ? Run.mail_hostname : Run.localhostname); do_status(&S); /* Use EHLO if TLS or Authentication is requested */ if((S.ssl.use_ssl && S.ssl.version == SSL_VERSION_TLS) || S.username) { do_send(&S, "EHLO %s\r\n", S.localhost); } else { do_send(&S, "HELO %s\r\n", S.localhost); } do_status(&S); /* Switch to TLS now if configured */ if(S.ssl.use_ssl && S.ssl.version == SSL_VERSION_TLS) { do_send(&S, "STARTTLS\r\n"); do_status(&S); if(!socket_switch2ssl(S.socket, S.ssl)) { rv = FALSE; goto exit; } /* After starttls, send ehlo again: RFC 3207: 4.2 Result of the STARTTLS Command */ do_send(&S, "EHLO %s\r\n", S.localhost); do_status(&S); } /* Authenticate if possible */ if(S.username) { unsigned char buffer[STRLEN]; int len; len = snprintf((char *)buffer, STRLEN, "%c%s%c%s", '\0', S.username, '\0', S.password?S.password:""); b64 = encode_base64(len, buffer); do_send(&S, "AUTH PLAIN %s\r\n", b64); do_status(&S); } for(i = 0, m= mail; m; m= m->next, i++) { do_send(&S, "MAIL FROM: <%s>\r\n", m->from); do_status(&S); do_send(&S, "RCPT TO: <%s>\r\n", m->to); do_status(&S); do_send(&S, "DATA\r\n"); do_status(&S); do_send(&S, "From: %s\r\n", m->from); if (m->replyto) do_send(&S, "Reply-To: %s\r\n", m->replyto); do_send(&S, "To: %s\r\n", m->to); do_send(&S, "Subject: %s\r\n", m->subject); do_send(&S, "Date: %s\r\n", now); do_send(&S, "X-Mailer: %s %s\r\n", prog, VERSION); do_send(&S, "Mime-Version: 1.0\r\n"); do_send(&S, "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n"); do_send(&S, "Content-Transfer-Encoding: 8bit\r\n"); do_send(&S, "Message-id: <%ld.%lu@%s>\r\n", time(NULL), random(), S.localhost); do_send(&S, "\r\n"); do_send(&S, "%s\r\n", m->message); do_send(&S, ".\r\n"); do_status(&S); } do_send(&S, "QUIT\r\n"); do_status(&S); exit: if(S.socket) socket_free(&S.socket); FREE(b64); return rv; }
Socket_T socket_create_t(const char *host, int port, int type, Ssl_T ssl, int timeout) { int s; int proto= type==SOCKET_UDP?SOCK_DGRAM:SOCK_STREAM; ASSERT(host); ASSERT((type==SOCKET_UDP)||(type==SOCKET_TCP)); if(ssl.use_ssl) { ASSERT(type==SOCKET_TCP); } ASSERT(timeout>0); if ((host) && (strlen(host) >0) && (host[0] == '/' || host[0] == '@')) { if((s= create_unix_socket(host, timeout)) != -1) { Socket_T S= NULL; NEW(S); S->socket= s; S->length= 0; S->offset= 0; S->port= port; S->type= proto; S->timeout= timeout; S->host= xstrdup(host); S->connection_type= TYPE_LOCAL; if(ssl.use_ssl && !socket_switch2ssl(S, ssl)) { socket_free(&S); return NULL; } return S; } return NULL; } if((s= create_socket(host, port, proto, timeout)) != -1) { Socket_T S= NULL; NEW(S); S->socket= s; S->length= 0; S->offset= 0; S->port= port; S->type= proto; S->timeout= timeout; S->host= xstrdup(host); S->connection_type= TYPE_LOCAL; if(ssl.use_ssl && !socket_switch2ssl(S, ssl)) { socket_free(&S); return NULL; } return S; } return NULL; }