1. 程式人生 > >使用libESMTP函式庫實現電子郵件的傳送

使用libESMTP函式庫實現電子郵件的傳送

書上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;
}