C socket issue with SMTP


 
Thread Tools Search this Thread
Top Forums Programming C socket issue with SMTP
# 1  
Old 01-08-2010
C socket issue with SMTP

Hey guys, im trying to write a program that'll create a report then email the report... my problem is when it comes to the socket trying to send the second command after EHLO smtp,*.*

When the first command is sent its working fine... but when the program tries to send the second command it jams on bzero(buffer,256);... My understanding is bzero resets all values to 0 hence... clear the array buffer[] so it can be used again right? Why would the program execution stop???

Code:
/*---------EHLO SMTP-------------*/

    printf("Sending EHLO to SMTP\n");
   
    
    
    buffer[255] = "EHLO smtp.primus.ca";

    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

/*---------MAIL FROM-------------*/

    printf("Sending EHLO to SMTP\n");
   
    bzero(buffer,256);
    
    buffer[255] = "MAIL FROM: smtp.primus.ca";

    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

/*------------------------------*/

When im doing a fgets as below and enter the the commands to be sent to the SMTP it works perfectly...

Code:
printf("SMTP Command to be sent\n");
    bzero(buffer,256);
    fgets(buffer,255,stdin);
    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

BUT if I take off the fget because I need the things to be automated then it fails...

Code:
printf("Automated way\n");
    
    buffer[255] = "MAIL FROM: test@primustel.ca";

    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

Now I assume it fails to SMTP code 500 (unrecognized command) because the buffer array values wasn't cleared but when I add the bzero the halt the execution of the software then timeout the connection...

Code:
printf("Automated way\n");
     
    bzero(buffer,255);
    
    buffer[255] = "MAIL FROM: test@primustel.ca";

     n = write(sockfd,buffer,strlen(buffer));
     if (n < 0) 
          error("ERROR writing to socket");
     bzero(buffer,256);
     n = read(sockfd,buffer,255);
     if (n < 0) 
          error("ERROR reading from socket");
     printf("%s\n",buffer);

-------------------Whole codes----------------------


Code:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 

void error(char *msg)
{
    perror(msg);
    exit(0);
}

int main(int argc, char *argv[])
{

    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[256];
    if (argc < 3) {
       fprintf(stderr,"usage %s hostname port\n", argv[0]);
       exit(0);
    }
    portno = atoi(argv[2]);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
        error("ERROR opening socket");
    server = gethostbyname(argv[1]);
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);
    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) 
        error("ERROR connecting");


/*---------EHLO SMTP-------------*/

    printf("Sending EHLO to SMTP\n");
   
    
    
    buffer[255] = "EHLO smtp.primus.ca";

    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

/*---------MAIL FROM-------------*/

    printf("Sending EHLO to SMTP\n");
   
    
    
    buffer[255] = "MAIL FROM: test@primustel.ca";

    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

/*------------------------------*/    


return 0;
}

# 2  
Old 01-08-2010
Always remember you must not be assigning a string to array. You have to copy string to a array.
Changing
Code:
buffer[255] = "MAIL FROM: test@primustel.ca";

to
Code:
strcpy(buffer, "MAIL FROM: test@primustel.ca)";

solves the problem.
# 3  
Old 01-08-2010
Alright good to know, I tried as you said and it seems to work like the program pass the commands to the SMTP however it returns an error 501 (invalid characters or command) so im assuming its because strcpy is copying the \0 nul character at the end of the line and send it too... i tried using

Code:
strcpy(buffer, "MAIL FROM: test@primustel.ca)";

And it jams there to im not getting any further reply... for shit n' giggle i tried to make it one less character and im getting error 501 so im lost here... anyone as an idea of how i could send this command without the nul character properly? i tried it all by inputing the commands by hand and it works fine it just when it comes to store it in the buffer... i tried everything i just past the whole night on this im about to slam my PC in the middle of the road... lol
# 4  
Old 01-08-2010
Quote:
Originally Posted by Jess83
Alright good to know, I tried as you said and it seems to work like the program pass the commands to the SMTP however it returns an error 501 (invalid characters or command) so im assuming its because strcpy is copying the \0 nul character at the end of the line and send it too...
It's not. strlen() doesn't count the null in its length. It needs a null to work anyway, a string's not a string without it!

Code:
strcpy(buffer, "MAIL FROM: test@primustel.ca)";

I'm shocked this even compiles. Anyway that's plainly not what you intended.

I think mail servers need their commands finished with \r\n, not just \n.
# 5  
Old 01-08-2010
Tried the \n and \r\n didnt work same thing...

Code:
strcpy(buffer, "MAIL FROM: test@primustel.ca)";

Yeah i had noticed, i fixed it prior to try to compile but I dont think it would of neither Smilie

Im lost... like if I use it works fine with all commands...

Code:
printf("SMTP Command to be sent\n");
    bzero(buffer,256);
    fgets(buffer,255,stdin);
    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

Shouldn't

Code:
    fgets(buffer,255,stdin);
    n = write(sockfd,buffer,strlen(buffer));

be the same as

Code:
char *ehlo = "EHLO smtp.primus.ca";
n = write(sockfd,ehlo,strlen(buffer));

???

I was thinking could it be related to the fact that u can't really store letters but the decimal values of the letter but is converted in printf() as example with the %s ??? hence when sending whats stored in *ehlo it sends the decimal values and is not recognized by the smtp server???
# 6  
Old 01-08-2010
Quote:
Originally Posted by Jess83
Alright good to know, I tried as you said and it seems to work like the program pass the commands to the SMTP however it returns an error 501 (invalid characters or command) so im assuming its because strcpy is copying the \0 nul character at the end of the line and send it too... i tried using

Code:
strcpy(buffer, "MAIL FROM: test@primustel.ca)";

And it jams there to im not getting any further reply... for shit n' giggle i tried to make it one less character and im getting error 501 so im lost here... anyone as an idea of how i could send this command without the nul character properly? i tried it all by inputing the commands by hand and it works fine it just when it comes to store it in the buffer... i tried everything i just past the whole night on this im about to slam my PC in the middle of the road... lol

Why not fix your quotes?

s/b strcpy(buffer, "MAIL FROM: test@primustel.ca");
# 7  
Old 01-09-2010
Oh sorry that's already fixed but I was lazy and cut n' paste from the forum previous posts and forgot to change it after i cut n' pasted Smilie I had notice it right away when gautamdheeraj posted it... That wouldn't compile anyways hehe Smilie well i dont think it would... didnt try it but im sure it doesn't

---------- Post updated at 04:20 AM ---------- Previous update was at 12:18 AM ----------

Got it working, it worked with the \r\n I was making an error when negotiating with the smtp i had to put \n\n after the body and then ".\n" to close if it can be useful to anyone have fun.

Code:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 

void error(char *msg)
{
    perror(msg);
    exit(0);
}

int main(int argc, char *argv[])
{
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[256];
    if (argc < 3) {
       fprintf(stderr,"usage %s hostname port\n", argv[0]);
       exit(0);
    }
    portno = atoi(argv[2]);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
        error("ERROR opening socket");
    server = gethostbyname(argv[1]);
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);
    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) 
        error("ERROR connecting");
    
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

 bzero(buffer,256);

/*------------------------------*/

printf("EHLO");

    strcpy(buffer,"ehlo smtp.primus.ca\n");

    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

/*------------------------------*/    

/*------------------------------*/

printf("AUTH");

    strcpy(buffer,"AUTH LOGIN\n");

    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

/*------------------------------*/ 

/*------------------------------*/

printf("AUTH UID");

    strcpy(buffer,"amR1bnBoeUBwcmltdXMuY2E=\n");

    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

/*------------------------------*/ 

/*------------------------------*/

printf("AUTH PWD");

    strcpy(buffer,"YXAwbGwwMTE=\n");

    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

/*------------------------------*/ 

/*------------------------------*/

printf("MAIL FROM");

    strcpy(buffer,"MAIL FROM: test1@primus.ca\n");

    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

/*------------------------------*/ 

/*------------------------------*/

printf("MAIL TO");

        
    strcpy(buffer,"RCPT TO: test2@primustel.ca\n");

    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

/*------------------------------*/       

/*------------------------------*/

printf("DATA");

    strcpy(buffer,"DATA\r\n");

    n = write(sockfd,buffer,strlen(buffer));

    strcpy(buffer,"Subject: test\r\n");

    n = write(sockfd,buffer,strlen(buffer));

    strcpy(buffer,"SMTP MAIL TOOL TEST WORKS!!!\r\n");

    n = write(sockfd,buffer,strlen(buffer));

    strcpy(buffer,"\n\n");

    n = write(sockfd,buffer,strlen(buffer));

    strcpy(buffer,".\n");

    n = write(sockfd,buffer,strlen(buffer));


/*------------------------------*/ 

/*------------------------------*/ 

    strcpy(buffer,"quit\n");

    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
         error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

/*------------------------------*/

return 0;
}

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Solaris

NIS/smtp services issue on Solaris 11

Hi, Few services not starting on new build Solaris 11 non-global zone. I uninstalled zone and reinstalled and still same issue, while global zone is working fine. smpt service is going into maintenance mode and /var/svc/log/network-smtp:sendmail.log shows that it tries and then dead ... (0 Replies)
Discussion started by: solaris_1977
0 Replies

2. Solaris

OutBound SMTP Server Mail issue

Hi all I have a Live SMTP server for outbound mails ( Mail being sent from my organization to outside domains). A large chunk of mails are not being sent and reside in /var/spool/mqueue directory. The header of there mails are: From: Mail Delivery Subsystem <MAILER-DAEMON> How can I... (0 Replies)
Discussion started by: Junaid Subhani
0 Replies

3. IP Networking

Clarification - Setting socket options at the same time when socket is listening

I need clarification on whether it is okay to set socket options on a listening socket simultaneously when it is being used in an accept() call? Following is the scenario:- -- Task 1 - is executing in a loop - polling a listen socket, lets call it 'fd', (whose file descriptor is global)... (2 Replies)
Discussion started by: jake24
2 Replies

4. Programming

perl socket issue

Hi I am teaching myself perl and am writing a socket application to get experience. I am using Eclipse with the EPIC plugin to run the code in debug mode. I think that sometimes the script is not releasing the port if I terminate it in debug mode as I am occasionally getting the message: - ... (3 Replies)
Discussion started by: steadyonabix
3 Replies

5. Linux

SMTP issue

HI, I am having an issue with the mail. I had certain scripts who used to send mails. now i am not getting the mails as usual. need help to track the issue and resolve. mailx -s "Testing for details" xxx@yyy.zzz above code is used for mailing. can yoou please help? (2 Replies)
Discussion started by: onlyniladri
2 Replies

6. Programming

socket function to read a webpage (socket.h)

Why does this socket function only read the first 1440 chars of the stream. Why not the whole stream ? I checked it with gdm and valgrind and everything seems correct... #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include... (3 Replies)
Discussion started by: cyler
3 Replies

7. Programming

which socket should socket option on be set

Hi all, On the server side, one socket is used for listening, the others are used for communicating with the client. My question is: if i want to set option for socket, which socket should be set on? If either can be set, what's the different? Again, what's the different if set option... (1 Reply)
Discussion started by: blademan100
1 Replies

8. UNIX for Advanced & Expert Users

connect problem for sctp socket (ipv6 socket) - Runtime fail Invalid Arguments

Hi, I was porting ipv4 application to ipv6; i was done with TCP transports. Now i am facing problem with SCTp transport at runtime. To test SCTP transport I am using following server and client socket programs. Server program runs fine, but client program fails giving Invalid Arguments for... (0 Replies)
Discussion started by: chandrutiptur
0 Replies

9. Programming

Performance issue with C++ ,Socket

Hi all, I am facing some problem in Socket programming(C++ & Solaris 5.0).I am using socket as basic connecting point & MEP(Mesagae Exchange Protocol) as high level protocol to send & receive Message & ACK, between two different system. MEP is a protocol through which you can send MSG... (0 Replies)
Discussion started by: amartya_sock
0 Replies

10. UNIX for Dummies Questions & Answers

SMTP - emailing issue

We are running an application engine program that sends email to a list of users. In our Test Env, users are able to receive the emails but in our Prod environment, they do not. We are running the same program, and using the same stmp config. any idea on how to troubleshoot? (3 Replies)
Discussion started by: tads98
3 Replies
Login or Register to Ask a Question