Advertisement
BorrowTheProgrammer

lab3.c

May 17th, 2022
626
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.06 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <sys/socket.h>
  3. #include <sys/types.h>
  4. #include <netinet/in.h>
  5. #include <netdb.h>
  6. #include <unistd.h>
  7. #include <stdio.h>
  8. #include <errno.h>
  9. #include <string.h>
  10. #include <sys/un.h>
  11. #include <arpa/inet.h>
  12.  
  13. #define BUF_SIZE 256
  14.  
  15. char MAIL_FROM[BUF_SIZE];
  16.  
  17. char HELO_COMMAND[] = "EHLO %s\r\n";
  18. char FROM_COMMAND[] = "MAIL From: %s\n";
  19. char RCPT_TO[] = "RCPT TO: %s\r\n";
  20. char SUBJECT[] = "Subject: %s\r\n";
  21. char DATA[] = "DATA\r\n";
  22. char MESSAGE[] = "%s\r\n";
  23. char DOT[] = ".\r\n";
  24. char QUIT[] = "QUIT\r\n";
  25. char successMessage[] = "Команда отправлена успешно\r\n";
  26. char failureMessage[] = "Ошибка во время отправки команды\r\n";
  27.  
  28. void printInterface (void)
  29. {
  30.     char denom[BUF_SIZE / 2];
  31.     memset(denom, '-', BUF_SIZE / 2);
  32.     printf("%s\n", denom);
  33.     printf("\tДанная программа обеспечивает функционал утилиты mail для отправки почтовых команд на указанный SMTP сервер.\n");
  34.     printf("\tДля завершения ввода сообщения введите CTRL + D. Для завершения отправки почтовых комманд введите quit.\n");
  35.     printf("%s\n", denom);
  36.     printf("\n");
  37. }
  38. char *getResponseStatus(char *response)
  39. {
  40.     char *ptr = response;
  41.     char status[3];
  42.  
  43.     for (int i = 0; i < 3; i++)
  44.     {
  45.         status[i] = *ptr;
  46.         ptr++;
  47.     }
  48.  
  49.     if ((strcmp(status, "250")) == 0)
  50.     {
  51.         return successMessage;
  52.     }
  53.     else
  54.     {
  55.         return failureMessage;
  56.     }
  57. }
  58.  
  59. void sendToSMTP(char *message, int socketfd)
  60. {
  61.     char response[512];
  62.     memset(response, 0, sizeof(response));
  63.     send(socketfd, message, strlen(message), 0);
  64.     printf("Отправка сообщения: %s \n", message);
  65.     recv(socketfd, response, sizeof(response), 0);
  66.     if (strcmp(response, "") != 0)
  67.         printf("%s \n", getResponseStatus(response));
  68.     printf("\n");
  69. }
  70.  
  71. int main(int argc, char *argv[])
  72. {
  73.     if (argc < 2)
  74.     {
  75.         printf("Использование: /a.out <SMTP Server>\n");
  76.         exit(-1);
  77.     }
  78.  
  79.     struct sockaddr_in addr;
  80.     struct hostent *host_by_name;
  81.     socklen_t sock_addr_len = sizeof(addr);
  82.     char *MAIL_TO = argv[1];
  83.     char toUser[256];
  84.     char userTheme[256];
  85.     char userMessage[512];
  86.     char buf[256];
  87.     char buf2[256];
  88.     char userQuitCommand[128];
  89.     int i = 0;
  90.     char c;
  91.     char login[128];
  92.     char hostname[128];
  93.     int result;
  94.  
  95.     gethostname(MAIL_FROM, BUF_SIZE);
  96.     host_by_name = gethostbyname(MAIL_TO);
  97.  
  98.     // инициализация сокета, получение дискриптора
  99.     int serverfd = socket(AF_INET, SOCK_STREAM, 0);
  100.  
  101.     memset((char *)&addr, '\0', sock_addr_len);
  102.     addr.sin_family = AF_INET;
  103.     addr.sin_port = htons(25);
  104.     addr.sin_addr.s_addr = *((unsigned long *)host_by_name->h_addr);
  105.  
  106.     char response[1024];
  107.     memset(response, 0, sizeof(response));
  108.     write(1, response, sizeof(response));
  109.  
  110.  
  111.  
  112.     recv(serverfd, response, sizeof(response), 0);
  113.    
  114.     printInterface();
  115.  
  116.     do
  117.     {
  118.         i = 0;
  119.         write(1, "RCPT To: ", 9);
  120.         do
  121.         {
  122.             read(1, &toUser[i], 1);
  123.             i++;
  124.         } while (toUser[i - 1] != '\n');
  125.         toUser[i - 1] = '\0';
  126.         i = 0;
  127.  
  128.         write(1, "Subject: ", 9);
  129.         do
  130.         {
  131.             read(0, &userTheme[i], 1);
  132.             i++;
  133.         } while (userTheme[i - 1] != '\n');
  134.         userTheme[i - 1] = '\0';
  135.         i = 0;
  136.  
  137.         write(1, "Message:\n", 9);
  138.        
  139.         do
  140.         {
  141.             c = getchar();
  142.             userMessage[i++] = c;
  143.         } while (c != '\n');
  144.  
  145.         userMessage[i] = '\0';
  146.         i = 0;
  147.         printf("\n");
  148.  
  149.         // hello command
  150.         sprintf(buf2, HELO_COMMAND, MAIL_FROM);
  151.         sendToSMTP(buf2, serverfd);
  152.         memset(buf2, 0, sizeof(buf2));
  153.  
  154.         // from command
  155.         sprintf(buf2, FROM_COMMAND, MAIL_FROM);
  156.         sendToSMTP(buf2, serverfd);
  157.         memset(buf2, 0, sizeof(buf2));
  158.  
  159.         // rcpt command
  160.         sprintf(buf2, RCPT_TO, toUser);
  161.         sendToSMTP(buf2, serverfd);
  162.         memset(buf2, 0, sizeof(buf2));
  163.  
  164.         // subject command
  165.         sprintf(buf2, SUBJECT, userTheme);
  166.         sendToSMTP(buf2, serverfd);
  167.         memset(buf2, 0, sizeof(buf2));
  168.  
  169.         // data command
  170.         sprintf(buf2, MESSAGE, userMessage);
  171.         sendToSMTP(buf2, serverfd);
  172.         memset(buf2, 0, sizeof(buf2));
  173.  
  174.         // dot command
  175.         sendToSMTP(DOT, serverfd);
  176.  
  177.         // quit command
  178.         sendToSMTP(QUIT, serverfd);
  179.  
  180.         printf("Введите quit для выхода или enter для продолжения\n");
  181.         do
  182.         {
  183.             read(1, &userQuitCommand[i], 1);
  184.             i++;
  185.         } while (userQuitCommand[i - 1] != '\n');
  186.  
  187.         userQuitCommand[i - 1] = '\0';
  188.         i = strcmp(userQuitCommand, "quit");
  189.  
  190.     } while (i != 0);
  191.  
  192.     exit(EXIT_SUCCESS);
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement