我希望每次模拟结束时都能向我的gmail账户发送电子邮件。我已经尝试在网上搜索并找到了sendEmail,但它超时了。如果有人可以指出一个他们尝试过的包或链接,我将不胜感激。
谢谢
谢谢
您可以使用popen()
直接调用本地MTA并输入符合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)
{
if (argc == 5) {
sendmail(argv[1], argv[2], argv[3], argv[4]);
}
}
message
不包含子字符串"\n.\n"
,这个方案就足够有效。 - dreamlaxmessage
的最后一个字符是'\n'
。 - RobᵩlibESMTP似乎是您要寻找的内容。它有很好的文档,而且看起来正在积极开发中(最新的候选版本发布于2012年1月中旬)。它还支持SSL和各种身份验证协议。
源代码包中有示例应用程序。
执行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");
}