2012-02-16 45 views
11

每次我的模拟结束时,我想发送一封电子邮件给我的Gmail账户。我试图搜索网页,发现sendEmail,但它是超时。如果任何人都可以指出我试过的包或链接,我会很感激。发送来自Linux中的C/C++程序的电子邮件

感谢

+2

你为什么不使用sendmail?http://www.linuxquestions.org/questions/linux-newbie-8/sendmail-from-the-command-line-288920/ – perreal 2012-02-16 18:57:11

+0

我不是管理员系统,所以我无法为我的Gmail帐户设置系统。 – Madagascar 2012-02-16 18:59:36

+0

如何打开套接字到SMTP服务器并创建原始电子邮件并以此方式传递? – crush 2012-02-16 19:01:37

回答

18

您可以使用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) 
{ 
    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 2012-02-16 19:21:36

+0

@dreamlax同意。 – trojanfoe 2012-02-16 19:24:03

+2

你必须确定'message'的最后一个字符是''\ n''。 – 2012-02-16 19:32:21

3

libESMTP似乎是你在找什么。它有很好的文档记录,似乎也处于积极的发展阶段(最后发布候选版是从2012年1月中旬开始的)。它还支持SSL和各种身份验证协议。

源代码包中有示例应用程序。

+0

我遇到了libeSMTP问题。看到这个[link](http:// stackoverflow。COM /问题/ 28146658 /这-libesmtp - 例如 - 不显示 - 任何响应) – 3bdalla 2015-01-26 08:50:50

2

两个VMimelibcurl是电子邮件好的库发送(及以上)。

1

我喜欢上面的trojanfoe的答案,但在我的情况下,我需要打开一个电子邮件发送代理..一个MTA使Linux能够发送电子邮件 - 我发现exim4是一个相对简单的MTA工作和该trojanfoe的程序与它很好地工作。

得到它的工作,我用(Debian的类型系统上的虚框(crunchbang的Linux))

命令和apt-get安装进出口

命令和apt-get安装mailutils

我配置的exim4与

须藤dpkg的-重新配置的exim4-配置

,我告诉我的正常的(远程)的电子邮件地址的计算机

须藤的emacs的/ etc /电子邮件地址

希望因为这些步骤,这可能是有用的我发现工作得到上述

+0

没有管理员PRIVS这将是不可能的。 – mckenzm 2018-03-03 21:36:29

+0

@mckenzm这是真的 - 我在Windows内的虚拟机中完成了这项工作,所以我在这台机器上拥有管理员权限, – tom 2018-03-03 23:37:14

1

我的Linux系统中发送电子邮件trojanfoe的电子邮件程序做一个叉Exec和管身如sendmail /邮件程序:

#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"); 
} 
相关问题