//kleines mailprogramm ohne SMTP-Authentifizierung / richard@borwinius.de // gcc sndmail.c -o sndmail -Wall #include #include #include #include #include #include #include #include #include int MySnd(char *SMTPsrv,char *From,char *To,char *ReplyTo, char *Subject, char *Mail) { struct servent *lpServ; unsigned long addr; int s, iProtocolPort; struct sockaddr_in sockadd; struct hostent *host_info; char *seps = "\r", *token = NULL; char StrRcv[1024], StrSnd[1024], ContentType[1024]; if (strcmp(SMTPsrv, "") == 0) { // Fehler kein Server perror("kein SMTPsrv ?\n"); return(1); } if (strcmp(To, "") == 0) { // Fehler kein Adressat perror("kein Adressat ?\n"); return(2); } memset(&sockadd,0,sizeof(sockadd)); if ((addr = inet_addr(SMTPsrv)) != INADDR_NONE) { memcpy ((char *)&sockadd.sin_addr,&addr,sizeof(addr)); } else { host_info = gethostbyname(SMTPsrv); if (host_info == NULL) { // falscher Server fprintf(stderr,"%s existiert nicht oder kann nicht aufgelöst werden\n", SMTPsrv); return(3); } } memcpy((char *)&sockadd.sin_addr,host_info->h_addr,host_info->h_length); s = socket(PF_INET, SOCK_STREAM, 0); if (s < 0) { perror("INVALID_SOCKET\n"); return(4); } lpServ = getservbyname("mail", NULL); // SMTPPort ermitteln if (lpServ == NULL) { iProtocolPort = htons(IPPORT_SMTP); } else { iProtocolPort = lpServ->s_port; } sockadd.sin_family = AF_INET; sockadd.sin_port = iProtocolPort; if (connect(s, (struct sockaddr*)&sockadd, sizeof(sockadd))) { // kein Connect perror("connect\n"); return(5); } // memset(StrRcv,'\0' , sizeof(StrRcv)); // recv(s, StrRcv, sizeof(StrRcv), 0); strcpy(StrSnd, "HELO "); //Verbindung mit Server herstellen strcat(StrSnd, SMTPsrv); strcat(StrSnd, "\r\n"); send(s, StrSnd, strlen(StrSnd), 0); memset(StrRcv, '\0', sizeof(StrRcv)); recv(s, StrRcv, sizeof(StrRcv), 0); if (strcmp(From, "") == 0) { perror("kein Absender ?\n"); strcpy(From, StrSnd); } sprintf(StrSnd, "MAIL FROM : <%s>\r\n", From); // Absender angeben send(s, StrSnd, strlen(StrSnd), 0); memset(StrRcv, '\0', sizeof(StrRcv)); recv(s, StrRcv, sizeof(StrRcv), 0); sprintf(StrSnd, "RCPT TO :<%s>\r\n", To); // Empfänger angeben send(s, StrSnd, strlen(StrSnd), 0); memset(StrRcv, '\0', sizeof(StrRcv)); recv(s, StrRcv, sizeof(StrRcv), 0); if(strstr(StrRcv, "550") != NULL){ //unable to relay fprintf(stderr,"StrRcv: %s\n",StrRcv); strcpy(StrSnd, "QUIT\r\n"); send(s, StrSnd, strlen(StrSnd), 0); return(6); } strcpy(StrSnd, "DATA\r\n"); //Daten übergeben send(s, StrSnd, strlen(StrSnd), 0); memset(StrRcv, '\0', sizeof(StrRcv)); recv(s, StrRcv, sizeof(StrRcv), 0); //strcpy(StrSnd, "X-Mailer: "); strcpy(StrSnd, "Content-Type: "); strcat(StrSnd,ContentType);strcat(StrSnd,"\r\n"); send(s, StrSnd, strlen(StrSnd), 0); strcpy(StrSnd, "From: "); strcat(StrSnd,From);strcat(StrSnd,"\r\n"); send(s, StrSnd, strlen(StrSnd), 0); strcpy(StrSnd, "To: "); strcat(StrSnd,To);strcat(StrSnd,"\r\n"); send(s, StrSnd, strlen(StrSnd), 0); if (strcmp(ReplyTo, "") != 0) { sprintf(StrSnd, "Reply-To: %s\r\n", ReplyTo); // Rückantwortadresse send(s, StrSnd, strlen(StrSnd), 0); } sprintf(StrSnd, "Subject: %s \r\n", Subject); // Betreff send(s, StrSnd, strlen(StrSnd), 0); strcpy(StrSnd, "\r\n"); send(s, StrSnd, strlen(StrSnd), 0); token = strtok(Mail, seps); while (token != NULL) { if (token[0] == '\n') { strcpy(StrSnd, token + 1); } else { strcpy(StrSnd, token); } strcat(StrSnd, "\r\n"); send(s, StrSnd, strlen(StrSnd), 0); token = strtok(NULL, seps); } strcpy(StrSnd, ".\r\n"); // Ende der Daten send(s, StrSnd, strlen(StrSnd), 0); memset(StrRcv, '\0', sizeof(StrRcv)); recv(s, StrRcv, sizeof(StrRcv), 0); if(strstr(StrRcv, "500") != NULL){ fprintf(stderr,"StrRcv: %s\n",StrRcv); strcpy(StrSnd, "QUIT\r\n"); // Ende der Verbindung send(s, StrSnd, strlen(StrSnd), 0); return(7); } strcpy(StrSnd, "QUIT\r\n"); // Ende der Verbindung send(s, StrSnd, strlen(StrSnd), 0); memset(StrRcv, '\0', sizeof(StrRcv)); recv(s, StrRcv, sizeof(StrRcv), 0); close(s); return(0); } //------------------------------------------- int main(void) { char *SMTPsrv = "meinSMTPsrv"; char *From = "ich@irgendwo.net"; char *To = "admin@myDom.ain"; char *ReplyTo = "staff@myDom.ain"; char *Subject = "testmailueberschrift"; char Mail[] = "erste Zeile\nzweite Zeile"\ " abcdefg"; return MySnd(SMTPsrv,From,To,ReplyTo,Subject,Mail); // Mails senden }