отправка электронной почты из программы на C / C ++ в linux - PullRequest
11 голосов
/ 16 февраля 2012

Я хотел бы отправлять электронные письма на мою учетную запись gmail каждый раз, когда заканчивается мое моделирование.Я попытался выполнить поиск в Интернете и обнаружил sendEmail , но время ожидания истекло.Если бы кто-нибудь мог указать мне на пакет или ссылку, которые они попробовали, я был бы благодарен.

Спасибо

Ответы [ 5 ]

22 голосов
/ 16 февраля 2012

Вы можете вызвать свой местный MTA напрямую, используя popen(), и передать ему текст, соответствующий 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]);
}
4 голосов
/ 16 февраля 2012

libESMTP - это то, что вы ищете. Он очень хорошо задокументирован и, похоже, находится в стадии активной разработки (последний релиз-кандидат с середины января 2012 года). Он также поддерживает SSL и различные протоколы аутентификации.

В исходном пакете есть примеры приложений.

2 голосов
/ 16 февраля 2012

Обе VMime и libcurl - хорошие библиотеки для отправки электронной почты (и не только).

1 голос
/ 29 ноября 2017

Выполните команду 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");
}
1 голос
/ 03 мая 2014

Мне нравится ответ trojanfoe выше, НО в моем случае мне нужно было включить агент отправки электронной почты ... MTA, чтобы позволить linux отправлять электронную почту - я нашел exim4 относительно простым MTA для работы, и этоПрограмма trojanfoe очень хорошо с ней работает.

, чтобы заставить ее работать, которую я использовал (в системе типов debian в виртуальной коробке (crunchbang linux))

sudo apt-get installexim

sudo apt-get install mailutils

Я настроил exim4 с

sudo dpkg -conconfigure exim4-config

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

sudo emacs / etc / email-address

надеюсь, что это может быть полезношаги, которые я нашел, сработали, чтобы моя система linux отправила электронную почту с программой электронной почты trojanfoe выше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...