C语言发邮件(带账号密码认证),简单的libesmtp实例

2023-05-16

需要安装libesmtp开发环境,centos下可以用yum安装。

yum install libesmtp-devel

编译时加上-lesmtp选项,账号密码等替换成自己的

gcc -o mail mail.c -lesmtp
./mail
/* mail.c */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <unistd.h>

#include <errno.h>
#include <openssl/ssl.h>
#include <auth-client.h>
#include <libesmtp.h>


#define FAIL    -1
#define OK  0

#define SUBJECT     "Subject"                   /* 邮件主题*/
#define TO          "to@to.com"                 /* 收件人 */
#define BODY        "hello"                     /* 邮件正文 */
#define SERVER      "smtp.163.com:25"           /* 邮件服务器地址 */
#define USERNAME    "wen-4@163.com"             /* 邮箱账号 */
#define PASSWOED    "123456789"                 /* 邮箱密码 */

/* 回调函数 设置账号密码 */
int authinteract(auth_client_request_t request, char **result, int fields, void *args)
{
    int i;

    for (i=0; i < fields; i++)
    {
        if (request[i].flags & AUTH_PASS)
            result[i] = PASSWOED; 
        else    
            result[i] = USERNAME;
    }
    return 1;
}

/* 回调函数 打印客户端与服务器交互情况 可以不要 */
void monitor_cb(const char *buf, int buflen, int writing, void *arg)
{
    int i;

    if (writing == SMTP_CB_HEADERS)
        printf("H: ");
    else if(writing)
        printf("C: ");
    else
        printf("S: ");

    const char *p = buf;
    for(i=0; p[i]!='\n'; i++)
    {
        printf("%c", p[i]);
    }
    printf("\n");
}

int main()
{
    int ret;
    FILE *tmp_fp = NULL;
    smtp_session_t      session;
    smtp_message_t      message;
    smtp_recipient_t    recipient;
    auth_context_t      authctx;
    const smtp_status_t *status;

    auth_client_init();
    session = smtp_create_session();
    message = smtp_add_message(session);

    smtp_set_monitorcb(session, monitor_cb, stdout, 1);


    /* 设置邮件主题 */
    smtp_set_header(message, "Subject",SUBJECT);
    smtp_set_header_option(message, "Subject", Hdr_OVERRIDE, 1);

    /* 设置收件人 */
    smtp_set_header(message, "To", NULL, TO);

    /* 设置发件人 */
    smtp_set_reverse_path(message, USERNAME);

    /* 添加收件人 */
    recipient = smtp_add_recipient(message, TO);

    /* 设置服务器域名和端口 */
    smtp_set_server(session, SERVER);

    /* 设置邮件正文 */
    tmp_fp = tmpfile();
    if (tmp_fp == NULL)
    {
        printf("create temp file failed: %s\n", strerror(errno));
        return FAIL;
    }
    fprintf(tmp_fp, "\r\n%s",BODY);
    rewind(tmp_fp);
    smtp_set_message_fp(message, tmp_fp);

    /* 设置登录验证相关的东西 */
    authctx = auth_create_context();
    if (authctx == NULL)
    {
        return FAIL;
    }

    auth_set_mechanism_flags(authctx, AUTH_PLUGIN_PLAIN, 0);
    auth_set_interact_cb(authctx, authinteract, NULL);
    smtp_auth_set_context(session, authctx);

    if (!smtp_start_session(session)) 
    {
        char buf[128];
        printf( "SMTP server problem %s", smtp_strerror(smtp_errno(), buf, sizeof buf));
        ret = FAIL;
    }
    else 
    {
        /* 输出邮件发送情况 如果 status->code== 250则表明发送成功 */
        status = smtp_message_transfer_status(message);
        printf("%d %s", status->code, (status->text != NULL) ? status->text : "\n");
        ret = OK;
    }

    /* 释放资源 */
    smtp_destroy_session(session);
    if (authctx)
        auth_destroy_context(authctx);
    auth_client_exit();
    fclose(tmp_fp);
    return ret;     
}

下面是程序运行的实际情况, 如果提示535 Error或者authentication failed表明验证失败,说明是账号密码错误,或者邮箱的设置问题。
程序运行实例

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言发邮件(带账号密码认证),简单的libesmtp实例 的相关文章

