⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cc_mailcontrol.c

📁 Linux平台环境下
💻 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 + -