human
POP3およびIMAPとのSMTPの違い
gpt
ユーザーの観点から純粋に興味がある場合、SMTPプロトコルは、郵便の顧客が *文字を送信するために、およびIMAPプロトコルと（より古い）POP3-の *領収書 *に使用します。
human
hm。純粋なSMTP実装に書き込みます
gpt
これは、CocketsライブラリのSMTPクライアントの簡単な例です。この例は、SMTPサーバーに接続され、メイン文字を送信してから、接続を閉じます。

「c 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（intskfd、const char *command、consted_response）;
bool read_response（intskfd、char *buffer、const char *spedd_rasponse）;

int main（）{
    intskfd;
    struct sockaddr_in server_addr;
    char buffer [buffer_size];

    //ソケットを作成します
    if（（sockfd = socket（af_inet、sock_stream、0））<0）{
        Perror（ "ソケット作成に失敗した"）;
        exit（exit_failure）;
    }

    //サーバーアドレスを設定します
    memset（＆server_addr、0、sizeof（server_addr））;
    server_addr.sin_family = af_inet;
    server_addr.sin_port = htons（smtp_port）;
    if_pton（af_inet、smtp_server、＆server_addr.sin_addr）<= 0）{
        Perror（ "無効なアドレス"）;
        exit（exit_failure）;
    }

    // SMTPサーバーに接続します
    if（connect（sockfd、（struct sockaddr *）＆server_addr、sizeof（server_addr））<0）{0）
        Perror（ "接続失敗"）;
        exit（exit_failure）;
    }

    //サーバーの応答を読み取ります
    if（！read_response（sockfd、buffer、 "220"））{
        fprintf（stderr、 "server \ nから挨拶を受けられなかった"）;
        exit（exit_failure）;
    }

    // heloコマンドを送信します
    if（！send_command（sokkfd、 "helo client.example.com \ r \ n"、 "250"））{
        fprintf（stderr、 "helo command \ nを送信できなかった"）;
        exit（exit_failure）;
    }

    //コマンドからメールを送信します
    if（！send_command（sokkfd、 "mail from：<sender@example.com> \ r \ n"、 "250"））{
        fprintf（stderr、 "コマンド\ nからメールを送信できなかった"）;
        exit（exit_failure）;
    }

    // rcptをコマンドに送信します
    if（！send_command（sokkfd、 "rcpt to：<reciontient@example.com> \ r \ n"、 "250"））{
        fprintf（stderr、 "rcptをコマンド\ n"に送信できなかった "）;
        exit（exit_failure）;
    }

    //データコマンドを送信します
    if（！send_command（sockfd、 "data \ r \ n"、 "354"））{
        fprintf（stderr、 "データコマンド\ nを送信できなかった"）;
        exit（exit_failure）;
    }

    //電子メールコンテンツを送信します
    const char *email_body =
        「件名：電子メールをテスト\ r \ n」
        「\ r \ n」
        「こんにちは、\ r \ n」
        「\ r \ n」
        「これは、Cとソケットを使用して送信されたテストメールです。\ r \ n」
        「\ r \ n」
        「よろしく、\ r \ n」
        「あなたの名前\ r \ n」
        "。\ r \ n";

    if（！send_command（sokkfd、email_body、 "250"））{
        fprintf（stderr、 "電子メールコンテンツの送信に失敗しました\ n"）;
        exit（exit_failure）;
    }

    // quitコマンドを送信します
    if（！send_command（sockfd、 "quit \ r \ n"、 "221"））{
        fprintf（stderr、 "quit command \ n"）;
        exit（exit_failure）;
    }

    //ソケットを閉じます
    close（sockfd）;
    printf（ "電子メールが正常に\ n"を送信しました "）;
    0を返します。
}

bool send_command（intskfd、const char *command、consted_response）{
    send（sockfd、command、strlen（command）、0）;
    char buffer [buffer_size];
    return read_response（sockfd、buffer、expection_reponse）;
}

bool read_response（intskfd、char *buffer、const char *spedd_rasponse）{
    memset（buffer、0、buffer_size）;
    ssize_t n = recv（sockfd、buffer、buffer_size -1、0）;
    if（n <= 0）{
        Perror（ "受信失敗"）;
        exit（exit_failure）;
    }
    バッファー[n] = '\ 0';
    printf（ "サーバー応答：％s"、バッファー）;
    return strncmp（buffer、expection_reponse、strlen（expection_response））== 0;
}
`` `

「smtp_server」を** domain **または** ipアドレス** your ** smtp server **に置き換え、**および** rcptから** rcptから対応するメールアドレスに**メールを更新します。また、必要に応じて、手紙のトピックとテキストを更新することを忘れないでください。

この例は、通常のテキストの形で接続を使用しており、認証や暗号化をサポートしていないことに注意してください。実際のアプリケーションの場合、安全な化合物と認証をサポートする「libcurl」またはlibesmtp`などのライブラリを使用します。
human
さて、このコードのテストを書くことはできますか？