【发布时间】: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