Mail-AddressCheck.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /*-----------------------------------------------------------------------------
  2. mail_addr_check.c (c) 2015 by Siegrist(SystemLoesungen) <PSS @ ZweierNet.ch>
  3. # http://pss.ZweierNet.ch
  4. #
  5. # This program is absolutely free software.
  6. # Use it as you like but don't point the finger of blame to me ;)
  7. #
  8. params: [-v] verbose to stdout
  9. mailserverr to connect
  10. port on server to connect
  11. email-adress to check
  12. returns: true(1) if mailaddress exists
  13. false(0) else
  14. Each command sent to the server is represented in the commands[] array ascending from commands[0] to commands[n].
  15. Fit it to your own taste.
  16. Don't forget the trailing "\r\n", sometimes this might be "\n".
  17. Compile with 'gcc -o mail_addr_check mail_addr_check.c'
  18. ------------------------------------------------------------------------------
  19. */
  20. #include <stdlib.h>
  21. #include <stdio.h>
  22. #include <sys/types.h>
  23. #include <sys/socket.h>
  24. #include <netinet/in.h>
  25. #include <netdb.h>
  26. #include <string.h>
  27. #include <ctype.h>
  28. #define VERSION "V0.5"
  29. #define BUFLEN 1024
  30. #define TRUE 1
  31. #define FALSE 0
  32. #define NUMELEMS(a) (sizeof(a) / sizeof((a)[0]))
  33. int verbose = TRUE;
  34. static char *commands[] = { "HELO xy\r\n",
  35. "RSET\r\n",
  36. "MAIL FROM: mailverification@zweiernet.ch\r\n",
  37. "RCPT TO: <__mail_to_check__>\r\n" };
  38. /*-- Subs -------------------------------------- */
  39. void error(char *msg) {
  40. perror(msg);
  41. exit(0);
  42. }
  43. void usage(char *prog) {
  44. fprintf(stderr,"usage %s [-v] < mailserver-to-check-for > < port-on-server-25-or-587 > < email-adress-to-check >\n", prog);
  45. exit(0);
  46. }
  47. char *replace_str(char *str, char *orig, char *rep) {
  48. static char bu[BUFLEN];
  49. char *p;
  50. if(!(p = strstr(str, orig)))
  51. return str;
  52. strncpy(bu, str, p-str);
  53. bu[p-str] = '\0';
  54. sprintf(bu+(p-str), "%s%s", rep, p+strlen(orig));
  55. return bu;
  56. }
  57. /*-- Main -------------------------------------- */
  58. main(int argc, char *argv[]) {
  59. register int sockfd;
  60. register int n;
  61. register int indx;
  62. register int i, j;
  63. int port;
  64. struct sockaddr_in serv_addr;
  65. struct hostent *server;
  66. struct in_addr *p;
  67. unsigned char *mail_to_check, *ret;
  68. unsigned char buffer[BUFLEN];
  69. setbuf(stdout, NULL); // flush stdout
  70. /*-- program args */
  71. i = 1;
  72. if (argc < 4)
  73. usage(argv[0]);
  74. if (argc == 5) {
  75. if (strcmp(argv[i], "-v") == 0) {
  76. verbose = TRUE;
  77. i++;
  78. } else usage(argv[0]);
  79. }
  80. server = gethostbyname(argv[i]); i++;
  81. if ( server == NULL)
  82. error("unknown host.");
  83. port = atoi(argv[i]); i++;
  84. memcpy((char *)&mail_to_check, &argv[i], sizeof(argv[i]));
  85. /*-- create socket */
  86. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  87. error("ERROR opening socket");
  88. /*-- connect to server */
  89. bzero((char *) &serv_addr, sizeof(serv_addr));
  90. memcpy((char *)&serv_addr.sin_addr, server->h_addr, server->h_length);
  91. serv_addr.sin_family = AF_INET;
  92. serv_addr.sin_port = htons((u_short)port);
  93. if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
  94. error("ERROR connecting");
  95. bzero(buffer, BUFLEN);
  96. if (n = recv(sockfd, buffer, BUFLEN, 0) < 0)
  97. error("ERROR reading from socket");
  98. if (verbose) printf("%s\n", buffer);
  99. /*-- write n read to/from socket*/
  100. indx=0;
  101. while ( indx < NUMELEMS(commands) ) {
  102. char * ret = replace_str(commands[indx], "__mail_to_check__", mail_to_check);
  103. if (verbose) printf("%s", ret);
  104. if (n = send(sockfd, ret, strlen(ret), 0) < 0 )
  105. error("ERROR writing to socket");
  106. bzero(buffer, BUFLEN);
  107. if ( n = recv(sockfd, buffer, BUFLEN, 0) < 0 )
  108. error("ERROR reading from socket");
  109. if (verbose) printf("%s\n",buffer);
  110. indx++;
  111. }
  112. /*-- return value and exit */
  113. for (j = strlen(buffer)-5; buffer[j]; j++) buffer[j] = tolower(buffer[j]);
  114. if (strstr(buffer, "ok") != NULL) {
  115. if (verbose) printf("OK\n");
  116. exit(TRUE);
  117. } else {
  118. if (verbose) printf("NOK\n");
  119. exit(FALSE);
  120. }
  121. }