随机推荐

  • Blender2.8:Blender Python渲染降噪节点(Cycles)

    参考 https www bilibili com read cv9221189 背景 Blender的Cycles渲染引擎存在非常多的噪声 方法 一个比较好的思路是利用 Denoising Data 和降噪节点 参考文档里的是手动设置 x
  • Ubuntu:显存占用及处理

    问题 在进行深度学习时 xff0c 显存是一种非常宝贵的资源 但是即便在Ubuntu下 xff0c 各种各样的系统配置都会不自觉的占用一些显存 xff0c 导致深度学习难以为继 在本博客中 xff0c 主要搬运一些查询显存占用原因及处理方法
  • Jittor:Jittor三千问

    Jittor三千问 记录一下在使用Jittor时遇到的问题和对应的解决方案 xff0c 持续更新 非常感谢梁盾博士的回复 1 Jittor如何指定显卡 xff1f 在运行脚本时 xff0c 使用 CUDA VISIBLE DEVICES 6
  • 机器学习:补课目录

    补课目录 xff1a xff08 已经完成 xff09 吴恩达DeepLearning ai xff1a Deep Learning Specialization xff08 正在进行 xff09 林轩田 机器学习基石 xff08 正在进行
  • conda:离线环境安装

    Aanconda的离线环境安装的必要条件是有一台可以联网的电脑 在后文中 xff0c 分别称可以联网的电脑为On line xff0c 不可以联网的电脑为Off line 以下即为对应的操作步骤 1 On line 下载annconda安装
  • Ubuntu:pip install gdal

    方法 sudo apt get update 必须首先安装gdal的lib xff0c python只是针对该lib的调用 sudo apt install gdal bin libgdal dev pip安装的版本必须和gdal一致 pi
  • Git:使用笔记

    git局部配置 git config user name 34 username 34 git config user email 34 email 34 git带用户密码clone git clone https username pas
  • Pytorch:conda安装不同版本的cuda

    我不会是最后一个知道可以用conda安装不同版本的cuda的人吧 通常的pytorch安装流程是 xff1a 首先安装NVIDIA驱动 xff0c 然后安装对应版本的cuda和cudnn最后再安装cuda支持的pytorch版本 然而实际上
  • obsidian使用技巧

    背景 obsidian是一个非常牛逼的本地笔记工具 xff0c 极大的提高了本人的学习能力 xff0c 卷的更加厉害了 此处简要记录一下在使用过程中遇到问题和对应的解决方案 xff0c 至于具体的使用方法网上多的是就不介绍了 三方插件推荐
  • ubuntu:命令行查询文件(夹)大小

    背景 使用命令行查询文件文件 夹 大小 参考 https www cnblogs com zhengyiqun1992 p 11183819 html 使用方法 查看当前文件夹下文件大小 ll h 输出如下 xff0c 其中文件夹大小是错误
  • VSCode:remote-ssh多级跳转

    背景 vscode目前是非常流行的编程工具 xff0c 提供了大量的插件 xff0c 尤其是其中的remote ssh xff0c 能够提供远程ssh连接服务器 xff0c 居家办公两不误 然而比较麻烦的事情是 xff0c 通常服务器为了保
  • Jittor:Jittor1.3.1之离线安装

    背景 Jittor是一个非常牛逼的框架 xff0c 维护了大量的官方demo xff0c 非常容易上手 与其他方法相比 xff0c 采用了即时编译的流程 xff0c 因此在效率上往往更高 但是在使用Jittor的过程中 xff0c 也遇到了
  • 灵活的按键处理程序 FlexibleButton,C程序编写,无缝兼容任意的处理器,支持任意 OS 和 non-OS

    灵活的按键处理程序 FlexibleButton 前言概述获取测试DEMO 程序说明程序入口用户初始化代码事件处理代码 FlexibleButton 代码说明按键事件定义按键注册接口按键事件读取接口按键扫描接口 问题和建议 前言 正好工作中
  • http请求头header、请求体body、请求行介绍

    HttpServletRequest对象代表客户端的请求 当客户端通过http协议请求访问 服务器的时候 http请求头的所有信息都封装在这个对象中 xff0c 通过这个对象 xff0c 可以获取客户端请求的所有信息 http请求包含请求行
  • 理解字节序 大端字节序和小端字节序

    以下内容参考了 http www ruanyifeng com blog 2016 11 byte order html https blog csdn net yishengzhiai005 article details 3967252
  • opencvSharp 学习笔记(二)

    参考文章 xff1a https github com shimat opencvsharp samples tree master SamplesCS Samples 参考opencvsharp的官方sample xff0c 在vs201
  • C++局部对象的析构

    class A span class hljs keyword public span A Func span class hljs attribute span span class hljs attribute span A A spa
  • BIND中基数树的建立

    BIND9新引入了视图的概念 xff0c 简单的来讲就是能根据不同的来源IP来返回不同的数据 其中网段的存储 xff0c 网段的快速匹配都是用基数树来实现的 下面是BIND创建基数树的代码 BIND的IP地址结构 span class hl
  • HTTP协议解析及C/C++代码实现

    超文本传输协议 HTTP 是分布式 协作 超媒体信息系统的应用层协议 这是自 1990 年以来万维网数据通信的基础 HTTP 是一种通用且无状态的协议 xff0c 它可以用于其他目的 xff0c 也可以使用其请求方法 错误代码和标头的扩展
  • C语言发邮件(带账号密码认证),简单的libesmtp实例

    需要安装libesmtp开发环境 xff0c centos下可以用yum安装 yum install libesmtp devel 编译时加上 lesmtp选项 xff0c 账号密码等替换成自己的 gcc o mail mail c les