int smtp_send(void *handle, const char *to, const char *cc, const char *from, const char *subject, const char *msg, int msglen) { struct smtp_state *psmtp = (struct smtp_state *)handle; struct sockaddr_in server; int sockfd; int ret; /* Setup */ psmtp->connected = true; psmtp->to = to; psmtp->cc = cc; psmtp->from = from; psmtp->subject = subject; psmtp->msg = msg; psmtp->msglen = msglen; /* Create a socket */ sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { return ERROR; } /* Connect to server. First we have to set some fields in the * 'server' structure. The system will assign me an arbitrary * local port that is not in use. */ server.sin_family = AF_INET; memcpy(&server.sin_addr.s_addr, &psmtp->smtpserver, sizeof(in_addr_t)); server.sin_port = HTONS(25); if (connect(sockfd, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) < 0) { close(sockfd); return ERROR; } /* Send the message */ ret = smtp_send_message(sockfd, psmtp); close(sockfd); return ret; }
/** * @brief Send the contents of a user-submitted contact or abuse form to the magma-configured contact email address. * @param con the connection of the web client making the request. * @param branch a null-terminated string containing the destination of the contact form: either "Abuse" or "Contact". * @return This function returns no value. */ void contact_business(connection_t *con, chr_t *branch) { stringer_t *composed, *ip, *daddr; http_data_t *name, *email, *message; bool_t is_contact; // A contact form submission by default if (!st_cmp_cs_eq(NULLER(branch), PLACER("Abuse", 5))) { is_contact = false; daddr = magma.admin.abuse; } else { is_contact = true; daddr = magma.admin.contact; } // One last sanity check, just in case. if (is_contact && !daddr) { contact_print_message(con, branch, "An unexpected error occurred while trying to process your request. This server does not have a contact address configured."); log_error("Contact form routine was reached but no contact address was configured."); return; } else if (!is_contact && !daddr) { contact_print_message(con, branch, "An unexpected error occurred while trying to process your request. This server does not have an abuse address configured."); log_error("Abuse form routine was reached but no abuse address was configured."); return; } // If either the name, email, or message fields are omitted from the post, spit out an error message. if (!(name = http_data_get(con, HTTP_DATA_POST, "your_name")) || !name->value) { contact_print_form(con, branch, contact_business_add_error(branch, (uchr_t *)"//xhtml:input[@id='your_name']", (uchr_t *)"your_name_msg", (uchr_t *)"Please enter your name.")); return; } else if (!(email = http_data_get(con, HTTP_DATA_POST, "your_email")) || !email->value || !contact_business_valid_email(email->value)) { contact_print_form(con, branch, contact_business_add_error(branch, (uchr_t *)"//xhtml:input[@id='your_email']", (uchr_t *)"your_email_msg", (uchr_t *)"A valid e-mail address is required.")); return; } else if (!(message = http_data_get(con, HTTP_DATA_POST, "your_message")) || !message->value) { contact_print_form(con, branch, contact_business_add_error(branch, (uchr_t *)"//xhtml:textarea[@id='your_message']", (uchr_t *)"your_message_msg", (uchr_t *)"Please enter your message.")); return; } // Build the IP string. ip = con_addr_presentation(con, MANAGEDBUF(64)); if ((composed = st_merge("nnnsnsnsnsnsnsnsn", "Subject: ", (is_contact ? "* Contact Form Submission *" : "*Abuse Form Submission*"), "\r\nFrom: ", magma.admin.contact, "\r\nTo: ", magma.admin.contact, "\r\nReply-To: ", email->value, "\r\n\r\nip = ", ip, "\r\nname = ", name->value, "\r\nemail = ", email->value, "\r\n------------\r\n\r\n ", message->value, "\r\n"))) { // Dotstuff the message. Just to prevent SMTP injection attacks. st_replace(&composed, PLACER("\n.",2), PLACER("\n..", 3)); // Send the message. if (smtp_send_message(daddr, daddr, composed) != 1) { contact_print_message(con, branch, "An error occurred while trying to process your request. Please try again in a few minutes."); st_free(composed); return; } // Increment our abuse counters. contact_abuse_increment_history(con); st_free(composed); } contact_print_message(con, branch, "Your message has been submitted. We'll review your message-typically within one business day-and get back to you. However " "during certain busy periods our team can take up to three business days to respond."); return; }