Linux: код ошибки для Sendmail не найден

0

я развернул следующий код C++ в системе Linux

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", "[email protected]");
        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;
}

Этот код работает отлично. Я должен гарантировать, что sendmail должен быть найден в Системе. Потому что у меня проблема. Переменная PATH не была установлена правильно. Поэтому sendmail не удалось найти в системе. Не было сообщения об ошибке, которое я получил. Электронная почта, кажется, отправляет. Но это не так. Как я могу реализовать в Code (return или Error Code), что я получаю сообщение об ошибке, если Sendmail Process не удалось найти? Thanx заранее

Теги:
sendmail

2 ответа

0

Я не уверен, но я думаю, что из руководства есть несколько ответов:
1. popen calls/bin/sh -c <ваша команда>, поэтому я думаю, что popen всегда будет успешным, если /bin/sh не найден
2. вы должны проверить код возврата:

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

Из справочной страницы (man popen)

Функция pclose() ожидает завершения связанного процесса и возвращает статус выхода команды, возвращаемой wait4 (2).

...

Функция pclose() возвращает -1, если wait4 (2) возвращает ошибку или обнаруживается некоторая другая ошибка.

  • 0
    Thanx. похоже на работу
  • 0
    Отлично. Рад слышать. Можете ли вы принять ответ?
0

Один из способов (специально проверить для команды не найденную ошибку):

2(stderr) является файловым дескриптором по умолчанию в системе linux.

перенаправить эту ошибку в файл 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);

Это возвращаемое значение может использоваться для проверки успешного выполнения команды. Возвращаемое значение зависит от вашего устройства, поэтому проверьте, что такое возвращаемое значение. Однако для успеха он обычно равен нулю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню