本文目录一览:
- C语言编程,给定一个Email地址,判断其是否合法
- 如何用c语言来识别电子邮箱是否正确
- 邮件发送程序客户端(C语言源代码)
- c语言中录入邮箱信息的时候定义什么类型?
- 编写一个C语言程序,显示自己的学号,姓名,班级和电子邮箱
- C语言发送邮件
C语言编程,给定一个Email地址,判断其是否合法
#include<stdio.h>
#include<string.h>
int FormatCheck(char *);
char *SplitByAt(char *, int);
char *CharsCheck(char *);
#define N 1024
int main()
{
char str[N], *field;
memset(str, 0x00, N);
scanf("%s", str);
field = SplitByAt(str, N);
if (field == NULL)
{
printf("NO\n");
return -1;
}
else if (FormatCheck(str) && FormatCheck(field))
{
printf("YES\n");
return 0;
}
else
{
printf("NO\n");
return -1;
}
}
/**
* 校验域名/邮箱格式
*/
int FormatCheck(char *str)
{
char *p;
for (;;)
{
p = CharsCheck(str);
if (p == str)
{
return 0;
}
else if (*p == '\0')
{
return 1;
}
else if (*p != '.')
{
return 0;
}
p++;
str = p;
}
}
/**
* 校验是否可用@分割为两段,返回域名首地址,不合要求返回NULL
* 参数:str,源字符串,length,长度限制(防越界)
* 函数会用'\0'代替源字符串第一个'@',已完成邮箱,域名分割.
*/
char *SplitByAt(char *str, int length)
{
char *p = strchr(str, '@');
if (p != NULL && (p - str) < length)
{
*p = '\0';
p++;
return p;
}
return NULL;
}
/**
* 校验str是否为连续的'a'-'z','A'-'Z','0'-'9'字符
* 返回值:第一个不合要求的字符所处位置
* 例如:str="abc",返回str+3; str="a#bc",返回str+1;
*/
char *CharsCheck(char *str)
{
while ((*str >= 'a' && *str <= 'z') ||
(*str >= 'A' && *str <= 'Z') ||
(*str >= '0' && *str <= '9') ||
*str == '_')
{
str++;
}
return str;
}
要求没有提''符号的特殊规则, 所以".@"这样的email也是能校验过的。
如何用c语言来识别电子邮箱是否正确
最简单的方式是使用正则表达式。检测邮箱格式的正则表达式:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$
。
- 标准的C和C都不支持正则表达式,但有一些函数库可以辅助C/C程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库。
- C/C++ 中使用正则表达式一般分为三步:
1)编译正则表达式 regcomp()
int regcomp (regex_t *compiled, const char *pattern, int cflags)
这个函数把指定的正则表达式pattern
编译成一种特定的数据格式compiled
,这样可以使匹配更有效。函数regexec
会使用这个数据在目标文本串中进行模式匹配。执行成功返回0。
2)匹配正则表达式 regexec()
int regexec (regex_t *compiled, char *string, size_t nmatch, regmatch_t matchptr [], int eflags)
当编译好正则表达式后,就可以用regexec
匹配我们的目标文本串了,如果在编译正则表达式的时候没有指定cflags
的参数为REG_NEWLINE
,则默认情况下是忽略换行符的,也就是把整个文本串当作一个字符串处理。执行成功返回0。
3)释放正则表达式 regfree()
void regfree (regex_t *compiled)
当使用完编译好的正则表达式后,或者要重新编译其他正则表达式的时候,可以用这个函数清空compiled
指向的regex_t
结构体的内容。请注意,如果是重新编译的话,一定要先清空regex_t
结构体。
邮件发送程序客户端(C语言源代码)
SMTP协议是用于发送电子邮件的主要通信协议,是C语言进行网络编程时经常都会使用到的基础协议之一。邮件发送客户端程序要求使用C语言socket通信来完成SMTP协议,实现邮件发送程序的客户端应用,通过该程序能够向远程的SMTP服务器发送电子邮件的请求,并发送到指定的电子邮箱之中。 第一阶段: 只要求通过dos窗口实现简单文本邮件的发送,具体的要求如下:
- 程序启动后录入SMTP服务器地址;
- 录入SMTP服务器用户名和密码;
- 录入收件人地址和抄送人地址(允许录入多个,中间以分号分隔);
- 录入邮件主题;
- 录入邮件内容完成后发送邮件;
- 邮件发送成功后系统提供邮件发送成功; 第二阶段: 要求能够实现发送MIME格式邮件或利用Win32编程将程序升级为桌面应用程序,进入第二阶段必须满足以下条件:
- 必须是在充分理解SMTP协议的基础上;
- 必须是在充分理解MIME格式的基础上;
- 利用C语言将发送的内容格式化为MIME格式;
- 可以首先考虑只实现MIME格式的一部分格式化需求;
- 升级桌面应用程序必须对Win32 API有一定的理解和掌握;
c语言中录入邮箱信息的时候定义什么类型?
那要看你记录的信息内容。
一、单纯记录邮箱地址
一个字符串即可。
二、记录并验证邮箱
字符串数组,把地址里的用户名和域名分开来放,用于服务器查询。(当然用一个字符串保存,查询时再拆分也可)。
三、复合结构
比如注册的邮箱信息,包含账户,密码,真实姓名,电话等等。需定义结构体来保存。
编写一个C语言程序,显示自己的学号,姓名,班级和电子邮箱
此类程序,没有额外要求情况下,直接打印即可。 如:
学号:12345
姓名:赵手快
班级:一年一班
电子邮箱:youxiang@xxx.xx
那么直接输出:
int main()
{
printf("学号:12345\n");
printf("姓名:赵手快\n");
printf("班级:一年一班\n");
printf("电子邮箱:youxiang@xxx.xx\n");
}
这样就是符合需求的了。
C语言发送邮件
基本框架就是这,需要其他功能自己添加吧。
C语言实现简单的SMTP发送邮件
#include <windows.h>
#include <stdio.h>
#include <WinSock.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
struct Base64Date6
{
unsigned int d4 : 6;
unsigned int d3 : 6;
unsigned int d2 : 6;
unsigned int d1 : 6;
};
// 协议中加密部分使用的是base64方法
char ConvertToBase64(char c6);
void EncodeBase64(char *dbuf, char *buf128, int len);
void SendMail(char *email, char *body);
int OpenSocket(struct sockaddr *addr);
int main()
{
char EmailTo[] = "hanyinlong@126.com";
char EmailContents[] = "From: \"lucy\"<hanyinlong@126.com>\r\n"
"To: \"dasiy\"<hanyinlong@126.com>\r\n"
"Subject: Hello\r\n\r\n"
"Hello World, Hello Email!";
SendMail(EmailTo, EmailContents);
return 0;
}
char ConvertToBase64(char uc)
{
if (uc < 26)
{
return 'A' + uc;
}
if (uc < 52)
{
return 'a' + (uc - 26);
}
if (uc < 62)
{
return '0' + (uc - 52);
}
if (uc == 62)
{
return '+';
}
return '/';
}
// base64的实现
void EncodeBase64(char *dbuf, char *buf128, int len)
{
struct Base64Date6 *ddd = NULL;
int i = 0;
char buf[256] = {0};
char *tmp = NULL;
char cc = '\0';
memset(buf, 0, 256);
strcpy_s(buf, 256, buf128);
for (i = 1; i <= len / 3; i++)
{
tmp = buf + (i - 1) * 3;
cc = tmp[2];
tmp[2] = tmp[0];
tmp[0] = cc;
ddd = (struct Base64Date6 *)tmp;
dbuf[(i - 1) * 4 + 0] = ConvertToBase64((unsigned int)ddd->d1);
dbuf[(i - 1) * 4 + 1] = ConvertToBase64((unsigned int)ddd->d2);
dbuf[(i - 1) * 4 + 2] = ConvertToBase64((unsigned int)ddd->d3);
dbuf[(i - 1) * 4 + 3] = ConvertToBase64((unsigned int)ddd->d4);
}
if (len % 3 == 1)
{
tmp = buf + (i - 1) * 3;
cc = tmp[2];
tmp[2] = tmp[0];
tmp[0] = cc;
ddd = (struct Base64Date6 *)tmp;
dbuf[(i - 1) * 4 + 0] = ConvertToBase64((unsigned int)ddd->d1);
dbuf[(i - 1) * 4 + 1] = ConvertToBase64((unsigned int)ddd->d2);
dbuf[(i - 1) * 4 + 2] = '=';
dbuf[(i - 1) * 4 + 3] = '=';
}
if (len % 3 == 2)
{
tmp = buf + (i - 1) * 3;
cc = tmp[2];
tmp[2] = tmp[0];
tmp[0] = cc;
ddd = (struct Base64Date6 *)tmp;
dbuf[(i - 1) * 4 + 0] = ConvertToBase64((unsigned int)ddd->d1);
dbuf[(i - 1) * 4 + 1] = ConvertToBase64((unsigned int)ddd->d2);
dbuf[(i - 1) * 4 + 2] = ConvertToBase64((unsigned int)ddd->d3);
dbuf[(i - 1) * 4 + 3] = '=';
}
return;
}
// 发送邮件
void SendMail(char *email, char *body)
{
int sockfd = {0};
char buf[1500] = {0};
char rbuf[1500] = {0};
char login[128] = {0};
char pass[128] = {0};
WSADATA WSAData;
struct sockaddr_in their_addr = {0};
WSAStartup(MAKEWORD(2, 2), &WSAData);
memset(their_addr, 0, sizeof(their_addr));
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(25);
hostent *hptr = gethostbyname("smtp.126.com");
memcpy(their_addr.sin_addr.S_un.S_addr, hptr->h_addr_list[0], hptr->h_length);
printf("IP of smpt.126.com is : %d:%d:%d:%d\n",
their_addr.sin_addr.S_un.S_un_b.s_b1,
their_addr.sin_addr.S_un.S_un_b.s_b2,
their_addr.sin_addr.S_un.S_un_b.s_b3,
their_addr.sin_addr.S_un.S_un_b.s_b4);
// 连接邮件服务器,如果连接后没有响应,则2 秒后重新连接
sockfd = OpenSocket((struct sockaddr *)&their_addr);
memset(rbuf, 0, 1500);
while (recv(sockfd, rbuf, 1500, 0) == 0)
{
cout << "reconnect..." << endl;
Sleep(2);
sockfd = OpenSocket((struct sockaddr *)&their_addr);
memset(rbuf, 0, 1500);
}
cout << rbuf << endl;
// EHLO
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "EHLO HYL-PC\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout << "EHLO REceive: " << rbuf << endl;
// AUTH LOGIN
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "AUTH LOGIN\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout << "Auth Login Receive: " << rbuf << endl;
// USER
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "hanyinlong@126.com"); // 你的邮箱账号
memset(login, 0, 128);
EncodeBase64(login, buf, strlen(buf));
sprintf_s(buf, 1500, "%s\r\n", login);
send(sockfd, buf, strlen(buf), 0);
cout << "Base64 UserName: " << buf << endl;
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout << "User Login Receive: " << rbuf << endl;
// PASSWORD
sprintf_s(buf, 1500, "XXXXXXXXXXXX"); // 你的邮箱密码
memset(pass, 0, 128);
EncodeBase64(pass, buf, strlen(buf));
sprintf_s(buf, 1500, "%s\r\n", pass);
send(sockfd, buf, strlen(buf), 0);
cout << "Base64 Password: " << buf << endl;
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout << "Send Password Receive: " << rbuf << endl;
// MAIL FROM
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "MAIL FROM: <hanyinlong@126.com>\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout << "set Mail From Receive: " << rbuf << endl;
// RCPT TO 第一个收件人
sprintf_s(buf, 1500, "RCPT TO:<%s>\r\n", email);
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout << "Tell Sendto Receive: " << rbuf << endl;
// DATA 准备开始发送邮件内容
sprintf_s(buf, 1500, "DATA\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout << "Send Mail Prepare Receive: " << rbuf << endl;
// 发送邮件内容,\r\n.\r\n内容结束标记
sprintf_s(buf, 1500, "%s\r\n.\r\n", body);
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout << "Send Mail Receive: " << rbuf << endl;
// QUIT
sprintf_s(buf, 1500, "QUIT\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout << "Quit Receive: " << rbuf << endl;
// 清理工作
closesocket(sockfd);
WSACleanup();
return;
}
// 打开TCP Socket连接
int OpenSocket(struct sockaddr *addr)
{
int sockfd = 0;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
cout << "Open sockfd(TCP) error!" << endl;
exit(-1);
}
if (connect(sockfd, addr, sizeof(struct sockaddr)) < 0)
{
cout << "Connect sockfd(TCP) error!" << endl;
exit(-1);
}
return sockfd;
}