如何用c语言编写发邮件程序,分享:纯C语言实现发送电子邮件的函数

mysendmail 函数即可:

void WriteLog(char *context)

{

char time[BUFFERSIZE];

SYSTEMTIME st;

FILE *log ;

if (!WRITELOG) return;

if (0 == strlen(context))

{

sprintf(time,"=======================================================================================\n");

}

else

{

GetLocalTime(&st);

sprintf(time,"%d-%d-%d %d : %d : %d  %s\n",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,context);

}

if (0==(log=fopen("Mail.log","at"))) return;

fputs(time,log);

fclose(log);

}

bool Initwsa(BYTE minorver,BYTE majorver)

{

WSADATA  wsadata;

WORD sockversion=MAKEWORD(minorver,majorver);

if (WSAStartup(sockversion,&wsadata)!=0)

{

char err[BUFFERSIZE];

sprintf(err, "[WSAStartup]error code:

%d",WSAGetLastError());

WriteLog(err);

return false;

}

return true;

}

bool SetSocket( SOCKET *pSock, struct sockaddr_in *pTo, char *

smtpName)

{

struct hostent *pHostent = NULL;

char err[BUFFERSIZE];

int TimeOut;

pHostent = gethostbyname(smtpName);

if( NULL == pHostent )

{

sprintf(err, "Error at gethostbyname(%s): %d", smtpName,

WSAGetLastError() );

WriteLog(err);

return false;

}

*pSock = socket(AF_INET,SOCK_STREAM,0);

if( INVALID_SOCKET == *pSock )

{

sprintf(err, "Error at socket(): %d", WSAGetLastError()

);

WriteLog(err);

return false;

}

TimeOut=3000;

if(setsockopt(*pSock,SOL_SOCKET,SO_SNDTIMEO,(char

*)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){return

false;}

if(setsockopt(*pSock,SOL_SOCKET,SO_RCVTIMEO,(char

*)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){return false;}

pTo->sin_family = AF_INET;

pTo->sin_port = htons(25);

memcpy( &pTo->sin_addr.S_un.S_addr,

pHostent->h_addr_list[0], pHostent->h_length );

return true;

}

void Clear(SOCKET * socket)

{

closesocket(*socket);

WSACleanup();

}

bool Connect(SOCKET Sock,struct sockaddr_in to, int

size)

{

char err[BUFFERSIZE];

unsigned long ul = 1;

struct timeval timeout ;

fd_set r;

int ret;

sprintf(err, "Connected to the SMPT server %s ...",

inet_ntoa(to.sin_addr));

WriteLog(err);

if (ioctlsocket(Sock, FIONBIO, &ul)==SOCKET_ERROR ){return

false;}

connect(Sock, (struct sockaddr*)&to, size);

FD_ZERO(&r);

FD_SET(Sock, &r);

timeout.tv_sec = 3;

timeout.tv_usec =0;

ret = select(0, 0, &r, 0, &timeout);

if (ret == 0) {Clear(&Sock); return false; }

else if (ret < 0) {Clear(&Sock); return false; }

ul=0;

if (SOCKET_ERROR == ioctlsocket(Sock, FIONBIO,

&ul)){Clear(&Sock); return false;}

ZeroMemory(err, BUFFERSIZE);

if ( SOCKET_ERROR == recv(Sock, err, BUFFERSIZE, 0 ) )

{

sprintf(err, "Error at recv() :%d", WSAGetLastError());

WriteLog(err);

Clear( &Sock );

return false;

}

else

{

WriteLog(err);

}

return true;

}

void MakeCmd(char *cmd, char *strcmd, char* strparam)

{

ZeroMemory(cmd, BUFFERSIZE);

sprintf( cmd, "%s%s%s",strcmd, strparam, "\r\n");

}

bool SendMailCmd(SOCKET sock, char * cmd, char*

response)

{

int retConnect = send(sock, cmd, (int)strlen(cmd),

0);

WriteLog("Send: ");

WriteLog(cmd);

if(SOCKET_ERROR == retConnect)

{

WriteLog("Send Failure.\n");

Clear( &sock );

return false;

}

ZeroMemory(cmd, BUFFERSIZE);

retConnect = recv(sock, cmd, BUFFERSIZE,

0);

if(SOCKET_ERROR == retConnect)

{

WriteLog("Recv Failure.\n");

Clear( &sock );

return false;

}

else

{

WriteLog(cmd);

if ((strlen(response) != 0)&&(response[0] != cmd[0] ||

response[1] != cmd[1] || response[2] != cmd[2]))

{

WriteLog("Unexpected Response.\n");

return false;

}

}

return true;

}

bool GetSMTPServerAddr(char *SmtpServerAddr,char

*sendAddr)

{

char * smtpName;

int startPos;

for (startPos=0; ; startPos++)

{

if ('@' == sendAddr[startPos])

{

startPos++;

break;

}

}

smtpName=sendAddr+startPos;

sprintf(SmtpServerAddr,"smtp.%s",smtpName);

SmtpServerAddr[strlen(SmtpServerAddr)-1]='\0';

return true;

}

bool SendMail(char * un,

char * pw,

char * strMailFrom,

char * strMailTo[],

int  nTo,

char * MailHead,

char * MailData

)

{

int i;

SOCKET Sock;

struct sockaddr_in to;

char Buffer[BUFFERSIZE] = {0};

if (false == Initwsa(2, 2))

return false;

GetSMTPServerAddr(Buffer,strMailFrom);

if (false == SetSocket( &Sock, &to, Buffer))

{

Clear( &Sock );

return false;

}

if (false == Connect( Sock, to, sizeof(struct sockaddr_in)))

return false;

MakeCmd(Buffer,"HELO ","ABC");

if(false == SendMailCmd(Sock, Buffer,"250"))return

false;

MakeCmd(Buffer,"AUTH LOGIN ","");

if(false == SendMailCmd(Sock, Buffer,"334"))return

false;

MakeCmd(Buffer,base64_encode(un),"");

if(false == SendMailCmd(Sock, Buffer,"334"))return

false;

MakeCmd(Buffer,base64_encode(pw),"");

if(false == SendMailCmd(Sock, Buffer,"235"))return

false;

MakeCmd(Buffer,"MAIL FROM: ",strMailFrom);

if(false == SendMailCmd(Sock, Buffer,"250"))return

false;

for (i=0;i

{

MakeCmd(Buffer,"RCPT TO: ",strMailTo[i]);

if(false == SendMailCmd(Sock, Buffer,"250")) continue;

}

MakeCmd(Buffer,"DATA","");

if(false == SendMailCmd(Sock, Buffer,"354")) return

false;

strcat(MailHead, "\r\n\r\n");

strcat(MailHead, MailData);

MakeCmd(Buffer,MailHead,"\r\n.");

if(false == SendMailCmd(Sock, Buffer,"250")) return

false;

MakeCmd(Buffer,"QUIT ","");

SendMailCmd(Sock, Buffer,"221");

Clear(&Sock);

return true;

}

//以下函数发送电子邮件

int mysendmail(char neirong[],char dizhi[])

{

char * un="发送邮箱的用户名";

char * pw="发送邮箱的密码";

char * strMailFrom = "发件箱地址";

char * strMailTo[] =

{"","",dizhi};//dizhi是通过函数参数传递来的接收邮箱地址

charmailHead[BUFFERSIZE]={0};

charmailData[BUFFERSIZE]={0};

WriteLog("START");WriteLog("");

strcat(mailHead, "SUBJECT: 这里书写邮件主题");

strcat(mailData,

neirong);//neirong是通过函数参数传递来的邮件内容,也可以在此处直接输入"邮件内容"

SendMail(un,pw,strMailFrom,strMailTo,2,mailHead,mailData);

WriteLog("");

WriteLog("END\n\n");

return 0;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这是一个用 C 语言编写函数 check,用于验证电子邮件的有效性: ``` #include <stdio.h> #include <string.h> #include <regex.h> int check(char* email) { // 定义电子邮件的正则表达式 char pattern[] = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}$"; regex_t re; int ret; // 编译正则表达式 if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0) { return 0; } // 执行匹配 ret = regexec(&re, email, 0, NULL, 0); regfree(&re); if (ret == 0) { // 匹配成功,说明电子邮件有效 return 1; } else { // 匹配失败,说明电子邮件无效 return 0; } } int main(int argc, char* argv[]) { char email[] = "[email protected]"; if (check(email)) { printf("Valid email\n"); } else { printf("Invalid email\n"); } return 0; } ``` 这个函数使用了 POSIX 正则表达式库,需要在编译时包含相应的头文件 `regex.h`。正则表达式用于匹配电子邮件地址的模式,如果电子邮件地址与模式匹配,则认为该电子邮件地址有效,否则认为无效。 请注意,上述代码仅是一个简单的示例,并不能保证能够满足所有的电子邮件地址验证需求。另外,正则表达式匹配可能会比较 ### 回答2: 电子邮件地址是一个常见的字符串,用于识别和传递电子邮件。在C语言编写一个函数来验证电子邮件的有效性涉及使用字符串操作函数和正则表达式来检查电子邮件的格式。下面是一个简单的实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <regex.h> int check(const char *email) { // 使用正则表达式来检查电子邮件格式 regex_t regex; char pattern[] = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"; if (regcomp(&regex, pattern, REG_EXTENDED) != 0) { fprintf(stderr, "Failed to compile regex pattern.\n"); return -1; } int match = regexec(&regex, email, 0, NULL, 0); regfree(&regex); if (match == 0) { return 1; // 电子邮件格式有效 } else { return 0; // 电子邮件格式无效 } } int main() { const char *email = "[email protected]"; if (check(email) == 1) { printf("Valid email address.\n"); } else { printf("Invalid email address.\n"); } return 0; } ``` 上述代码中,我们使用`<regex.h>`头文件中的函数来编译和执行一个正则表达式来检查电子邮件是否有效。正则表达式的模式`"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"`用于匹配标准的电子邮件格式。 在`main()`函数中,我们调用`check()`函数来验证电子邮件地址的有效性,并输出相应的结果。 请注意,正则表达式只是验证电子邮件格式的一种方法。在实际开发中,可以根据需求进行更复杂的电子邮件验证。 ### 回答3: 电子邮件的有效性验证是一个常见的需求,在C语言中可以编写一个函数实现这个功能。以下是一个简单的check函数实现: ```c #include <stdio.h> #include <stdbool.h> #include <string.h> bool check(const char* email) { int n = strlen(email); int apos = -1, dotpos = -1; // 检查邮箱中有且只有一个'@'符号和至少一个'.'符号 for (int i = 0; i < n; i++) { if (email[i] == '@') { if (apos >= 0) // 已经存在一个'@'符号 return false; apos = i; } else if (email[i] == '.') { if (dotpos >= 0) // 已经存在一个'.'符号 return false; dotpos = i; } } // 检查'@'符号和'.'符号的位置 if (apos < 0 || dotpos < 0 || apos > dotpos) return false; // 检查'@'符号和'.'符号之间是否至少有一个字符 if (dotpos - apos <= 1) return false; return true; } int main() { const char* email1 = "[email protected]"; printf("Email: %s\nIsValid: %s\n", email1, check(email1) ? "true" : "false"); const char* email2 = "invalid_email"; printf("Email: %s\nIsValid: %s\n", email2, check(email2) ? "true" : "false"); return 0; } ``` 这个check函数接受一个表示电子邮件的字符串作为参数,并返回一个布尔值表示该电子邮件是否有效。它在遍历字符串中的字符过程中进行了一系列的检查,包括:验证是否只有一个'@'符号和至少一个'.'符号,验证'@'符号和'.'符号的位置,验证'@'符号和'.'符号之间是否至少有一个字符。该函数考虑了这些情况,并返回相应的结果。在main函数中对该函数进行了两次调用测试了两个不同的电子邮件地址的有效性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值