Linux:找不到Sendmail的错误代码

时间:2013-10-07 08:17:41

标签: c++ linux sendmail

我在Linux系统上部署了以下C ++代码

int sendEMail ( string sEMailAddress, string sEMailSubject , string sEMailText )
{

int nRc = nOK;
    // send email here
    const int nBUFFERSIZE = 55000;
    static char szCommand [ nBUFFERSIZE ] = { 0 };
    const char * szEmailText = NULL;


    FILE *fpipe = popen("sendmail -t", "w");

    szEmailText=sEMailText.c_str();

    if ( fpipe != NULL )
    {
        fprintf(fpipe, "To: %s\n", sEMailAddress.c_str());
        fprintf(fpipe, "From: %s\n", "test@mail.de");
        fprintf(fpipe, "Subject: %s\n\n", sEMailSubject.c_str());
        fwrite(sEMailText.c_str(), 1, strlen(sEMailText.c_str()), fpipe);
        pclose(fpipe);
    }
    else
    {
        Logger_log ( 1 , "ERROR: Cannot create pipe to mailx" );
                nRc = -1;

    }
    return nRc;
}

本规范正常。我必须确保在System上找到sendmail。因为我遇到了问题。 PATH变量设置不正确。因此无法在System上找到sendmail。没有错误消息,我收到了。电子邮件似乎发送出去了。但事实并非如此。如果找不到Sendmail进程,如何在代码(返回或错误代码)中实现我收到错误消息? Thanx in Advance

2 个答案:

答案 0 :(得分:0)

单向(专门检查命令未找到错误)

2(stderr)是linux系统上的默认文件描述符。

将此错误重定向到文件 errorfile 。现在比较 errorfile 的内容,如果内容有command not found字符串,这将确保找不到命令。

FILE* fpipe = popen("sendmail 2>errorfile", "w");

FILE* file = fopen("complete path to errorfile", "r");

char buf[124];

fgets(buf, 100, file);

printf("%s", buf);

if(strstr(buf, "command not found")!=NULL)
  printf("Command not found");

其他方式

可以使用

system功能

#include <stdlib.h>

int i;
i = system("sendmail");
printf("The return value is %d", i);

此返回值可用于检查命令是否成功执行。返回值是您的机器依赖的,所以检查返回值是什么。然而,成功通常为零。

答案 1 :(得分:0)

我不确定,但我认为从手册中有一些答案:
1. popen calls / bin / sh -c&lt; your command&gt;所以我猜popen会一直成功,除非找不到/ bin / sh 2.你应该检查返回码:

int ret_code=pclose(fpipe);
if (ret_code != 0)
{
    // Error handling comes here
}

来自手册页(man popen)

  

pclose()函数等待关联的进程终止并返回wait4(2)返回的命令的退出状态。

...

  

如果wait4(2)返回错误,或者检测到其他错误,则pclose()函数返回-1。