2012-02-16 38 views
11

Tôi muốn gửi email đến tài khoản gmail của mình mỗi khi mô phỏng của tôi kết thúc. Tôi đã thử tìm kiếm trên web và tìm thấy sendEmail nhưng đã hết thời gian chờ. Nếu bất cứ ai có thể chỉ cho tôi một gói hoặc liên kết mà họ đã cố gắng, tôi sẽ biết ơn.gửi email từ chương trình C/C++ trong linux

Cảm ơn

+2

Tại sao bạn không sử dụng sendmail? Http: //www.linuxquestions.org/questions/linux-newbie-8/sendmail-from-the-command-line-288920/ – perreal

+0

Tôi không phải là quản trị viên của hệ thống nên tôi không thể thiết lập hệ thống cho tài khoản gmail của mình. – Madagascar

+0

Điều gì về việc mở một ổ cắm đến một máy chủ SMTP và tạo một email thô và chuyển nó theo cách đó? – crush

Trả lời

18

Bạn có thể gọi trực tiếp MTA địa phương bằng cách sử dụng popen() và nạp văn bản tuân thủ 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

Điều này sẽ hoạt động đủ tốt miễn là bạn có thể chắc chắn rằng 'message' không chứa' "\ n. \ n" ' dưới dạng chuỗi con. – dreamlax

+0

@dreamlax Đồng ý. – trojanfoe

+2

Và bạn phải chắc chắn rằng ký tự cuối cùng của 'message' là' '\ n''. –

3

libESMTP có vẻ là những gì bạn đang tìm kiếm. Nó được tài liệu rất tốt và dường như cũng đang được phát triển tích cực (Ứng viên phát hành cuối cùng là từ giữa tháng 1 năm 2012). Nó cũng hỗ trợ SSL và các giao thức xác thực khác nhau.

Có các ứng dụng mẫu trong gói nguồn.

+0

Tôi đang gặp sự cố với libeSMTP. Xem [link] này (http: // stackoverflow.com/questions/28146658/this-libesmtp-example-not-display-any-response) – 3bdalla

2

Cả VMimelibcurl là thư viện tốt cho email gửi (và nhiều hơn nữa).

1

Tôi thích câu trả lời của trojanfoe ở trên, NHƯNG trong trường hợp của tôi tôi cần bật một đại lý gửi email .. một MTA để cho phép linux gửi email - tôi đã tìm thấy exim4 là một MTA tương đối đơn giản để làm việc và chương trình trojanfoe hoạt động rất độc đáo với nó.

để làm cho nó làm việc tôi đã sử dụng (trên một hệ thống kiểu debian trong một hộp ảo (crunchbang linux))

sudo apt-get install exim

sudo apt-get install mailutils

tôi cấu hình exim4 với

sudo dpkg-reconfigure exim4-config

và tôi nói với máy tính về bình thường (từ xa) Địa chỉ email của tôi với

sudo emacs/etc/email-addresses

niềm hy vọng này có thể có ích như đây là những bước Tôi tìm thấy đã làm việc để hệ thống Linux của tôi gửi email với chương trình email của trojanfoe lên trên

+0

Nếu không có quản trị viên thì điều này sẽ không thể thực hiện được. – mckenzm

+0

@mckenzm điều này đúng - tôi đã làm điều này trong một máy ảo bên trong cửa sổ, vì vậy tôi đã có (có) quyền quản trị trên máy này, – tom

1

Thực hiện một lệnh ngắt và đưa nội dung đến một chương trình như 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"); 
} 
Các vấn đề liên quan