Отправка электронной почты из программы C/С++ в Linux
Я хотел бы отправить электронное письмо в мою учетную запись gmail каждый раз, когда мое симуляция заканчивается. Я попытался найти в Интернете и нашел sendEmail, но это тайм-аут. Если кто-нибудь может указать мне на пакет или ссылку, которые они попробовали, я был бы благодарен.
Спасибо
Ответы
Ответ 1
Вы можете напрямую ссылаться на свой локальный 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
libESMTP кажется тем, что вы ищете. Он очень хорошо документирован и также находится в активном развитии (последний кандидат от версии с середины января 2012 года). Он также поддерживает SSL и различные протоколы аутентификации.
В исходном пакете есть примеры приложений.
Ответ 3
Оба VMime и libcurl являются хорошие библиотеки для отправки электронной почты (и многое другое).
Ответ 4
Мне нравится ответ trojanfoe выше, НО в моем случае мне нужно было включить агента отправки электронной почты. MTA, чтобы включить linux для отправки электронных писем. Я нашел exim4 для относительно простой MTA, чтобы работать, и что Программа trojanfoe очень хорошо работает с ней.
чтобы заставить его работать, я использовал (в системе типа debian в виртуальном поле (crunchbang linux))
sudo apt-get install exim
sudo apt-get install mailutils
Я настроил exim4 с помощью
sudo dpkg-reconfigure exim4-config
и я рассказал компьютеру о моем обычном (удаленном) адресе электронной почты с помощью
sudo emacs/etc/email-addresses
надеюсь, что это может быть полезно, поскольку это были те шаги, которые я нашел обработанными, чтобы заставить мою Linux-систему отправлять электронную почту с помощью программы электронной почты троянского программного обеспечения выше
Ответ 5
Сделайте 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 protected]", "Subject", "Body");
}