【问题标题】:non blocking sendmail in CC中的非阻塞发送邮件
【发布时间】:2012-12-03 06:48:25
【问题描述】:

我正在尝试从我在 linux (centos 64bit) 上的 C 程序发送一封电子邮件。以下(简化的)代码很有效:

asprintf(&cmd,"/usr/sbin/sendmail -oi -t -f me@blah.com somebody@blah.com");
asprintf(&bdy,"From: me@blah.com\nTo: somebody@blah.com\nSubject: blah blah\n\nThis is the message body\n");

FILE *out = popen(cmd,"w");
fprintf(out,"%s",bdy);
pclose(out);

问题是它会阻塞并在返回之前最多需要一两秒钟。如何在不阻塞的情况下发送电子邮件?

更多信息:问题是 popen 阻塞并在返回之前等待完成。所以我可能正在寻找另一种使用 sendmail 的方法。我真的不想使用额外的库来处理所有的臃肿。如果可能的话,我宁愿不分叉。 (popen 已经分叉,但在返回调用者之前等待完成)是否存在不阻塞的 popen 等效项?

【问题讨论】:

  • 我猜问题不是真的来自popen,而是直接在shell中进行相同的调用也需要一些时间? “慢”发送邮件可能表明本地计算机上的 DNS 配置存在问题。
  • 实际上它与 popen 有关,根据设计,它将阻塞并等待任务完成。目前,到目前为止我想到的最好的解决方案是将电子邮件写入文件并让 bash 脚本发送它们。但这很混乱,我更愿意在 C 中完成所有工作。
  • 不过,向您的 MTA 提交电子邮件应该不会花这么长时间,因为通常邮件只是假脱机(除非您更改了设置)。

标签: sendmail nonblocking


【解决方案1】:

最简单的解决方案是从不同的线程发送(这可以像使用fork() 一样简单),这样您的程序可以在发送邮件的同时继续执行

【讨论】:

  • 我不会调用fork 与多线程相关的系统调用。它与多处理有关。
  • 我的理解是,无论如何,popen forks。但它会阻塞直到完成,以便向父级提供输出。我不想要这些信息。我只想继续
  • @BasileStarynkevitch:多处理也是多线程。如果你有 N 个非僵尸进程,那么你至少有 N 个线程。
【解决方案2】:

您可能想要使用一些 SMTP 客户端库,请参阅 this question

您可以将您的机器设置为 SMTP smart host

您也可以直接使用与低级进程相关的系统调用,例如fork(2)pipe(2)dup2(2)execve(2)poll(2)waitpid(2) 等......阅读Advanced Linux Programming 来学习更多。

你敢于使用多线程。详细了解pthreads

【讨论】:

  • 我不想使用客户端库或智能主机。我想知道是否有任何方法可以在不阻塞且不使用其他库的情况下发送电子邮件。
  • SMTP 协议可能涉及延迟,您将其(错误地)称为“阻塞”。
  • SMTP 邮件发送的时间与它一样长,但我不希望我的 C 程序等待它完成。我希望它发出要发送的调用,然后继续。我实际上不在乎发送电子邮件需要多长时间。你是说没有阻塞,cpu 整整一秒钟都无法发送一封电子邮件?
猜你喜欢
  • 2014-08-25
  • 2017-02-09
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 2012-08-24
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多