2012-02-16 2 views
11

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

Благодаря

+2

Почему вы не используете Sendmail HTTP: //www.linuxquestions.org/questions/linux-newbie-8/sendmail-from-the-command-line-288920/ – perreal

+0

Я не админ поэтому я не могу установить систему для своей учетной записи gmail. – Madagascar

+0

Как насчет открытия сокета на SMTP-сервере и создания необработанного письма и его передачи таким образом? – crush

ответ

18

Вы можете ссылаться на свой местный 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]); 
} 
+2

Это будет работать достаточно хорошо, если вы можете быть уверены, что 'message' не содержит' '\ n. \ n" ' как подстроку. – dreamlax

+0

@dreamlax Согласовано. – trojanfoe

+2

И вы должны быть уверены, что последний символ 'message' -' '\ n''. –

3

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

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

+0

У меня проблема с libeSMTP. См. Это [ссылка] (http: // stackoverflow.com/questions/28146658/this-libesmtp-example-not-show-any-response) – 3bdalla

2

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

1

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

, чтобы заставить его работать я (по системе типа Debian в виртуальном окне (CrunchBang Linux))

SUDO APT-получить установку Exim

Суды APT-получить установку mailutils

Я настроил exim4 с

Sudo Dpkg-переконфигурировать exim4-конфигурации

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

Судо Emacs/и т.д./Email-адреса

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

+0

Без admin privs это будет невозможно. – mckenzm

+0

@mckenzm это правда - я сделал это на виртуальной машине внутри окон, поэтому у меня были (есть) admin priviliges на этой машине, – tom

1

Сделайте вилку 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 protected]", "Subject", "Body"); 
} 
Смежные вопросы