使用libESMTP函式庫實現電子郵件的傳送
阿新 • • 發佈:2019-02-20
書上P260
#define _XOPEN_SOURCE // 定義系統環境,使符合X/Open標準 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <unistd.h> #include <getopt.h> #include <string.h> #include <fcntl.h> #include <signal.h> #include <errno.h> #include <stdarg.h> #include <libesmtp.h> // 包含libesmtp函式庫 int main() { smtp_session_t session; // 定義SMTP會話 smtp_message_t message; // 定義SMTP訊息結構 struct sigaction sa; // 該結構包含收到訊號後程序的行為 const smtp_status_t *status; // 用於儲存SMTP狀態 char buf[128]; // 用於檔案的緩衝區 FILE *fp; // 檔案識別符號 if((session = smtp_create_session ()) == NULL){ // 建立SMTP會話 fprintf (stderr, "建立會話失敗:%s\n", smtp_strerror (smtp_errno (), buf, sizeof(buf)); return 1; } if((message = smtp_add_message (session)) == NULL) { // 從SMTP會話中接受訊息,判斷是否成功 fprintf (stderr, "伺服器無應答:%s\n", smtp_strerror (smtp_errno (), buf, sizeof(buf)); return 1; } sa.sa_handler = SIG_IGN; // 避免程序僵死 sigemptyset(&sa.sa_mask); // 初始化訊號集 sa.sa_flags = 0; // 使資訊不被阻塞 sigaction (SIGPIPE, &sa, NULL); // 設定訊號行為 smtp_set_server (session, "127.0.0.1:25"); // 設定SMTP伺服器地址與埠 smtp_set_reverse_path (message, "[email protected]"); // 設定傳送者郵箱地址 smtp_set_header (message, "To", NULL, NULL); // 使郵件頭包含目的地郵箱地址 smtp_set_header (message, "Subject", " test mail"); // 使郵件頭包含主題 smtp_set_header_option (message, "Subject", Hdr_OVERRIDE, 1); // 使用預設的郵件頭設定 fprintf(stderr, "%s\n", "SMTP伺服器設定成功"); if ((fp = fopen ("mail.eml", "r")) == NULL) { perror("開啟檔案失敗"); return 1; } smtp_set_message_fp (message, fp); // 將檔案中的內容作為郵件訊息內容 smtp_add_recipient (message,"test@localhost"); // 為訊息新增一個容器 if (!smtp_start_session (session)){ // 連線SMTP伺服器傳送郵件 fprintf (stderr, "SMTP server problem %s\n", smtp_strerror (smtp_errno (), buf, sizeof buf)); } else { status = smtp_message_transfer_status (message); // 獲取傳送狀態 printf ("%d %s", status->code, (status->text != NULL) ? status->text : "\n"); } smtp_destroy_session (session); // 結束SMTP會話 if(fp != NULL) fclose(fp); // 關閉檔案 return 0; }