2012-02-16 19 views
11

Chciałbym wysłać wiadomość e-mail na moje konto Gmail za każdym razem, gdy moja symulacja się zakończy. Próbowałem przeszukać sieć i znalazłem sendEmail, ale upłynął limit czasu. Jeśli ktokolwiek mógłby wskazać mi pakiet lub link, który próbowali, byłbym wdzięczny.Wysyłanie wiadomości e-mail z programu C/C++ w Linuksie

Dzięki

+2

Dlaczego nie używacie sendmail http: //www.linuxquestions.org/questions/linux-newbie-8/sendmail-from-the-command-line-288920/ – perreal

+0

nie jestem administratorem system, więc nie mogę ustawić systemu dla mojego konta Gmail. – Madagascar

+0

Co powiesz na otwarcie gniazda na serwer SMTP i utworzenie surowej wiadomości e-mail i przekazywanie jej w ten sposób? – crush

Odpowiedz

18

Możesz wywołać lokalny MTA bezpośrednio, używając popen() i podać tekst zgodny z 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]); 
} 
+2

To zadziała wystarczająco dobrze, o ile możesz być pewny, że 'message' nie zawiera' "\ n. \ n" ' jako podciąg. – dreamlax

+0

@dreamlax Uzgodnione. – trojanfoe

+2

Musisz być pewny, że ostatnią postacią 'message' jest' '\ n''. –

3

libESMTP wydaje się być to, czego szukasz. Jest bardzo dobrze udokumentowany i wydaje się być aktywnie rozwijany (ostatni kandydat na wersję jest od połowy stycznia 2012 r.). Obsługuje również protokół SSL i różne protokoły uwierzytelniania.

Istnieją przykładowe aplikacje w pakiecie źródłowym.

+0

Mam problem z libeSMTP. Zobacz ten [link] (http: // stackoverflow.com/questions/28146658/this-libesmtp-example-not-showing-any-response) – 3bdalla

2

Zarówno VMime i libcurl są dobre biblioteki do wysyłania wiadomości e-mail (i więcej).

1

Podoba mi się odpowiedź trojana z powyższego, ALE w moim przypadku musiałem włączyć agenta wysyłającego e-mail .. MTA, aby umożliwić linuxowi wysyłanie wiadomości e-mail - Stwierdziłem, że exim4 to stosunkowo prosty MTA, aby uzyskać pracę i program trojanfoe działa z nim bardzo dobrze.

aby zmusić go do pracy Kiedyś (w systemie typu debian w pudełku wirtualnego (CrunchBang Linux))

sudo apt-get install exim

sudo apt-get install mailutils

I skonfigurowany exim4 z

sudo dpkg zrekonfigurował exim4-konfiguracji

i powiedziałem komputer o moim normalnym (zdalnym) adres e-mail z

sudo emacs/etc/email adresów

nadzieja ta może być przydatna jako były to kroki Zauważyłem, że pracowałem nad tym, aby mój system linuxowy wysłał e-mail z programem pocztowym trojana e-mailowego pod numer

+0

Bez uprawnień administratora nie będzie to możliwe. – mckenzm

+0

@mckenzm to prawda - zrobiłem to w wirtualnej maszynie w oknach, więc miałem (mam) uprawnienia administratora na tym komputerze, – tom

1

Wykonaj operację fork i przeprowadź ciało do programu takiego jak 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 protected]", "Subject", "Body"); 
} 
Powiązane problemy