Вот простой пример SMTP-клиента на языке C с использованием библиотеки sockets. Этот пример подключается к SMTP-серверу, отправляет основное письмо, а затем закрывает соединение:

```c
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>

#define SMTP_SERVER "smtp.example.com"
#define SMTP_PORT 25
#define BUFFER_SIZE 1024

bool send_command(int sockfd, const char *command, const char *expected_response);
bool read_response(int sockfd, char *buffer, const char *expected_response);

int main() {
    int sockfd;
    struct sockaddr_in server_addr;
    char buffer[BUFFER_SIZE];

    // Create a socket
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // Set up server address
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SMTP_PORT);
    if (inet_pton(AF_INET, SMTP_SERVER, &server_addr.sin_addr) <= 0) {
        perror("Invalid address");
        exit(EXIT_FAILURE);
    }

    // Connect to the SMTP server
    if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        perror("Connection failed");
        exit(EXIT_FAILURE);
    }

    // Read server response
    if (!read_response(sockfd, buffer, "220")) {
        fprintf(stderr, "Failed to receive greeting from server\n");
        exit(EXIT_FAILURE);
    }

    // Send HELO command
    if (!send_command(sockfd, "HELO client.example.com\r\n", "250")) {
        fprintf(stderr, "Failed to send HELO command\n");
        exit(EXIT_FAILURE);
    }

    // Send MAIL FROM command
    if (!send_command(sockfd, "MAIL FROM:<sender@example.com>\r\n", "250")) {
        fprintf(stderr, "Failed to send MAIL FROM command\n");
        exit(EXIT_FAILURE);
    }

    // Send RCPT TO command
    if (!send_command(sockfd, "RCPT TO:<recipient@example.com>\r\n", "250")) {
        fprintf(stderr, "Failed to send RCPT TO command\n");
        exit(EXIT_FAILURE);
    }

    // Send DATA command
    if (!send_command(sockfd, "DATA\r\n", "354")) {
        fprintf(stderr, "Failed to send DATA command\n");
        exit(EXIT_FAILURE);
    }

    // Send email content
    const char *email_body =
        "Subject: Test Email\r\n"
        "\r\n"
        "Hello,\r\n"
        "\r\n"
        "This is a test email sent using C and sockets.\r\n"
        "\r\n"
        "Best Regards,\r\n"
        "Your Name\r\n"
        ".\r\n";

    if (!send_command(sockfd, email_body, "250")) {
        fprintf(stderr, "Failed to send email content\n");
        exit(EXIT_FAILURE);
    }

    // Send QUIT command
    if (!send_command(sockfd, "QUIT\r\n", "221")) {
        fprintf(stderr, "Failed to send QUIT command\n");
        exit(EXIT_FAILURE);
    }

    // Close the socket
    close(sockfd);
    printf("Email sent successfully\n");
    return 0;
}

bool send_command(int sockfd, const char *command, const char *expected_response) {
    send(sockfd, command, strlen(command), 0);
    char buffer[BUFFER_SIZE];
    return read_response(sockfd, buffer, expected_response);
}

bool read_response(int sockfd, char *buffer, const char *expected_response) {
    memset(buffer, 0, BUFFER_SIZE);
    ssize_t n = recv(sockfd, buffer, BUFFER_SIZE - 1, 0);
    if (n <= 0) {
        perror("Receive failed");
        exit(EXIT_FAILURE);
    }
    buffer[n] = '\0';
    printf("Server response: %s", buffer);
    return strncmp(buffer, expected_response, strlen(expected_response)) == 0;
}
```

Замените `SMTP_SERVER` на **домен** или **IP-адрес** вашего **SMTP-сервера** и обновите адреса **MAIL FROM** и **RCPT TO** на соответствующие адреса электронной почты. Также не забудьте обновить тему и текст письма, если это необходимо.

