djoka_l Beograd
Član broj: 56075 Poruke: 3569
Jabber: djoka_l
|
Evo ti jedan C program koji direktno priča sa mail serverom.
Pravio sam ga za Linux na kojem nisam imao baš ništa i nisam mogao ništa ni da dodam (otkačen sa interneta).
Code (c):
/*
**
** Datum: 20023-06-13
**
** Program salje HTML mail sa aplikacionog servera.
** mailx ne radi na produkcionom aplikacionom servru, a direktna konekcija
** na port 25 mail servera radi.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAIL_SERVER "mail.foo.com"
#define MAIL_PORT 25
#define BUFFER_SIZE 65536
/* Error handling */
void error (const char *msg ) {
perror(msg );
exit(1);
}
/* Send and receive bytes from socket */
void SMTPsend (int sock , const char *line , int waitresponse ) {
char buffer [BUFFER_SIZE ];
int n ;
if (line ) {
printf("%s", line );
n = write (sock , line , strlen(line ));
if (n < 0) error ("ERROR writing to socket");
}
bzero (buffer , BUFFER_SIZE );
if (waitresponse ) {
n = read (sock , buffer , BUFFER_SIZE - 1);
if (n < 0) error ("ERROR reading from socket");
printf("%s", buffer );
}
}
/* Opening socket */
int smtp_connect () {
int sockfd ;
struct sockaddr_in serv_addr ;
struct hostent *server ;
sockfd = socket (AF_INET , SOCK_STREAM , 0);
if (sockfd < 0) error ("ERROR opening socket");
server = gethostbyname (MAIL_SERVER );
if (server == NULL ) error ("ERROR, no such host");
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 (MAIL_PORT );
if (connect (sockfd , (struct sockaddr *) &serv_addr , sizeof(serv_addr )) < 0)
error ("ERROR connecting");
return sockfd ;
}
void usage (const char *name ) {
printf("\n\n\tUsage: \n\n");
printf("\t%s [-s SUBJECT] [-f FILENAME] MAIL_ADDRESS...\n\n", name );
printf("\tProgram sends HTML mail, where the mail body is in the FILENAME.\n");
printf("\tIf FILENAME is omitted, then program reads input from STDIN\n");
printf("\tMandatory parameter is list of email addresses,\n\n\n");
exit(1);
}
int main (int argc , char *argv []) {
char buffer [BUFFER_SIZE ];
int sockfd ;
FILE *input_stream = stdin ;
int opt ;
char *subject = "[No Subject]", *file_name = NULL ;
char *recipients [100];
char *sender = "Some-Sender";
int recipient_count = 0;
while ((opt = getopt (argc , argv , "s:f:")) != -1) {
switch (opt ) {
case 's': /* Subject */
subject = strdup (optarg );
break;
case 'f': /* File name */
file_name = strdup (optarg );
if ((input_stream = fopen(file_name , "r")) == NULL ) {
snprintf(buffer , sizeof(buffer ), "ERROR opening %s\n", file_name );
error (buffer );
}
break;
default:
usage (argv [0]);
}
}
if (optind == argc ) usage (argv [0]);
for (int i = optind ; i < argc ; i ++) {
recipients [recipient_count ] = argv [i ];
recipient_count ++;
}
sockfd = smtp_connect ();
/* Create mail header */
snprintf(buffer , sizeof(buffer ), "From: %s\r\nTo: ", sender );
for (int i = 0; i < recipient_count ; i ++) {
strcat(buffer , recipients [i ]);
if (i < recipient_count - 1) strcat(buffer , ", ");
}
strcat(buffer , "\r\nSubject: ");
strcat(buffer , subject );
strcat(buffer , "\r\nMIME-Version: 1.0\r\nContent-Type: text/html\r\n\r\n");
/* Read mail server greeting */
SMTPsend (sockfd , NULL , 1);
/* Greet mail server with EHLO */
SMTPsend (sockfd , "EHLO\r\n", 1);
/* Send FROM part */
SMTPsend (sockfd , "MAIL FROM:user@localhost\r\n", 1);
/* Send TO part */
for (int i = 0; i < recipient_count ; i ++) {
SMTPsend (sockfd , "RCPT TO:", 0);
SMTPsend (sockfd , recipients [i ], 0);
SMTPsend (sockfd , "\r\n", 1);
}
/* Intro into DATA transmission */
SMTPsend (sockfd , "DATA\r\n", 0);
/* Send actual mail */
SMTPsend (sockfd , buffer , 0);
/* Send email body */
while (fgets(buffer , sizeof(buffer ), input_stream ) != NULL ) {
SMTPsend (sockfd , buffer , 0);
}
/* Finish mail */
SMTPsend (sockfd , "\r\n.\r\nQUIT\r\n", 1);
/* Free allocated memory */
free(subject );
if (file_name ) free(file_name );
return 0;
}
|