Advertisement
Guest User

Untitled

a guest
Feb 10th, 2017
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.40 KB | None | 0 0
  1. // Linux_Lab_42
  2. //
  3. // Created by Sergiy on 04.02.17.
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10. #include <netdb.h>
  11. #include <arpa/inet.h>
  12. #include <string.h>
  13. #include <time.h>
  14. #include <unistd.h>
  15.  
  16.  
  17. char * mailHeader(const char* from, const char* to, const char* subject, const char* mime_type, const char* charset);
  18. int connectToServer(const char* serverAddress);
  19. int createTCPsocket();
  20. char *getIP(char* targetDomain);
  21.  
  22.  
  23. int main(int argc, const char * argv[])
  24. {
  25. const char* from;
  26. const char* to;
  27. char *header;
  28. int sock;
  29. char *ip;
  30. //char* targetDomain = "smtp.ukr.net";
  31. //char* targetDomain = "aspmx.l.google.com";
  32. char* targetDomain = "ASPMX.L.GOOGLE.com";
  33. struct sockaddr_in *server;
  34. int port = 25;
  35. //int port = 465;
  36. int tmpres;
  37. int connected_fd;
  38. int recvd;
  39. char recv_buf[3000];
  40. ssize_t receivingResult; //length of the message on successful completion of receiving messages from a socket
  41. ssize_t sendingResult; //the number of bytes sent
  42. char buff[1000];
  43. char _cmd2[1000];
  44.  
  45.  
  46. // get mail header -START-
  47.  
  48. //from = "lab42linux@ukr.net";
  49. from = "sergiy.osadchyy@gmail.com";
  50. to = "sergiy.osadchyy@gmail.com";
  51. header = mailHeader(from, to, "Hello, it's a test mail", "text/plain", "US-ASCII");
  52. printf("The mail header is \n%s\n", header);
  53.  
  54. // get mail header -END-
  55.  
  56. //-------------
  57.  
  58. // Create socket -START-
  59.  
  60. sock = createTCPsocket();
  61. //printf("File descriptor that refers to endpoint is %d\n\n", sock);
  62.  
  63. // Create socket -END-
  64.  
  65. //-----------
  66.  
  67. // Get IP -START-
  68.  
  69. ip = getIP(targetDomain);
  70.  
  71. fprintf(stderr, "IP is %s\n", ip);
  72.  
  73. // Get IP -END-
  74.  
  75. //---------
  76.  
  77. // Setup server -START-
  78.  
  79. server = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in *)) ;
  80.  
  81. server->sin_family = AF_INET;
  82. server->sin_port = htons(port);
  83.  
  84. tmpres = inet_pton(AF_INET, ip, (void *)(&(server->sin_addr.s_addr)));
  85.  
  86. if (tmpres < 0)
  87. {
  88. perror("Can't set remote->sin_addr.s_addr");
  89. exit(1);
  90. }
  91. else if (tmpres == 0)
  92. {
  93. fprintf("%s is not a valid IP address\n", ip);
  94. exit(1);
  95. }
  96.  
  97. // Setup server -END-
  98.  
  99. //-----------
  100.  
  101. // Connect -START-
  102.  
  103. connected_fd = connect(sock, (struct sockaddr *)server, sizeof(struct sockaddr));
  104. if (connected_fd == -1)
  105. {
  106. perror("Could not connect");
  107. exit(1);
  108. }
  109. printf("\nThe value of connected fd is %d\n", connected_fd);
  110. // Connect -END-
  111.  
  112. //-------------
  113.  
  114.  
  115. recvd = 0;
  116. receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
  117. recvd += receivingResult;
  118.  
  119. printf("\nThe value of receivingResult is %zd\n", receivingResult);
  120. printf("\nThe value of recvd is %d\n", recvd);
  121.  
  122.  
  123. strcpy(buff, "EHLO ");
  124. strcat(buff, targetDomain);
  125. strcat(buff, "\r\n");
  126. sendingResult = send(connected_fd, buff, strlen(buff), 0);
  127. receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
  128. recvd += receivingResult;
  129.  
  130. printf("The value of buff is %s\n", buff);
  131. printf("\nThe value of sendingResult is %zd\n", sendingResult);
  132. printf("\nThe value of receivingResult is %zd\n", receivingResult);
  133. printf("\nThe value of recvd is %d\n", recvd);
  134.  
  135. strcpy(_cmd2, "AUTH LOGIN\r\n");
  136. sendingResult = send(connected_fd, _cmd2, strlen(_cmd2), 0);
  137. receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
  138. recvd += receivingResult;
  139.  
  140.  
  141.  
  142.  
  143. /*
  144.  
  145. char _cmd3[1000];
  146. Base64encode(&_cmd3, UID, strlen(UID));
  147. strcat(_cmd3, "\r\n");
  148. send(connected_fd, _cmd3, strlen(_cmd3), 0);
  149. receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
  150. recvd += receivingResult;
  151.  
  152. char _cmd4[1000];
  153. Base64encode(&_cmd4, PWD, strlen(PWD));
  154. strcat(_cmd4, "\r\n");
  155. send(connected_fd, _cmd4, strlen(_cmd4), 0);
  156. receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
  157. recvd += receivingResult;
  158.  
  159. char _cmd5[1000];
  160. strcpy(_cmd5, "MAIL FROM: ");
  161. strcat(_cmd5, "<lab42linux@ukr.net>");
  162. strcat(_cmd5, "\r\n");
  163. send(connected_fd, _cmd5, strlen(_cmd5), 0);
  164. char skip[1000];
  165. receivingResult = recv(connected_fd, skip, sizeof(skip), 0);
  166. //recvd += receivingResult;
  167.  
  168. char _cmd6[1000];
  169. strcpy(_cmd6, "RCPT TO: ");
  170. strcat(_cmd6, "sergiy.osadchyy@gmail.com");
  171. strcat(_cmd6, "\r\n");
  172. send(connected_fd, _cmd6, strlen(_cmd6), 0);
  173. receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
  174. recvd += receivingResult;
  175.  
  176. char _cmd7[1000];
  177. strcpy(_cmd7, "DATA\r\n");
  178. send(connected_fd, _cmd7, strlen(_cmd7), 0);
  179. receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
  180. recvd += receivingResult;
  181.  
  182. send(connected_fd, header, strlen(header), 0);
  183.  
  184. char _cmd8[1000];
  185. strcpy(_cmd8, "Hello, I am testing my smtp app");
  186. send(connected_fd, _cmd8, strlen(_cmd8), 0);
  187.  
  188. char _cmd9[1000];
  189. strcpy(_cmd9, "\r\n.\r\n.");
  190. send(connected_fd, _cmd9, strlen(_cmd9), 0);
  191. receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
  192. recvd += receivingResult;
  193.  
  194. char _cmd10[1000];
  195. strcpy(_cmd10, "QUIT\r\n");
  196. send(connected_fd, _cmd10, strlen(_cmd10), 0);
  197. receivingResult = recv(connected_fd, recv_buf + recvd, sizeof(recv_buf) - recvd, 0);
  198. recvd += receivingResult;
  199.  
  200. printf("0)%s\r\n", &recv_buf);
  201.  
  202.  
  203. free(header);
  204. close(connected_fd);
  205.  
  206. */
  207.  
  208. return (EXIT_SUCCESS);
  209. }
  210.  
  211.  
  212. char * mailHeader(const char* from, const char* to, const char* subject, const char* mime_type, const char* charset)
  213. {
  214. time_t now;
  215. time(&now);
  216. char *app_brand = "My lab42 mail APP";
  217. char* mail_header = NULL;
  218. char date_buff[26];
  219. char branding[6 + strlen(date_buff) + 2 + 10 + strlen(app_brand) + 1 + 1];
  220. char sender[6 + strlen(from) + 1 + 1];
  221. char recip[4 + strlen(to) + 1 + 1];
  222. char mySubject[8 + 1 + strlen(subject) + 1 + 1];
  223. //char mime_data[13 + 1 + 3 + 1 + 1 + 13 + 1 + strlen(mime_type) + 1 + 1 + 2];
  224. char *mime_data[13 + 1 + 3 + 1 + 1 + 13 + 1 + strlen(mime_type) + 1 + 1 + 2];
  225.  
  226. strftime(date_buff, (33), "%a, %d %b %Y %H:%M:%S", localtime(&now));
  227.  
  228. sprintf(branding, "DATE: %s\r\nX-Mailer: %s\r\n", date_buff, app_brand);
  229. sprintf(sender, "FROM: %s\r\n", from);
  230. sprintf(recip, "TO: %s\r\n", to);
  231. sprintf(mySubject, "SUBJECT: %s\r\n", subject);
  232. sprintf(mime_data, "MIME-version: 1.0\r\nContent-type: %s; charset=%s\r\n\r\n", mime_type, charset);
  233.  
  234. int mail_header_length = strlen(branding) + strlen(sender) + strlen(recip) + strlen(mySubject) + strlen(mime_data) + 10;
  235.  
  236. mail_header = (char*) malloc(mail_header_length * sizeof(char));
  237. memset(mail_header, 0, mail_header_length * sizeof(char));
  238.  
  239. memcpy(&mail_header[0], &branding, strlen(branding));
  240. memcpy(&mail_header[0 + strlen(branding)], &sender, strlen(sender));
  241. memcpy(&mail_header[0 + strlen(branding) + strlen(sender)], &recip, strlen(recip));
  242. memcpy(&mail_header[0 + strlen(branding) + strlen(sender) + strlen(recip)], &mySubject, strlen(mySubject));
  243. memcpy(&mail_header[0 + strlen(branding) + strlen(sender) + strlen(recip) + strlen(mySubject)], &mime_data, strlen(mime_data));
  244.  
  245. return mail_header;
  246. }
  247.  
  248.  
  249. int createTCPsocket()
  250. {
  251. int sock;
  252.  
  253. sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  254.  
  255. if (sock < 0 )
  256. {
  257. perror("Failed to create socket\n");
  258. exit(1);
  259. }
  260.  
  261. return sock;
  262. }
  263.  
  264. char *getIP(char* targetDomain)
  265. {
  266. struct hostent *hent;
  267.  
  268. int iplen = 15; //XXX.XXX.XXX.XXX
  269.  
  270. char *ip = (char *)malloc(iplen + 1);
  271. memset(ip, 0, iplen+1);
  272.  
  273. if ((hent = gethostbyname(targetDomain)) == NULL)
  274. {
  275. perror("Can't get IP\n");
  276. exit(1);
  277. }
  278.  
  279. if ((inet_ntop(AF_INET, (void *)hent->h_addr_list[0], ip, iplen)) == NULL)
  280. {
  281. perror("\nCan't resolve host\n");
  282. printf("\n");
  283. exit(1);
  284. }
  285.  
  286. return ip;
  287. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement