Kleines Mailprogramm
-
Hallo. Ich habe versucht eine Funktion zu schreiben die Mails sendet, das klappt jedoch nur bedingt.
Hier der Quellcode//--------------------------------------------------------------------------- #include <stdio.h> #include <dos.h> #include <winsock.h> int sendMail (char *mailserver, char *emailto, char *emailfrom,char *emailsubject, char *emailmessage); int main() { sendMail("smtp.mail.yahoo.de","meine.adresse@yahoo.de","absender@test.de","Betreff","Nachricht"); return 0; } int sendMail (char *mailserver, char *emailto, char *emailfrom, char *emailsubject, char *emailmessage) { SOCKET sockfd; WSADATA wsaData; FILE *smtpfile; struct hostent *host; // Hostinformationen struct sockaddr_in dest_addr; /* Hostaddressstruktur */ char temp[1024],inc[512]; int err; //smtpfile=fopen("Datei.txt","a+"); smtpfile = stdout; if (WSAStartup(MAKEWORD(1,1),&wsaData) == SOCKET_ERROR) { fputs("WSAStartup failed",smtpfile); system("pause"); WSACleanup(); return -1; } if ((host=gethostbyname(mailserver)) == NULL) { printf("gethostbyname: Fehler %d",WSAGetLastError()); system("pause"); exit(1); } printf("Hostname: %s\n==================\n",host->h_name); if ((sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0) { printf("socket Fehler %d",WSAGetLastError()); system("pause"); exit(1); } fputs("Connecting....\n",smtpfile); memset(&dest_addr,0,sizeof(dest_addr)); memcpy(&(dest_addr.sin_addr),host->h_addr_list[0],host->h_length); dest_addr.sin_family= host->h_addrtype; //AF_INET von gethostbyname dest_addr.sin_port= htons(25);// In network byte order kommentieren if (connect(sockfd, (struct sockaddr *)&dest_addr,sizeof(dest_addr)) == -1){ printf("connect: Fehler %d",WSAGetLastError()); system("pause"); exit(1); } if((err=recv(sockfd,inc,sizeof(inc),0))<0){ printf("recv: Fehler %d",WSAGetLastError()); system("pause"); exit(1); } inc[err] = '\0'; fputs(inc,smtpfile); strcpy(temp,"HELO me.me.com\r\n"); fputs(temp,smtpfile); send(sockfd,temp,strlen(temp),0); if((err=recv(sockfd,inc,sizeof(inc),0))<0){ printf("recv: Fehler %d",WSAGetLastError()); system("pause"); exit(1); } inc[err] = '\0'; fputs(inc,smtpfile); strcpy(temp,"MAIL FROM:<"); strncat(temp,emailfrom,strlen(emailfrom)); strncat(temp,">\r\n",3); fputs(temp,smtpfile); send(sockfd,temp,strlen(temp),0); if((err=recv(sockfd,inc,sizeof(inc),0))<0){ printf("recv: Fehler %d",WSAGetLastError()); system("pause"); exit(1); } inc[err] = '\0'; fputs(inc,smtpfile); strcpy(temp,"RCPT TO:<"); strncat(temp,emailto,strlen(emailto)); strncat(temp,">\r\n",3); fputs(temp,smtpfile); send(sockfd,temp,strlen(temp),0); if((err=recv(sockfd,inc,sizeof(inc),0))<0){ printf("recv: Fehler %d",WSAGetLastError()); system("pause"); exit(1); } inc[err] = '\0'; fputs(inc,smtpfile); strcpy(temp,"DATA\r\n"); fputs(temp,smtpfile); send(sockfd,temp,strlen(temp),0); if((err=recv(sockfd,inc,sizeof(inc),0))<0){ printf("recv: Fehler %d",WSAGetLastError()); system("pause"); exit(1); } inc[err] = '\0'; fputs(inc,smtpfile); strcat(temp,"From: "); strcat(temp,emailfrom); strcat(temp,"\r\n"); strcpy(temp,"To: "); strcat(temp,emailto); strcat(temp,"\r\n"); strcat(temp,"Subject: "); strcat(temp,emailsubject); strcat(temp,"\r\n"); strcat(temp,emailmessage); strcat(temp,"\r\n"); strcat(temp,".\r\n"); fputs(temp,smtpfile); send(sockfd,temp,strlen(temp),0); if((err=recv(sockfd,inc,sizeof(inc),0))<0){ printf("recv: Fehler %d",WSAGetLastError()); system("pause"); exit(1); } inc[err] = '\0'; fputs(inc,smtpfile); strcpy(temp,"QUIT \n"); fputs(temp,smtpfile); send(sockfd,temp,strlen(temp),0); if((err=recv(sockfd,inc,sizeof(inc),0))<0){ printf("recv: Fehler %d",WSAGetLastError()); system("pause"); exit(1); } inc[err] = '\0'; fputs(inc,smtpfile); fclose(smtpfile); closesocket(sockfd); WSACleanup(); return 0; } //---------------------------------------------------------------------------
Im Konsolenfester erscheint folgendes:
Hostname: smtp2-de.mai.vip.ukl.yahoo.com ============= Connecting... 220 smtp136.mail.ukl.yahoo.com ESMTP HELO me.me.com 250 smtp136.mail.ukl.yahoo.com MAIL FROM:<absender@test.de> 530 authentication requrend - for help go tp http://help.yahoo.com/help/us/mail/pop/pop-11.html RCPT TO:<meine.adresse@yahoo.de> 530 authentication requrend - for help go tp http://help.yahoo.com/help/us/mail/pop/pop-11.html DATA 354 Enter mail, end with "." on a line by itselt To: meine.adresse@yahoo.de Subject: Betreff Nachricht . 250 Mail accepted QUIT
Naja laut Yahoo wird die Mail akzeptiert, es kommt jedoch nichts an. Und wieso soll ich mich authentisieren? Ich sende doch nur eine Mail und empfange sie nicht. Und müsste nach dem "QUIT" noch ein "220 See you later" von Yahoo kommen? Nach einiger Zeit erscheint im Konsolenfenster dann folgendes:
421 Service not available ; Closing transmission
Gibt es vielleicht einen einfacheren Weg Mails zu versenden? (Ausser APIS)
Danke
-
Novio schrieb:
Und wieso soll ich mich authentisieren?
Vielleicht damit nicht jeder über smtp136.mail.ukl.yahoo.com SPAM verschickt? Bei den meisten smpt Servern, die ich kenne, muss man sich authentifizieren.
-
Ahhhh okay macht sinn. Das heisst ich muss das dann mit EHLO und so machen, also mit SMTP AUTH, richtig?
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hallo...
bist du weiter gekommen? Mich würde das auch interessieren wie sowas fertig geprogged aussieht, weil ich bin nicht mal soweit wie du gekommenGruß Thomas