Обратите внимание, что данный пример использует соединение в виде обычного текста и не поддерживает аутентификацию или шифрование. Для реальных приложений используйте библиотеки типа `libcurl` или `libesmtp`, которые поддерживают безопасные соединения и аутентификацию.
นี่คือตัวอย่างง่ายๆ ของไคลเอนต์ SMTP ในภาษา C โดยใช้ไลบรารีซ็อกเก็ต ตัวอย่างนี้เชื่อมต่อกับเซิร์ฟเวอร์ SMTP ส่งอีเมลหลัก จากนั้นปิดการเชื่อมต่อ: ```c #include <arpa/inet.h> #include <netinet/in.h> #include <stdbool.h> #include <stdio .h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <unistd.h> #define SMTP_SERVER "smtp.example.com" #define SMTP_PORT 25 # กำหนด BUFFER_SIZE 1,024 bool send_command(int sockfd, const char *command, const char *expected_response); bool read_response (int sockfd, char *buffer, const char *expected_response); int หลัก () { int sockfd; โครงสร้าง sockaddr_in server_addr; บัฟเฟอร์ถ่าน [BUFFER_SIZE]; // สร้างซ็อกเก็ตถ้า ((sockfd = ซ็อกเก็ต (AF_INET, SOCK_STREAM, 0)) < 0) { perror ("การสร้างซ็อกเก็ตล้มเหลว"); ทางออก (EXIT_FAILURE); } // ตั้งค่าที่อยู่เซิร์ฟเวอร์ memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SMTP_PORT); if (inet_pton(AF_INET, SMTP_SERVER, &server_addr.sin_addr) <= 0) { perror ("ที่อยู่ไม่ถูกต้อง"); ทางออก (EXIT_FAILURE); } // เชื่อมต่อกับเซิร์ฟเวอร์ SMTP ถ้า (เชื่อมต่อ(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("การเชื่อมต่อล้มเหลว"); ทางออก (EXIT_FAILURE); } // อ่านการตอบสนองของเซิร์ฟเวอร์ if (!read_response(sockfd, buffer, "220")) { fprintf(stderr, "Failed to gets Greeting from server\n"); ทางออก (EXIT_FAILURE); } // ส่งคำสั่ง HELO ถ้า (!send_command(sockfd, "HELO client.example.com\r\n", "250")) { fprintf(stderr, "Failed to send HELO command\n"); ทางออก (EXIT_FAILURE); } // ส่งคำสั่ง MAIL FROM ถ้า (!send_command(sockfd, "MAIL FROM:<sender@example.com>\r\n", "250")) { fprintf(stderr, "Failed to send MAIL FROM command\n "); ทางออก (EXIT_FAILURE); } // ส่งคำสั่ง RCPT TO if (!send_command(sockfd, "RCPT TO:<recipient@example.com>\r\n", "250")) { fprintf(stderr, "Failed to send RCPT TO command\n "); ทางออก (EXIT_FAILURE); } // ส่งคำสั่ง DATA if (!send_command(sockfd, "DATA\r\n", "354")) { fprintf(stderr, "Failed to send DATA command\n"); ทางออก (EXIT_FAILURE); } // ส่งเนื้อหาอีเมล const char *email_body = "Subject: ทดสอบอีเมล\r\n" "\r\n" "สวัสดี\r\n" "\r\n" "นี่คืออีเมลทดสอบที่ส่งโดยใช้ C และซ็อกเก็ต\r\n" "\r\n" "ขอแสดงความนับถือ\r\n" "ชื่อของคุณ\r\n" ".\r\n"; if (!send_command(sockfd, email_body, "250")) { fprintf(stderr, "ไม่สามารถส่งเนื้อหาอีเมล\n"); ทางออก (EXIT_FAILURE); } // ส่งคำสั่ง QUIT if (!send_command(sockfd, "QUIT\r\n", "221")) { fprintf(stderr, "Failed to send QUIT command\n"); ทางออก (EXIT_FAILURE); } // ปิดซ็อกเก็ตปิด (sockfd); printf("ส่งอีเมลเรียบร้อยแล้ว\n"); กลับ 0; } bool send_command(int sockfd, const char *command, const char *expected_response) { send(sockfd, command, strlen(command), 0); บัฟเฟอร์ถ่าน [BUFFER_SIZE]; กลับ read_response (sockfd, บัฟเฟอร์, คาดหวัง_การตอบสนอง); } bool read_response (int sockfd, char *buffer, const char *expected_response) { memset (บัฟเฟอร์, 0, BUFFER_SIZE); ssize_t n = recv (sockfd, บัฟเฟอร์, BUFFER_SIZE - 1, 0); ถ้า (n <= 0) { perror ("การรับล้มเหลว"); ทางออก (EXIT_FAILURE); } บัฟเฟอร์[n] = '\0'; printf("การตอบสนองของเซิร์ฟเวอร์: %s", บัฟเฟอร์); กลับ strncp (บัฟเฟอร์, ที่คาดหวัง_การตอบสนอง, strlen (ที่คาดหวัง_การตอบสนอง)) == 0; } ``` แทนที่ `SMTP_SERVER` ด้วย **โดเมน** หรือ **ที่อยู่ IP** ของ **เซิร์ฟเวอร์ SMTP** ของคุณ และอัปเดตที่อยู่ **MAIL FROM** และ **RCPT TO** ให้เป็นที่อยู่ที่สอดคล้องกัน ที่อยู่อีเมล เมล อย่าลืมอัปเดตหัวเรื่องและเนื้อหาของอีเมลหากจำเป็น โปรดทราบว่าตัวอย่างนี้ใช้การเชื่อมต่อข้อความธรรมดาและไม่รองรับการรับรองความถูกต้องหรือการเข้ารหัส สำหรับแอปพลิเคชันจริง ให้ใช้ไลบรารีเช่น `libcurl` หรือ `libesmtp` ซึ่งรองรับการเชื่อมต่อและการตรวจสอบสิทธิ์ที่ปลอดภัย
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence