📄 cc_mailcontrol.c
字号:
#include "spalarm.h"
int Build_Mail_HeadStruct(cc_mailhead *p_str_mailhead, char *servername, char *username, char *password, char *addr_source, char *addr_dest, char *title, char *use_serverchk)
{
//判断参数长度
if (strlen(servername) >51)
return -1; //邮件服务器名长度超出
if (strlen(username) >26)
return -2; //用户名长度超出
if (strlen(password) >26)
return -3; //用户密码长度超出
if (strlen(addr_source) >51)
return -4; //源地址长度超出
if (strlen(addr_dest) >51)
return -5; //目的地地址长度超出
if (strlen(title) >201)
return -6; //邮件内容标题长度超出
if (strlen(use_serverchk) > 2)
return -7; //是否启用服务器验证长度超出
//复制
memset(p_str_mailhead, 0, sizeof(cc_mailhead));
strcpy((*p_str_mailhead).servername, servername);
strcpy((*p_str_mailhead).username, username);
strcpy((*p_str_mailhead).password, password);
strcpy((*p_str_mailhead).addr_source, addr_source);
strcpy((*p_str_mailhead).addr_dest, addr_dest);
strcpy((*p_str_mailhead).title, title);
strcpy((*p_str_mailhead).use_serverchk, use_serverchk);
return 1; //初始化邮件头信息结构体成功
}
int Build_Mail_Head(cc_mailhead *my_mailhead, char *head)
{
//信封中固定部分有200个字符
strcpy(head, "HELO cc840809\r\n");
if (memcmp((*my_mailhead).use_serverchk, "1", strlen((*my_mailhead).use_serverchk)) == 0)
{
char base64_name[128], base64_pwd[128];
memset(base64_name, 0, sizeof(base64_name));
memset(base64_pwd, 0, sizeof(base64_pwd));
base64((*my_mailhead).username, base64_name, strlen((*my_mailhead).username));
base64((*my_mailhead).password, base64_pwd, strlen((*my_mailhead).password));
strcat(head, "AUTH LOGIN\r\n");
strcat(head, base64_name);
strcat(head, "\r\n");
strcat(head, base64_pwd);
strcat(head, "\r\n");
}
strcat(head, "MAIL FROM: <");
strcat(head, (*my_mailhead).addr_source);
strcat(head, ">\r\n");
strcat(head, "RCPT TO: <");
strcat(head, (*my_mailhead).addr_dest);
strcat(head, ">\r\n");
strcat(head, "DATA\r\n");
strcat(head, "From: <");
strcat(head, (*my_mailhead).addr_source);
strcat(head, ">\r\n");
strcat(head, "To: <");
strcat(head, (*my_mailhead).addr_dest);
strcat(head, ">\r\n");
strcat(head, "SUBJECT: ");
strcat(head, (*my_mailhead).title);
//strcat(head, "SUBJECT: alarm message\r\n");
strcat(head, "\r\nDate:\r\n");
strcat(head, "X-Mailer: cc's mailer\r\n");
strcat(head, "MIME-Version: 1.0\r\n");
strcat(head, "Content-type: multipart/mixed; boundary=\"#BOUNDARY#\"\r\n");
return 1;
}
int Build_Mail_Content(char *content, char *body)
{
//信体中固定部分有110个字符
if(strlen(content)>1200)
return -1; //存放邮件内容的内存区域太大,存在内存溢出的危险
char content_head[106];
memset(body, 0, sizeof(content_head));
strcat(body, "\r\n--#BOUNDARY#\r\n");
strcat(body, "Content-Type: text/plain; charset=gb2312\r\n");
strcat(body, "Content-Transfer-Encoding: quoted-printable\r\n");
strcat(body, "\r\n");
strcat(body, content);
strcat(body, "\r\n");
return 1;
}
int Send_Mail(cc_mailhead *my_mailhead, char *content)
{
int sockfd;
struct sockaddr_in dest_addr;
char ip_addr[20];
char temp[1000], connect_ret[4];
memset(ip_addr, 0, sizeof(ip_addr));
if (GetIpByHostName((*my_mailhead).servername, ip_addr) == -1)
return -2; //通过邮件服务器名得到IP地址失败
//创建Socket套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1)
return -3; //创建Socket套接字失败
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(DEST_PORT);
dest_addr.sin_addr.s_addr = inet_addr(ip_addr); //inet_addr() #include <arpa/inet.h>
bzero(&(dest_addr.sin_zero), 8);
//连接SMTP主机
if (connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)) == -1)
return -4; //连接SMTP主机失败
memset(temp, 0, sizeof(temp));
memset(connect_ret, 0, sizeof(connect_ret));
if (recv(sockfd, temp, sizeof(temp), 0) == -1)
return -5;
memcpy(connect_ret, temp, 3);
if (atoi(connect_ret) != 220)
return -6;
//检查Socket套接字状态
if (CheckWriteBuf(&sockfd, -1, 0) == -1)
return -7; //发送信封前Socket套接字不可写
//向SMTP主机发送消息
if (SendSocket_GetRecv(sockfd, "HELO cc840809\r\n", 250) != 1)
return -8;
if (SendSocket_GetRecv(sockfd, "AUTH LOGIN\r\n", 334) != 1)
return -9;
char base64_name[128], base64_pwd[128];
memset(base64_name, 0, sizeof(base64_name));
memset(base64_pwd, 0, sizeof(base64_pwd));
base64((*my_mailhead).username, base64_name, strlen((*my_mailhead).username));
base64((*my_mailhead).password, base64_pwd, strlen((*my_mailhead).password));
strcat(base64_name, "\r\n");
if (SendSocket_GetRecv(sockfd, base64_name, 334) != 1)
return -10;
strcat(base64_pwd, "\r\n");
if (SendSocket_GetRecv(sockfd, base64_pwd, 235) != 1)
return -11;
memset(temp, 0, sizeof(temp));
sprintf(temp, "MAIL FROM: <%s>\r\n", (*my_mailhead).addr_source);
if (SendSocket_GetRecv(sockfd, temp, 250) != 1)
return -12;
memset(temp, 0, sizeof(temp));
sprintf(temp, "RCPT TO: <%s>\r\n", (*my_mailhead).addr_dest);
if (SendSocket_GetRecv(sockfd, temp, 250) != 1)
return -13;
if (SendSocket_GetRecv(sockfd, "DATA\r\n", 354) != 1)
return -14;
memset(temp, 0, sizeof(temp));
sprintf(temp, "From: <%s>\r\nTo: <%s>\r\nSUBJECT: %s\r\nDate:\r\nX-Mailer: cc's mailer\r\nMIME-Version: 1.0\r\nContent-type: multipart/mixed; boundary=\"#BOUNDARY#\"\r\n\r\n--#BOUNDARY#\r\nContent-Type: text/plain; charset=gb2312\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\n%s\r\n", (*my_mailhead).addr_source, (*my_mailhead).addr_dest, (*my_mailhead).title,content);
if(send(sockfd, temp, strlen(temp), 0) == -1)
return -15; //发送信体失败
if (SendSocket_GetRecv(sockfd, ".\r\n", 250) != 1)
return -16;
if (SendSocket_GetRecv(sockfd, "QUIT\r\n", 221) != 1)
return -17;
close(sockfd);//关闭Socket套接字
return 1;
}
int CheckWriteBuf(int *fd, int sec, int usec)
{
struct timeval tv;
fd_set wfds;
int retval;
FD_ZERO(&wfds);
FD_SET(*fd, &wfds);
if (sec == -1)
{
retval = select(*fd+1, NULL, &wfds, NULL, NULL);
}
else
{
tv.tv_sec = sec;
tv.tv_usec = usec;
retval = select(*fd+1, NULL, &wfds, NULL, &tv);
}
if (FD_ISSET(*fd, &wfds))
{
return 1;
}
return -1;
}
int SendSocket_GetRecv(int sockfd, char *send_buf, int recv_ret)
{
//tests(send_buf);
if(send(sockfd, send_buf, strlen(send_buf), 0) == -1)
return -1;
char recv_buf[1000];
memset(recv_buf, 0, sizeof(recv_buf));
if (recv(sockfd, recv_buf, sizeof(recv_buf), 0) == -1)
return -2;
else
{
char temp[4];
memset(temp, 0, sizeof(temp));
memcpy(temp, recv_buf, 3);
/*
tests(recv_buf);
int_tests("Temp ",atoi(temp));
int_tests("Recv_Ret", recv_ret);*/
if (atoi(temp)==recv_ret)
return 1;
else
return -3;
}
//检查Socket套接字状态
if (CheckWriteBuf(&sockfd, -1, 0) == -1)
return -4;//Socket套接字不可写
}
int GetIpByHostName(char *hostname, char* ip_addr)
{
struct hostent *h;
h=gethostbyname(hostname);
if ( h== NULL)/* 取得地址信息 */
return -1; //通过邮件服务器名得到IP地址失败
memcpy(ip_addr, inet_ntoa(*((struct in_addr *)h->h_addr)), 20); //inet_ntoa() #include <arpa/inet.h>
return 1; //通过邮件服务器名得到IP地址成功
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -