Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <sys/socket.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <errno.h>
- #include <string.h>
- #include <sys/un.h>
- #include <arpa/inet.h>
- #define BUF_SIZE 256
- char MAIL_FROM[BUF_SIZE];
- char HELO_COMMAND[] = "EHLO %s\r\n";
- char FROM_COMMAND[] = "MAIL From: %s\n";
- char RCPT_TO[] = "RCPT TO: %s\r\n";
- char SUBJECT[] = "Subject: %s\r\n";
- char DATA[] = "DATA\r\n";
- char MESSAGE[] = "%s\r\n";
- char DOT[] = ".\r\n";
- char QUIT[] = "QUIT\r\n";
- char successMessage[] = "Команда отправлена успешно\r\n";
- char failureMessage[] = "Ошибка во время отправки команды\r\n";
- void printInterface (void)
- {
- char denom[BUF_SIZE / 2];
- memset(denom, '-', BUF_SIZE / 2);
- printf("%s\n", denom);
- printf("\tДанная программа обеспечивает функционал утилиты mail для отправки почтовых команд на указанный SMTP сервер.\n");
- printf("\tДля завершения ввода сообщения введите CTRL + D. Для завершения отправки почтовых комманд введите quit.\n");
- printf("%s\n", denom);
- printf("\n");
- }
- char *getResponseStatus(char *response)
- {
- char *ptr = response;
- char status[3];
- for (int i = 0; i < 3; i++)
- {
- status[i] = *ptr;
- ptr++;
- }
- if ((strcmp(status, "250")) == 0)
- {
- return successMessage;
- }
- else
- {
- return failureMessage;
- }
- }
- void sendToSMTP(char *message, int socketfd)
- {
- char response[512];
- memset(response, 0, sizeof(response));
- send(socketfd, message, strlen(message), 0);
- printf("Отправка сообщения: %s \n", message);
- recv(socketfd, response, sizeof(response), 0);
- if (strcmp(response, "") != 0)
- printf("%s \n", getResponseStatus(response));
- printf("\n");
- }
- int main(int argc, char *argv[])
- {
- if (argc < 2)
- {
- printf("Использование: /a.out <SMTP Server>\n");
- exit(-1);
- }
- struct sockaddr_in addr;
- struct hostent *host_by_name;
- socklen_t sock_addr_len = sizeof(addr);
- char *MAIL_TO = argv[1];
- char toUser[256];
- char userTheme[256];
- char userMessage[512];
- char buf[256];
- char buf2[256];
- char userQuitCommand[128];
- int i = 0;
- char c;
- char login[128];
- char hostname[128];
- int result;
- gethostname(MAIL_FROM, BUF_SIZE);
- host_by_name = gethostbyname(MAIL_TO);
- // инициализация сокета, получение дискриптора
- int serverfd = socket(AF_INET, SOCK_STREAM, 0);
- memset((char *)&addr, '\0', sock_addr_len);
- addr.sin_family = AF_INET;
- addr.sin_port = htons(25);
- addr.sin_addr.s_addr = *((unsigned long *)host_by_name->h_addr);
- char response[1024];
- memset(response, 0, sizeof(response));
- write(1, response, sizeof(response));
- recv(serverfd, response, sizeof(response), 0);
- printInterface();
- do
- {
- i = 0;
- write(1, "RCPT To: ", 9);
- do
- {
- read(1, &toUser[i], 1);
- i++;
- } while (toUser[i - 1] != '\n');
- toUser[i - 1] = '\0';
- i = 0;
- write(1, "Subject: ", 9);
- do
- {
- read(0, &userTheme[i], 1);
- i++;
- } while (userTheme[i - 1] != '\n');
- userTheme[i - 1] = '\0';
- i = 0;
- write(1, "Message:\n", 9);
- do
- {
- c = getchar();
- userMessage[i++] = c;
- } while (c != '\n');
- userMessage[i] = '\0';
- i = 0;
- printf("\n");
- // hello command
- sprintf(buf2, HELO_COMMAND, MAIL_FROM);
- sendToSMTP(buf2, serverfd);
- memset(buf2, 0, sizeof(buf2));
- // from command
- sprintf(buf2, FROM_COMMAND, MAIL_FROM);
- sendToSMTP(buf2, serverfd);
- memset(buf2, 0, sizeof(buf2));
- // rcpt command
- sprintf(buf2, RCPT_TO, toUser);
- sendToSMTP(buf2, serverfd);
- memset(buf2, 0, sizeof(buf2));
- // subject command
- sprintf(buf2, SUBJECT, userTheme);
- sendToSMTP(buf2, serverfd);
- memset(buf2, 0, sizeof(buf2));
- // data command
- sprintf(buf2, MESSAGE, userMessage);
- sendToSMTP(buf2, serverfd);
- memset(buf2, 0, sizeof(buf2));
- // dot command
- sendToSMTP(DOT, serverfd);
- // quit command
- sendToSMTP(QUIT, serverfd);
- printf("Введите quit для выхода или enter для продолжения\n");
- do
- {
- read(1, &userQuitCommand[i], 1);
- i++;
- } while (userQuitCommand[i - 1] != '\n');
- userQuitCommand[i - 1] = '\0';
- i = strcmp(userQuitCommand, "quit");
- } while (i != 0);
- exit(EXIT_SUCCESS);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement