OpenVMS Source Code Demos

SMTP-CHECK.C

#define MODULE_NAME	SMTPCHECK
#define MODULE_IDENT	"V1.0"
/*===========================================================================
 *  Program:	SMTP-CHECK.C
 *  Author:	Hunter Goatley (Process Software Corporation)
 *  Date:	October 17, 2006
 *  Purpose:	A quick and dirty program to connect to a remote SMTP
 *		server, issue a HELO, then QUIT.
 *  VMS Usage:  yada :== $CSMIS$USER3:[ADMCSM.NEIL]SMTP-CHECK.exe
 *              yada 127.0.0.1 80 *
 *===========================================================================
 */
#ifdef VMS
#ifdef __DECC
#pragma module MODULE_NAME MODULE_IDENT
#else
#ifdef vaxc
#module MODULE_NAME MODULE_IDENT
#endif /* vaxc */
#endif /* __DECC */
#include <in.h>
#include <ssdef.h>
#include <netdb.h>
#include <unixio.h>
#include <socket.h>
#define	EXITER(_sts)	return(_sts)
#else
#ifdef _WIN32
#include <winsock2.h>
#define SS$_ABORT 1

/* Define our macro to exit the appliction. */
#define	EXITER(_sts)	\
    WSACleanup() ;	\
    return(_sts) ;
#endif /* _WIN32 */
#endif /* VMS */
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    int sock, x;
    struct sockaddr_in sock2_name;
    struct sockaddr_in inet_sa;
    struct hostent *hostentptr;
    char inbuff[2000];
    char target_host[255];
    char target_domain[255];
    char my_host[255];
    char tmp[255];
    char *ptr;
    short wVer;

#ifdef _WIN32
    /*
     *  For WinSock, you have to call WSAStartup first
     */
    WSADATA wsaData;
    wVer = MAKEWORD(2,0) ;              	// request WinSock version 2.0
    if (WSAStartup(wVer,&wsaData) != 0)  {  	// if startup failed
        perror("wsastartup") ;
	EXITER(SS$_ABORT) ;
    }
#endif 
    if (gethostname(my_host, sizeof(my_host)))  {
	perror("error obtaining my name") ;
	EXITER(SS$_ABORT) ;
    }
    /*
    **  Assign channel to 1st BG device.
    */
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
	{
	perror("error creating socket");
	EXITER(SS$_ABORT);
	}

    if (argc != 2)
	{
	printf ("Usage: smtp-check hostname\n");
	exit (1);
	}

    strcpy (target_host, argv[1]);

    printf ("Checking SMTP server on host %s....\n", target_host);

    if ((hostentptr = gethostbyname ((char *) target_host)) == NULL)
	{
	perror( "gethostbyname");
	EXITER(SS$_ABORT);
	}

    sock2_name.sin_family = hostentptr->h_addrtype;
    sock2_name.sin_port = htons(25);		/* SMTP server */
    sock2_name.sin_addr = * ((struct in_addr *) hostentptr->h_addr);
    /*
    **  Connect to the SMTP server
    */
    if (!(connect(sock, (struct sockaddr *)&sock2_name,
		sizeof (sock2_name))) == 0)
	{
	perror("connect");
	EXITER(SS$_ABORT);
	}
    /*
    **   Read the 220 greeting banner
    */
    x = recv (sock, (char *) &inbuff, sizeof(inbuff), 0);
    if (x < 0) {
	perror("recv");
	EXITER(SS$_ABORT);
	}
    /*
    **  Make sure we got the 220 banner.  If so, send out the HELO command.
    */
    if (strstr(inbuff, "220") != 0) {
	sprintf (tmp, "helo %s\015\n", my_host);
	send (sock, (char *) tmp, strlen(tmp), 0);
	}
    /*
    **  Wait for the response from our HELO.
    */
    x = recv (sock, (char *) &inbuff, sizeof(inbuff), 0);
    if (x < 0) {
	perror("recv");
	EXITER(SS$_ABORT);
	}
    /*
    **  If we got a 250, all is well; send QUIT.
    */
    if (strstr(inbuff, "250") != 0) {
	printf("Successfully issued HELO command to %s\n", target_host);
	send (sock, "quit\015\n", 6, 0);
	}
    else
	{
	printf("Error receiving HELO 250 from remote host\n");
	printf("  reply: %s\n", inbuff);
	EXITER(SS$_ABORT);
	}
    /*
    **  Wait for the QUIT ack.
    */
    x = recv (sock, (char *) &inbuff, sizeof(inbuff), 0);
    if (x < 0) {
	perror("recv");
	EXITER(SS$_ABORT);
	}
    /*
    **  Make sure we got the 221 (successful ack).
    */
    if ((x > 0) && (strstr(inbuff, "221") == 0)) {
	printf("Error receiving QUIT 221 from remote host\n");
	inbuff[x] = '\0';
	printf("Buffer is: %s\n", inbuff);
	}
    close(sock);
    EXITER(0) ;
}

Back to Home
Neil Rieck
Waterloo, Ontario, Canada.