【问题标题】:sending an email from a C/C++ program in linux从 linux 中的 C/C++ 程序发送电子邮件
【发布时间】:2012-03-08 04:57:43
【问题描述】:

我想在每次模拟结束时向我的 gmail 帐户发送一封电子邮件。我尝试在网上搜索并找到sendEmail,但它已超时。如果有人能指出他们尝试过的包或链接,我将不胜感激。

谢谢

【问题讨论】:

  • 我不是系统管理员,所以无法为我的 gmail 帐户设置系统。
  • 如何打开一个到 SMTP 服务器的套接字并创建一个原始电子邮件并以这种方式传递它?
  • SMTP 是一个非常简单的协议(它在名称中!)。
  • @Madagascar,如果您不是该计算机的管理员,您可以使用例如 wget 、 ssh 向您自己的计算机发出请求,然后使用邮件程序。

标签: c++ c linux email gmail


【解决方案1】:

libESMTP 似乎是您正在寻找的东西。它有很好的文档记录,似乎也在积极开发中(最后一个候选版本是从 2012 年 1 月中旬开始的)。它还支持 SSL 和各种身份验证协议。

源码包中有示例应用。

【讨论】:

  • 我遇到了 libeSMTP 问题。看到这个link
【解决方案2】:

您可以使用popen() 直接调用您的本地 MTA 并将其提供符合 RFC822 标准的文本。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int sendmail(const char *to, const char *from, const char *subject, const char *message)
{
    int retval = -1;
    FILE *mailpipe = popen("/usr/lib/sendmail -t", "w");
    if (mailpipe != NULL) {
        fprintf(mailpipe, "To: %s\n", to);
        fprintf(mailpipe, "From: %s\n", from);
        fprintf(mailpipe, "Subject: %s\n\n", subject);
        fwrite(message, 1, strlen(message), mailpipe);
        fwrite(".\n", 1, 2, mailpipe);
        pclose(mailpipe);
        retval = 0;
     }
     else {
         perror("Failed to invoke sendmail");
     }
     return retval;
}

main(int argc, char** argv)
{
    int i;

    printf("argc = %d\n", argc);

    for (i = 0; i < argc; i++)
        printf("argv[%d] = \"%s\"\n", i, argv[i]);
    sendmail(argv[1], argv[2], argv[3], argv[4]);
}

【讨论】:

  • 只要您可以确定message 不包含"\n.\n" 作为子字符串,这将运行良好。
  • 而且你必须确定message的最后一个字符是'\n'
  • 抱歉这个愚蠢的问题,我是邮件编程的新手,但我想使用 gmail smtp。如何更改它以使用它?
  • @Madagascar 不只是将您的 gmail 帐户放在“收件人”字段中吗?
  • 如果您的本地 MTA 无法按照您的意愿投递邮件,请更改其配置。
【解决方案3】:

VMimelibcurl 都是用于电子邮件发送(以及更多)的好库。

【讨论】:

    【解决方案4】:

    我喜欢上面 trojanfoe 的答案,但在我的情况下,我需要打开一个电子邮件发送代理.. 一个 MTA 以使 linux 能够发送电子邮件 - 我发现 exim4 是一个相对简单的 MTA,可以开始工作,而且trojanfoe 的程序与它配合得非常好。

    为了让它工作,我使用了(在虚拟盒子中的 debian 类型系统上(crunchbang linux))

    sudo apt-get install exim

    sudo apt-get install mailutils

    我用

    配置了exim4

    sudo dpkg-reconfigure exim4-config

    我告诉计算机我的正常(远程)电子邮件地址

    sudo emacs /etc/email-addresses

    希望这可能有用,因为我发现这些步骤可以让我的 linux 系统使用上面的 trojanfoe 电子邮件程序发送电子邮件

    【讨论】:

    • 如果没有管理员权限,这是不可能的。
    • @mckenzm 这是真的 - 我是在 Windows 内的虚拟机中完成的,所以我在这台机器上拥有(拥有)管理员权限,
    • 如果(无论出于何种原因)您的 *n?x 盒子没有 MTA,您不妨安装 Postfix。
    【解决方案5】:

    执行 fork exec 并将正文通过管道传输到 sendmail/mail 等程序:

    #include <string>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/wait.h>
    
    using std::string;
    
    static const int READEND = 0;
    static const int WRITEEND = 1;
    
    int sendEmail(const string& to, const string& subject, const string& body) {
      int p2cFd[2];
    
      int ret = pipe(p2cFd);
      if (ret) {
        return ret;
      }
    
      pid_t child_pid = fork();
      if (child_pid < 0) {
        close(p2cFd[READEND]);
        close(p2cFd[WRITEEND]);
    
        return child_pid;
      }
      else if (!child_pid) {
        dup2(p2cFd[READEND], READEND);
        close(p2cFd[READEND]);
        close(p2cFd[WRITEEND]);
    
        execlp("mail", "mail", "-s", subject.c_str(), to.c_str(), NULL);
    
        exit(EXIT_FAILURE);
      }
    
      close(p2cFd[READEND]);
    
      ret = write(p2cFd[WRITEEND], body.c_str(), body.size());
      if (ret < 0) {
        return ret;
      }
    
      close(p2cFd[WRITEEND]);
    
      if (waitpid(child_pid, &ret, 0) == -1) {
        return ret;
      }
    
      return 0;
    }
    
    int main() {
      return sendEmail("email@hostname.com", "Subject", "Body");
    }
    
    猜你喜欢
    • 2020-01-20
    • 2015-06-28
    • 1970-01-01
    • 2019-04-03
    • 2018-07-05
    • 1970-01-01
    • 2015-04-23
    • 2011-03-26
    • 1970-01-01
    相关资源
    最近更新 更多