使用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,"[email protected]");                  // 为消息添加一个容器
   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;
}
时间: 2024-10-09 03:42:16

使用libESMTP函数库实现电子邮件的发送的相关文章

ABP展现层——Javascript函数库

ABP展现层——Javascript函数库 点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之21.ABP展现层——Javascript函数库 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate ASP.NET Boil

php总结8——mysql函数库、增删改

8.1 mysql函数库 php的函数   .php中用来操作mysql函数库的函数 常用函数 mysql_connect("主机名称/ip","用户名","密码")--->建立php到mysql的连接,返回资源----> mysql_error()  返回上一个mysql操作的文本错误信息 @ 错误抑制符 一般来说,mysql_connect和mysql_error() 一起使用,用如下方式表示: <?php $link[em

人生维艰,何不利用开源.NET函数库让工作更轻松

今天推荐的文章会谈到一些让你工作更轻松的开源.NET函数库. 即使业界有时候认为.NET开源社区不太健康,很多开发团队都更多依赖于微软提供的东西来开发.不过最近在.NET世界中还是诞生了一些优秀和有意思的开源函数库. thomasvm就在他的博文中推荐了一些比较有代表性的开源函数库.这些函数库都是解决一些比较通用的问题,具备良好的文档,并非是一个强制你遵循某种规则和代码结构的框架,可以很好地嵌入到你的应用程序当中.当然,作者也给出了一些推荐理由: Hangfire.这是一个运行在ASP.NET中

PHP函数库(other)

PHP函数库(other) Session函数: session_abort — Discard session array changes and finish session session_abort() finishes session without saving data. Thus the original values in session data are kept. 返回值:没有你返回值. session_cache_expire — 返回当前缓存的到期时间 session_

ABP(现代ASP.NET样板开发框架)系列之21、ABP展现层——Javascript函数库

点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之21.ABP展现层——Javascript函数库 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate ASP.NET Boilerplate的js库提供了一些让javas

PHP采集相关教程之一 CURL函数库

先写一个简单的抓取页面函数 [php] view plaincopy <?php function GetSources($Url,$User_Agent='',$Referer_Url='') //抓取某个指定的页面 { //$Url 需要抓取的页面地址 //$User_Agent 需要返回的user_agent信息 如"baiduspider"或"googlebot" $ch = curl_init(); curl_setopt ($ch, CURLOPT

javaweb学习总结(三十)——EL函数库

一.EL函数库介绍 由于在JSP页面中显示数据时,经常需要对显示的字符串进行处理,SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用. 这些EL函数在JSTL开发包中进行描述,因此在JSP页面中使用SUN公司的EL函数库,需要导入JSTL开发包,并在页面中导入EL函数库,如下所示: MyEclipse自带的JSTL开发包: fn.tld就是EL函数库的对应的tld描述文件,如下图所示: 在页面中使用JSTL定义的EL函数:<%@taglib uri="http://java.su

重温JSP学习笔记--El函数库

EL函数库(由JSTL提供的) * 导入标签库:<%@ tablib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> String toUpperCase(String input):把参数转换成大写 String toLowerCase(String input):把参数转换成小写 int indexOf(String input, String substring):从大串,输出小

curses不是linux里默认的C函数库

今天在调试一个贪吃蛇程序时,出现如下错误: [[email protected] c++]$ g++ snack.cpp -o snack/tmp/ccCuZ3Jm.o:在函数‘playgame(int, int)’中:snack.cpp:(.text+0xce):对‘erase’未定义的引用snack.cpp:(.text+0xed):对‘mvprintw’未定义的引用snack.cpp:(.text+0x140):对‘mvprintw’未定义的引用snack.cpp:(.text+0x166