2012-02-16 32 views
11

Me gustaría enviar un correo electrónico a mi cuenta de gmail cada vez que finalice mi simulación. He intentado buscar en la web y encontré sendEmail, pero es el tiempo de espera. Si alguien pudiera indicarme un paquete o un enlace que intentaran, estaría agradecido.enviando un correo electrónico desde un programa C/C++ en linux

Gracias

+2

¿Por qué no utilizar Sendmail http: //www.linuxquestions.org/questions/linux-newbie-8/sendmail-from-the-command-line-288920/ – perreal

+0

no soy el administrador de el sistema así que no puedo configurar el sistema para mi cuenta de gmail. – Madagascar

+0

¿Qué tal abrir un socket en un servidor SMTP y crear un correo electrónico sin formato y pasarlo de esa manera? – crush

Respuesta

18

Puede invocar su MTA local directamente usando popen() y alimentarlo con texto que cumpla con 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

Esto funcionará lo suficientemente bien siempre y cuando pueda estar seguro de que 'message' no contiene' "\ n. \ n" ' como una subcadena – dreamlax

+0

@dreamlax De acuerdo. – trojanfoe

+2

Y debe estar seguro de que el carácter final de 'message' es' '\ n''. –

3

libESMTP parece ser lo que busca. Está muy bien documentado y también parece estar en desarrollo activo (la última versión candidata es desde mediados de enero de 2012). También es compatible con SSL y varios protocolos de autenticación.

Hay aplicaciones de ejemplo en el paquete fuente.

+0

Tengo un problema con libeSMTP. Ver este [enlace] (http: // stackoverflow.com/questions/28146658/this-libesmtp-example-not-showing-any-response) – 3bdalla

2

Tanto VMime y libcurl son buenas bibliotecas para el envío de correo electrónico (y más).

1

Me gusta la respuesta de trojanfoe anterior, PERO en mi caso necesitaba activar un agente de envío de correo electrónico ... un MTA para permitir a Linux enviar correos electrónicos - He encontrado que exim4 es un MTA relativamente simple para trabajar y El programa de Trojanfoe funciona muy bien con él.

a conseguir que funcione he usado (en un sistema de tipo Debian en una caja virtual (Linux crunchbang))

sudo apt-get install exim

sudo apt-get install mailutils

que configuran exim4 con

sudo dpkg-reconfigure exim4-config

y le dije al equipo de mi dirección normal (remoto) e-mail con

emacs sudo/etc/email-addresses

esperanza que esto podría ser útil ya que estos fueron los pasos Encontré trabajo para obtener mi sistema Linux enviando correo electrónico con el programa de correo electrónico de Trojanfoe por encima de

+0

Sin privilegios de administrador esto no será posible. – mckenzm

+0

@mckenzm esto es cierto - Hice esto en una máquina virtual dentro de Windows, así que tuve (tuve) privilegios de administrador en esta máquina, – tom

1

Haz un fork exec y canaliza el cuerpo a un programa como 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"); 
} 
Cuestiones relacionadas