GMail(smtp.gmail.com) using C programming SSL
This video shows how to send email using gmail smtp server (smtp.gmail.com). To code this project , I used Netbeans, gcc, tcp socket and openSSL
Send Email using C programming:
https://youtu.be/6m00PrmDlsE (must see this video)
Install Openssl developer package: apt-get install libssl-dev
Enjoy!!!
don’t forget to subscribe on youtube as more code comming.
/*
* File: para.h
* Author: rahul
*
* Created on 22 February, 2016, 11:52 AM
*/
#ifndef PARA_H
#define PARA_H
#ifdef __cplusplus
extern "C" {
#endif
#define FROM "<dfgdfg@gmail.com>" // pass it to smtp from
#define TO "<dgffdgdfg@gmail.com>" // pass it to smtp from
#define MAIL_HEADER_FROM "Rahul<dfgdfg@gmail.com>" // pass it to header
#define MAIL_HEADER_TO "Mini<dfgdfg@gmail.com>" // pass it to header
#define UID "gmail full id :sdfsdfds@gmail.com"
#define PWD "gmail password"
#define smtp_server_url "smtp.gmail.com"
#define domain_name "localhost"
#ifdef __cplusplus
}
#endif
#endif /* PARA_H */
/*
* File: main.c
* Author: rahul
*
* Created on 22 February, 2016, 11:25 AM
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <string.h>
#include "base64.h"
#include "para.h"
#include "time.h"
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
/*
*
*/
char * MailHeader(const char* from, const char* to, const char* subject, const char* mime_type, const char* charset) {
time_t now;
time(&now);
char *app_brand = "Codevlog Test APP";
char* mail_header = NULL;
char date_buff[26];
char Branding[6 + strlen(date_buff) + 2 + 10 + strlen(app_brand) + 1 + 1];
char Sender[6 + strlen(from) + 1 + 1];
char Recip[4 + strlen(to) + 1 + 1];
char Subject[8 + 1 + strlen(subject) + 1 + 1];
char mime_data[13 + 1 + 3 + 1 + 1 + 13 + 1 + strlen(mime_type) + 1 + 1 + 8 + strlen(charset) + 1 + 1 + 2];
strftime(date_buff, (33), "%a , %d %b %Y %H:%M:%S", localtime(&now));
sprintf(Branding, "DATE: %s\r\nX-Mailer: %s\r\n", date_buff, app_brand);
sprintf(Sender, "FROM: %s\r\n", from);
sprintf(Recip, "To: %s\r\n", to);
sprintf(Subject, "Subject: %s\r\n", subject);
sprintf(mime_data, "MIME-Version: 1.0\r\nContent-type: %s; charset=%s\r\n\r\n", mime_type, charset);
int mail_header_length = strlen(Branding) + strlen(Sender) + strlen(Recip) + strlen(Subject) + strlen(mime_data) + 10;
mail_header = (char*) malloc(mail_header_length * sizeof (char));
memcpy(&mail_header[0], &Branding, strlen(Branding));
memcpy(&mail_header[0 + strlen(Branding)], &Sender, strlen(Sender));
memcpy(&mail_header[0 + strlen(Branding) + strlen(Sender)], &Recip, strlen(Recip));
memcpy(&mail_header[0 + strlen(Branding) + strlen(Sender) + strlen(Recip)], &Subject, strlen(Subject));
memcpy(&mail_header[0 + strlen(Branding) + strlen(Sender) + strlen(Recip) + strlen(Subject)], &mime_data, strlen(mime_data));
return mail_header;
}
int main(int argc, char** argv) {
BIO *obj_bio = NULL;
BIO *obj_out = NULL;
const SSL_METHOD *method;
SSL_CTX *ctx;
SSL *ssl;
int connceted_fd = 0;
int ret, i;
OpenSSL_add_all_algorithms();
ERR_load_BIO_strings();
ERR_load_crypto_strings();
SSL_load_error_strings();
obj_bio = BIO_new(BIO_s_file());
obj_out = BIO_new_fp(stdout, BIO_NOCLOSE);
if (SSL_library_init() < 0) {
BIO_printf(obj_out, "OpenSSL not initialize");
} else {
method = SSLv23_client_method();
if ((ctx = SSL_CTX_new(method)) == NULL) {
BIO_printf(obj_out, "OpenSSL context not initialize");
} else {
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2);
ssl = SSL_new(ctx);
connceted_fd = ConnectToServer(smtp_server_url);
if (connceted_fd != 0) {
BIO_printf(obj_out, "Connected Successfully");
SSL_set_fd(ssl, connceted_fd);
if (SSL_connect(ssl) != 1) {
BIO_printf(obj_out, "SLL session not created");
} else {
char *header = MailHeader(MAIL_HEADER_FROM, MAIL_HEADER_TO, "Hello Its a test Mail from Codevlog", "text/plain", "US-ASCII");
int recvd = 0;
const char recv_buff[4768];
int sdsd;
sdsd = SSL_read(ssl, recv_buff + recvd, sizeof (recv_buff) - recvd);
recvd += sdsd;
char buff[1000];
strcpy(buff, "EHLO "); //"EHLO sdfsdfsdf.com\r\n"
strcat(buff, domain_name);
strcat(buff, "\r\n");
SSL_write(ssl, buff, strlen(buff));
sdsd = SSL_read(ssl, recv_buff + recvd, sizeof (recv_buff) - recvd);
recvd += sdsd;
char _cmd2[1000];
strcpy(_cmd2, "AUTH LOGIN\r\n");
int dfdf = SSL_write(ssl, _cmd2, strlen(_cmd2));
sdsd = SSL_read(ssl, recv_buff + recvd, sizeof (recv_buff) - recvd);
recvd += sdsd;
char _cmd3[1000];
Base64encode(&_cmd3, UID, strlen(UID));
strcat(_cmd3, "\r\n");
SSL_write(ssl, _cmd3, strlen(_cmd3));
sdsd = SSL_read(ssl, recv_buff + recvd, sizeof (recv_buff) - recvd);
recvd += sdsd;
char _cmd4[1000];
Base64encode(&_cmd4, PWD, strlen(PWD));
strcat(_cmd4, "\r\n");
SSL_write(ssl, _cmd4, strlen(_cmd4));
sdsd = SSL_read(ssl, recv_buff + recvd, sizeof (recv_buff) - recvd);
recvd += sdsd;
char _cmd5[1000];
strcpy(_cmd5, "MAIL FROM: ");
strcat(_cmd5, FROM);
strcat(_cmd5, "\r\n");
SSL_write(ssl, _cmd5, strlen(_cmd5));
char skip[1000];
sdsd = SSL_read(ssl, skip, sizeof (skip));
char _cmd6[1000];
strcpy(_cmd6, "RCPT TO: ");
strcat(_cmd6, TO); //
strcat(_cmd6, "\r\n");
SSL_write(ssl, _cmd6, strlen(_cmd6));
sdsd = SSL_read(ssl, recv_buff + recvd, sizeof (recv_buff) - recvd);
recvd += sdsd;
char _cmd7[1000];
strcpy(_cmd7, "DATA\r\n");
SSL_write(ssl, _cmd7, strlen(_cmd7));
sdsd = SSL_read(ssl, recv_buff + recvd, sizeof (recv_buff) - recvd);
recvd += sdsd;
SSL_write(ssl, header, strlen(header));
char _cmd8[1000];
strcpy(_cmd8, "I own CodeVlog you tube channel");
SSL_write(ssl, _cmd8, sizeof (_cmd8));
char _cmd9[1000];
strcpy(_cmd9, "\r\n.\r\n.");
SSL_write(ssl, _cmd9, sizeof (_cmd9));
sdsd = SSL_read(ssl, recv_buff + recvd, sizeof (recv_buff) - recvd);
recvd += sdsd;
char _cmd10[1000];
strcpy(_cmd10, "QUIT\r\n");
SSL_write(ssl, _cmd10, sizeof (_cmd10));
sdsd = SSL_read(ssl, recv_buff + recvd, sizeof (recv_buff) - recvd);
recvd += sdsd;
printf("0)%s\r\n", &recv_buff);
free(header);
}
}
}
}
return (EXIT_SUCCESS);
}
const char* GetIPAddress(const char* target_domain) {
const char* target_ip;
struct in_addr *host_address;
struct hostent *raw_list = gethostbyname(target_domain);
int i = 0;
for (i; raw_list->h_addr_list[i] != 0; i++) {
host_address = raw_list->h_addr_list[i];
target_ip = inet_ntoa(*host_address);
}
return target_ip;
}
int ConnectToServer(const char* server_address) {
int socket_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
struct sockaddr_in addr;
memset(&addr, 0, sizeof (addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(465);
if (inet_pton(AF_INET, GetIPAddress(server_address), &addr.sin_addr) == 1) {
connect(socket_fd, &addr, sizeof (addr));
}
return socket_fd;
}
Search google for apple base64 C code