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 gekommen 😃

    Gruß Thomas


Anmelden zum Antworten