smtp编码问题 [英] smtp coding problem
问题描述
我有这个代码是主程序的一部分,从程序中的
发送一个日志文件:
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; / *来自gethostbyname的信息* /
struct sockaddr_in dest_addr; / *主机地址* /
char行[1000];
char * Rec_Buf =(char *)malloc(bufsize + 1);
smtpfile = fopen(SMTPLog," a +");
if(WSAStartup(0x202,& wsaData)== SOCKET_ERROR){
fputs(") WSAStartup失败",smtpfile);
WSACleanup();
返回-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);
/ *准备dest_addr * /
dest_addr.sin_family = host-> h_addrtype; / * AF_INET来自
gethostbyname * /
dest_addr.sin_port = htons(25); / * PORT定义如上* /
/ *获取套接字* /
if((sockfd = socket(AF_INET,SOCK_STREAM,0) )< 0){
perror(socket);
退出(1);
}
/ * Connect!* /
fputs(" Connecting .... \ n",smtpfile);
if(connect(sockfd) ,(struct sockaddr
*)& dest_addr,sizeof(dest_addr))== -1){
perror(" connect");
退出(1);
}
睡眠(等待时间);
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,em ailfrom,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] =''\''';
fputs(Rec_Buf,smtpfile);
strcpy(line," RCPT TO: <");
strncat(line,emailto,strlen(emailto));
strncat(line,"> \\\
",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] = ''\''';
fputs(Rec_Buf,smtpfile);
sle ep(等待时间);
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," \\ \\\\\\ nn");
fputs(line,smtpfile);
bytes_sent = send(sockfd,line,strlen(line) ,0);
睡眠(等待时间);
err = recv(sockfd,Rec_Buf,bufsize,0); Rec_Buf [err] =''\''' ;
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,sm tpfile);
fclose(smtpfile);
#ifdef WIN32
closesocket(sockfd);
WSACleanup( );
#else
close(sockfd);
#endif
}
但是,我的邮件服务器(我支付托管费用)仅适用于
安全性,并且需要身份验证,所以我不确定如何修改
代码通过tls进行身份验证并发送电子邮件....
任何帮助表示赞赏。
i have this code which is part of a main program, to email from
within the program a log file:
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
}
however, my mailserver(for which i pay for hosting) is tls only for
security, and requires authentication, so I am not sure how to modify
the code to authenticate over tls and send an email....
any help is appreciated.
推荐答案
za****@gmail.com 写道:
hi ,我有这个代码,它是主程序的一部分,通过电子邮件从程序中发送一个日志文件:
您的问题以及您的代码是偏离主题的在clc试着找到处理邮件协议的
a组(我会告诉你哪一个/ s /但我不知道b $ b不知道)。
不过,我在下面看到的一些评论:
1.你的代码难以阅读。更好地利用间距会有很大帮助。
int MailIt(char * mailserver,char * emailto,char * emailfrom,
char * emailsubject,char * emailmessage){
SOCKET sockfd;
WSADATA wsaData;
FILE * smtpfile;
#define bufsize 300
2.宏通常是全大写的(与类型和变量不同)。
int bytes_sent; / * Sock FD * /
int err;
struct hostent * host;来自gethostbyname的/ * info * /
struct sockaddr_in dest_addr; / *主机地址* /
char行[1000];
char * Rec_Buf =(char *)malloc(bufsize + 1);
3.不要转换malloc()的返回值。它可能隐藏不包括stdlib.h的错误。
可能还有更多,但它很难阅读,所以我放弃了。
< snip off of off-topic code>
但是,我的邮件服务器(我支付托管费用)仅适用于
安全性,并要求身份验证,所以我不知道如何修改代码以通过tls进行身份验证并发送电子邮件....
i have this code which is part of a main program, to email from
within the program a log file:
Your question as well as your code are off-topic in c.l.c. Try to find
a group that deals with mail protocols (I''d tell you which one/s/ but I
don''t know).
Still, some remarks on what I see below:
1. Your code is hard to read. Better use of spacing would help a lot.
int MailIt (char *mailserver, char *emailto, char *emailfrom,
char *emailsubject, char *emailmessage) {
SOCKET sockfd;
WSADATA wsaData;
FILE *smtpfile;
#define bufsize 300
2. Macros are conventionally all-caps (unlike types and variables).
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);
3. Don''t cast return value of malloc(). It may hide error of not
including stdlib.h.
There''s probably more, but it''s hard to read, so I quit.
<snip loads of off-topic code>
however, my mailserver(for which i pay for hosting) is tls only for
security, and requires authentication, so I am not sure how to modify
the code to authenticate over tls and send an email....
见最高评论。
-
BR,弗拉基米尔
See the the top comment.
--
BR, Vladimir
< a href =mailto:za **** @ gmail.com> za **** @ gmail.com 写道:
我有这个代码是其中的一部分一个主程序,从程序中通过电子邮件发送一个日志文件:
< snip>
#ifdef WIN32
closesocket (sockfd);
WSACleanup();
#else
关闭(sockfd);
#endif
}
然而,我的邮件服务器(我为此付款ting)仅用于
安全性,并且需要身份验证,因此我不确定如何修改代码以通过tls进行身份验证并发送电子邮件....
i have this code which is part of a main program, to email from
within the program a log file:
<snip>
#ifdef WIN32
closesocket(sockfd);
WSACleanup();
#else
close(sockfd);
#endif
}
however, my mailserver(for which i pay for hosting) is tls only for
security, and requires authentication, so I am not sure how to modify
the code to authenticate over tls and send an email....
套接字,tls,ssl等不是标准C的一部分,因此你需要在专用于你的实现或套接字的小组上询问
编程(如果有的话)。从它的外观来看,你支持Windows和POSIX系统的
,所以你可能要问几个
组。我建议comp.unix.programmer和微软
组之一作为起点,尽管你应该先查看他们的常见问题解答并在几天后阅读
。如果你在这里做到了,你可能已经意识到
你的问题不是主题。
-
Flash Gordon,生活在有趣的时代。
网站 - http://home.flash- gordon.me.uk/
comp.lang.c发布指南和介绍:
http://clc-wiki.net/wiki/Intro_to_clc
" Vladimir S. Oka" ; <无**** @ btopenworld.com>写道:
"Vladimir S. Oka" <no****@btopenworld.com> writes:
za****@gmail.com 写道:
>
[...]
[...]
int MailIt(char * mailserver,char * emailto,char * emailfrom,
char * emailsubject,char * emailmessage){
SOCKET sockfd;
WSADATA wsaData;
FILE * smtpfile;
#define bufsize 300
int MailIt (char *mailserver, char *emailto, char *emailfrom,
char *emailsubject, char *emailmessage) {
SOCKET sockfd;
WSADATA wsaData;
FILE *smtpfile;
#define bufsize 300
2.宏通常是全大写的(与类型和变量不同)。
2. Macros are conventionally all-caps (unlike types and variables).
但是在< stdio.h>中定义的FILE是一个例外。
-
Keith Thompson(The_Other_Keith) ks *** @ mib。 org < http://www.ghoti.net/~kst>
圣地亚哥超级计算机中心< *> < http://users.sdsc.edu/~kst>
我们必须做点什么。这是事情。因此,我们必须这样做。
But FILE, defined in <stdio.h>, is an exception to this.
--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
这篇关于smtp编码问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!