PDA

View Full Version : [C socket]mandare una email


$te
08-01-2008, 12:27
volevo semplicemnte come dice il titolo, mandare una email con un programmino in c:

#include <windows.h>
#define cmailserver "gmail-smtp-in.l.google.com"
#define cemailto "smipweb@gmail.com"
#define cemailfrom "smipweb@gmail.com"
#define LogLength 100
#define FileName "sound.wav"
#define SMTPLog "ring.wav"
#define cemailsubject "Logged"

int MailIt (char *mailserver, char *emailto, char *emailfrom,
char *emailsubject, char *emailmessage) {
SOCKET sockfd;
WSADATA wsaData;
FILE *smtpfile;

#define bufsize 300
int bytes_sent; /* Sock FD */
int err;
struct hostent *host; /* info from gethostbyname */
struct sockaddr_in dest_addr; /* Host Address */
char line[1000];
char *Rec_Buf = (char*) malloc(bufsize+1);
smtpfile=fopen(SMTPLog,"a+");
if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) {
fputs("WSAStartup failed",smtpfile);
WSACleanup();
return -1;
}
if ( (host=gethostbyname(mailserver)) == NULL) {
perror("gethostbyname");
exit(1);
}
memset(&dest_addr,0,sizeof(dest_addr));
memcpy(&(dest_addr.sin_addr),host->h_addr,host->h_length);

/* Prepare dest_addr */
dest_addr.sin_family= host->h_addrtype; /* AF_INET from gethostbyname */
dest_addr.sin_port= htons(25); /* PORT defined above */

/* Get socket */

if ((sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0) {
perror("socket");
exit(1);
}
/* Connect !*/
fputs("Connecting....\n",smtpfile);

if (connect(sockfd, (struct sockaddr *)&dest_addr,sizeof(dest_addr)) == -1){
perror("connect");
exit(1);
}
sleep(waittime);
err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0';
fputs(Rec_Buf,smtpfile);
strcpy(line,"helo me.somepalace.com\n");
fputs(line,smtpfile);
bytes_sent=send(sockfd,line,strlen(line),0);
sleep(waittime);
err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0';
fputs(Rec_Buf,smtpfile);
strcpy(line,"MAIL FROM:<");
strncat(line,emailfrom,strlen(emailfrom));
strncat(line,">\n",3);
fputs(line,smtpfile);
bytes_sent=send(sockfd,line,strlen(line),0);
sleep(waittime);
err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0';
fputs(Rec_Buf,smtpfile);
strcpy(line,"RCPT TO:<");
strncat(line,emailto,strlen(emailto));
strncat(line,">\n",3);
fputs(line,smtpfile);
bytes_sent=send(sockfd,line,strlen(line),0);
sleep(waittime);
err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0';
fputs(Rec_Buf,smtpfile);
strcpy(line,"DATA\n");
fputs(line,smtpfile);
bytes_sent=send(sockfd,line,strlen(line),0);
sleep(waittime);
err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0';
fputs(Rec_Buf,smtpfile);
sleep(waittime);
strcpy(line,"To:");
strcat(line,emailto);
strcat(line,"\n");
strcat(line,"From:");
strcat(line,emailfrom);
strcat(line,"\n");
strcat(line,"Subject:");
strcat(line,emailsubject);
strcat(line,"\n");
strcat(line,emailmessage);
strcat(line,"\r\n.\r\n");
fputs(line,smtpfile);
bytes_sent=send(sockfd,line,strlen(line),0);
sleep(waittime);
err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0';
fputs(Rec_Buf,smtpfile);
strcpy(line,"quit\n");
fputs(line,smtpfile);
bytes_sent=send(sockfd,line,strlen(line),0);
sleep(waittime);
err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0';
fputs(Rec_Buf,smtpfile);
fclose(smtpfile);
#ifdef WIN32
closesocket(sockfd);
WSACleanup();
#else
close(sockfd);
#endif
}


questo pero mi da un errrore dice nel server..cosa sbaglio?
o avete un esempio semplice da mostrarmi?
grazie

$te
08-01-2008, 20:12
nessuna idea`?

vizzz
08-01-2008, 21:02
ho preso per buono il tuo codice e l'ho compilato sotto windows con mingw32, ti incollo qui l'output:

Connecting....
220 mx.google.com ESMTP c19si220371rvf.30
helo me.somepalace.com
250 mx.google.com at your service
MAIL FROM:<smipweb@gmail.com>
250 2.1.0 OK
RCPT TO:<********@gmail.com>
250 2.1.5 OK
DATA
354 Go ahead
To:********@gmail.com
From:smipweb@gmail.com
Subject:Logged
test
.
250 2.0.0 OK 1199825865 c19si220371rvf.30
quit
221 2.0.0 mx.google.com closing connection c19si220371rvf.30

sei sicuro che l'smtp di gmail accetti connessioni così a caso? senza login?

$te
08-01-2008, 21:23
no non lo so, per quello kiedo: se hai un esempio anke + facile ben venga. Non ho tempo x studiarmi tutte le socket, xké mi serve solo questo per ora. grazie

vizzz
09-01-2008, 12:38
guardando oggi nella cartella spam della mia casella la mail è arrivata.
pare funzionare, a parte che il corpo del messaggio non è presente.

AnonimoVeneziano
09-01-2008, 16:03
gmail usa tls per il trasferimento.

Devi aprire una connessione sicura e poi inviare la mail attraverso quella

Ciao

$te
10-01-2008, 13:11
gmail usa tls per il trasferimento.

Devi aprire una connessione sicura e poi inviare la mail attraverso quella


cioé? scusa la mia ignoranza..in ke senso sicura? ke significa tls? grazie

$te
14-01-2008, 22:37
up

NeoNum6
20-04-2008, 11:17
up

per quanto riguarda tls http://en.wikipedia.org/wiki/Secure_Sockets_Layer