使用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, "test@test.com");            // 设置发送者邮箱地址
   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;
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
因工作需要在Linux环境中用C++编写个发送邮件的程序,着实费了点周折,最终得以满意解决,现将历程与成果与大家分享! 一、刚开始网上一通逛搜,发现Linux环境下,发邮件使用较多的方法是libesmtp包,网上也有示例,按照相关章的指引,很容易就实现的邮件的发送,但问题是不知道如何实现SSL。 二、发现libesmtp文件中有个smtp_starttls_set_ctx接口,似乎是可以解决ssl问题的,逛搜libesmtp解决SSL发送邮件的解决办法,几乎无任何信息,后来下载了个libesmtp的源代码包libesmtp-1.0.6.tar.bz2,内含examples示例目录,可以直接编译成功,但似乎是只支持tls邮件发送,而不支持ssl邮件的发送,百思不得其解。 三、接着寻找别的解决办法,在CSDN搜到一个csmtp说可以解决SSL邮件发送问题的资源,但下载需要50积分,说心里话能解决问题50积分也是值得的,但没有呀,提供资源者还比较仁义,告知资来源于https://www.codeproject.com,于是乎在codeproject找到了csmtp的资源,有两个版本,v2.4版本包CSmtp_v2_4_ssl.zip,v1.8版本分为window(CSmtp_v1_8a.zip)和linux(CSmtp_v1_8b.zip)两个包。 四、为了能省点精力,就直接用版较低的linux版吧,解压后发现有makefile文件,可直接编译通过,一般的邮件能发送成功,但可惜的是v1.8版本也不支持ssl协议。 五、其实从包的名字上就能看出来v2.4版本开始支持 ssl协议,但v2.4并不分windows版本和linux版本,是否能支持linux呢,查看源代码发现有对linux的支持,只是包内没有makefile文件,似乎没有在linux目录下编译过,于是编写了个makefile文件尝试编译,竞然编通过,而且发送文件成功,经过测试可以支持ssl邮件的发送,因暂无需求tls未做测试。 六、现将程序重新打包成csmtp_v2.4_linux.tar文件,与大家分享,文中所提到的相关资源包都一并打包到资源中了。 最后感谢原创christopher w. backen提供的代码资源!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值