电子邮箱c语言,邮箱密码c语言

发布时间:2022-11-24

本文目录一览:

  1. C语言编程,给定一个Email地址,判断其是否合法
  2. 如何用c语言来识别电子邮箱是否正确
  3. 邮件发送程序客户端(C语言源代码)
  4. c语言中录入邮箱信息的时候定义什么类型?
  5. 编写一个C语言程序,显示自己的学号,姓名,班级和电子邮箱
  6. 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-]+)+$

  1. 标准的C和C都不支持正则表达式,但有一些函数库可以辅助C/C程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库。
  2. 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;
}