Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Linux_Lab_42
- //
- // Created by Sergiy on 04.02.17.
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #include <arpa/inet.h>
- #include <string.h>
- #include <time.h>
- #include <unistd.h>
- char * mailHeader(const char* from, const char* to, const char* subject, const char* mime_type, const char* charset);
- int connectToServer(const char* serverAddress);
- int createTCPsocket();
- char *getIP(char* targetDomain);
- int main(int argc, const char * argv[])
- {
- const char* from;
- const char* to;
- char *header;
- int sock;
- char *ip;
- //char* targetDomain = "smtp.ukr.net";
- //char* targetDomain = "aspmx.l.google.com";
- char* targetDomain = "ASPMX.L.GOOGLE.com";
- struct sockaddr_in *server;
- int port = 25;
- //int port = 465;
- int tmpres;
- int connected_fd;
- int recvd;
- char recv_buf[3000];
- ssize_t receivingResult; //length of the message on successful completion of receiving messages from a socket
- ssize_t sendingResult; //the number of bytes sent
- char buff[1000];
- char _cmd2[1000];
- // get mail header -START-
- //from = "lab42linux@ukr.net";
- from = "sergiy.osadchyy@gmail.com";
- to = "sergiy.osadchyy@gmail.com";
- header = mailHeader(from, to, "Hello, it's a test mail", "text/plain", "US-ASCII");
- printf("The mail header is \n%s\n", header);
- // get mail header -END-
- //-------------
- // Create socket -START-
- sock = createTCPsocket();
- //printf("File descriptor that refers to endpoint is %d\n\n", sock);
- // Create socket -END-
- //-----------
- // Get IP -START-
- ip = getIP(targetDomain);
- fprintf(stderr, "IP is %s\n", ip);
- // Get IP -END-
- //---------
- // Setup server -START-
- server = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in *)) ;
- server->sin_family = AF_INET;
- server->sin_port = htons(port);
- tmpres = inet_pton(AF_INET, ip, (void *)(&(server->sin_addr.s_addr)));
- if (tmpres < 0)
- {
- perror("Can't set remote->sin_addr.s_addr");
- exit(1);
- }
- else if (tmpres == 0)
- {
- fprintf("%s is not a valid IP address\n", ip);
- exit(1);
- }
- // Setup server -END-
- //-----------
- // Connect -START-
- connected_fd = connect(sock, (struct sockaddr *)server, sizeof(struct sockaddr));
- if (connected_fd == -1)
- {
- perror("Could not connect");
- exit(1);
- }
- printf("\nThe value of connected fd is %d\n", connected_fd);
- // Connect -END-
- //-------------
- recvd = 0;
- receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
- recvd += receivingResult;
- printf("\nThe value of receivingResult is %zd\n", receivingResult);
- printf("\nThe value of recvd is %d\n", recvd);
- strcpy(buff, "EHLO ");
- strcat(buff, targetDomain);
- strcat(buff, "\r\n");
- sendingResult = send(connected_fd, buff, strlen(buff), 0);
- receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
- recvd += receivingResult;
- printf("The value of buff is %s\n", buff);
- printf("\nThe value of sendingResult is %zd\n", sendingResult);
- printf("\nThe value of receivingResult is %zd\n", receivingResult);
- printf("\nThe value of recvd is %d\n", recvd);
- strcpy(_cmd2, "AUTH LOGIN\r\n");
- sendingResult = send(connected_fd, _cmd2, strlen(_cmd2), 0);
- receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
- recvd += receivingResult;
- /*
- char _cmd3[1000];
- Base64encode(&_cmd3, UID, strlen(UID));
- strcat(_cmd3, "\r\n");
- send(connected_fd, _cmd3, strlen(_cmd3), 0);
- receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
- recvd += receivingResult;
- char _cmd4[1000];
- Base64encode(&_cmd4, PWD, strlen(PWD));
- strcat(_cmd4, "\r\n");
- send(connected_fd, _cmd4, strlen(_cmd4), 0);
- receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
- recvd += receivingResult;
- char _cmd5[1000];
- strcpy(_cmd5, "MAIL FROM: ");
- strcat(_cmd5, "<lab42linux@ukr.net>");
- strcat(_cmd5, "\r\n");
- send(connected_fd, _cmd5, strlen(_cmd5), 0);
- char skip[1000];
- receivingResult = recv(connected_fd, skip, sizeof(skip), 0);
- //recvd += receivingResult;
- char _cmd6[1000];
- strcpy(_cmd6, "RCPT TO: ");
- strcat(_cmd6, "sergiy.osadchyy@gmail.com");
- strcat(_cmd6, "\r\n");
- send(connected_fd, _cmd6, strlen(_cmd6), 0);
- receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
- recvd += receivingResult;
- char _cmd7[1000];
- strcpy(_cmd7, "DATA\r\n");
- send(connected_fd, _cmd7, strlen(_cmd7), 0);
- receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
- recvd += receivingResult;
- send(connected_fd, header, strlen(header), 0);
- char _cmd8[1000];
- strcpy(_cmd8, "Hello, I am testing my smtp app");
- send(connected_fd, _cmd8, strlen(_cmd8), 0);
- char _cmd9[1000];
- strcpy(_cmd9, "\r\n.\r\n.");
- send(connected_fd, _cmd9, strlen(_cmd9), 0);
- receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
- recvd += receivingResult;
- char _cmd10[1000];
- strcpy(_cmd10, "QUIT\r\n");
- send(connected_fd, _cmd10, strlen(_cmd10), 0);
- receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
- recvd += receivingResult;
- printf("0)%s\r\n", &recv_buf);
- free(header);
- close(connected_fd);
- */
- return (EXIT_SUCCESS);
- }
- 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 = "My lab42 mail 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 mySubject[8 + 1 + strlen(subject) + 1 + 1];
- //char mime_data[13 + 1 + 3 + 1 + 1 + 13 + 1 + strlen(mime_type) + 1 + 1 + 2];
- char *mime_data[13 + 1 + 3 + 1 + 1 + 13 + 1 + strlen(mime_type) + 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(mySubject, "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(mySubject) + strlen(mime_data) + 10;
- mail_header = (char*) malloc(mail_header_length * sizeof(char));
- memset(mail_header, 0, 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)], &mySubject, strlen(mySubject));
- memcpy(&mail_header[0 + strlen(branding) + strlen(sender) + strlen(recip) + strlen(mySubject)], &mime_data, strlen(mime_data));
- return mail_header;
- }
- int createTCPsocket()
- {
- int sock;
- sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (sock < 0 )
- {
- perror("Failed to create socket\n");
- exit(1);
- }
- return sock;
- }
- char *getIP(char* targetDomain)
- {
- struct hostent *hent;
- int iplen = 15; //XXX.XXX.XXX.XXX
- char *ip = (char *)malloc(iplen + 1);
- memset(ip, 0, iplen+1);
- if ((hent = gethostbyname(targetDomain)) == NULL)
- {
- perror("Can't get IP\n");
- exit(1);
- }
- if ((inet_ntop(AF_INET, (void *)hent->h_addr_list[0], ip, iplen)) == NULL)
- {
- perror("\nCan't resolve host\n");
- printf("\n");
- exit(1);
- }
- return ip;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement