Logo Hardware.com.br
insectopos
insectopos Novo Membro Registrado
5 Mensagens 0 Curtidas

Envio e-mail em linguagem C

#1 Por insectopos 27/03/2012 - 01:32
Estava procurando um jeito de enviar um email em linguagem C. Pesquisei e não encontrei muita coisa, ate achar esse tópico.
Estava tentando utilizar esse código para enviar Email para o hotmail mas não funcionou como o esperado.
mudei dessa forma o codigo:

#include
#include
#include

int main(int argc, char *argv[])
{

struct sockaddr_in LO_EndPOP;
struct sockaddr_in LO_EndSMTP;

int LO_TamEndPOP;
int LO_TamEndSMTP;

WORD LO_Versao;
WSADATA LO_wsaData;

int LO_CanalPOP;
int LO_CanalSMTP;

char LO_vbcrlf[2];
LO_vbcrlf[0] = 13;
LO_vbcrlf[1] = 10;
LO_vbcrlf[2] = 0;



LO_Versao = MAKEWORD( 2, 2 );

int LO_Erro = WSAStartup( LO_Versao, &LO_wsaData );
if( LO_Erro != 0 )
{
printf( "Não foi possível encontrar a dll winsock!\n" );
getch();
return(-1);
}
if( LOBYTE( LO_wsaData.wVersion) < 2 || HIBYTE( LO_wsaData.wVersion) < 2)
{
printf( "A dll winsock é muito antiga!\n" );
getch();
return(-1);
}

//-----> Inicia a autenticação POP3 - Necessário para SMTP também !


// Inicializa estrutura para o canal de escuta

LO_EndPOP.sin_family = AF_INET;
LO_EndPOP.sin_addr.s_addr = inet_addr("200.199.201.238") ; // IP do pop3.live.com (utilizado pela hotmail, é a porta 995 para pop)
LO_EndPOP.sin_port = htons(995); // Porta POP
int LO_Con;
for( LO_Con = 0; LO_Con < 8; LO_Con++ )
{
LO_EndPOP.sin_zero[LO_Con] = 0;
}
LO_TamEndPOP = sizeof(LO_EndPOP);

//-----> Cria canal de conexão socket

if(( LO_CanalPOP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP )) <= 0 )
{
printf( "Erro ao criar o canal!\n" );
getch();
return(-1);
}

//-----> Conecta ao servidor

if( connect( LO_CanalPOP, (struct sockaddr*)&LO_EndPOP, LO_TamEndPOP ) == -1 )
{
printf( "Erro ao se conectar!\n" );
getch();
return(-1);
}

char LO_Retorno[512];


char *LO_Usuario = "USER [email]meu_email@hotmail.com[/email]";

printf( "Mensagem: %s\n", LO_Usuario );
send( LO_CanalPOP, LO_Usuario, strlen(LO_Usuario), 0);
send( LO_CanalPOP, LO_vbcrlf, 2, 0);

memset( LO_Retorno, '\0', 512 );
recv( LO_CanalPOP, LO_Retorno, 512, 0 );
printf( "Retorno: %s\n", LO_Retorno );


char *LO_Senha = "PASS 1234";

printf( "Mensagem: %s\n", LO_Senha );
send( LO_CanalPOP, LO_Senha, strlen(LO_Senha), 0);
send( LO_CanalPOP, LO_vbcrlf, 2, 0);

memset( LO_Retorno, '\0', 512 );
recv( LO_CanalPOP, LO_Retorno, 512, 0 );
printf( "Retorno: %s\n", LO_Retorno );


//-----> Inicia a autenticação POP3 - Necessário para SMTP também !


// Inicializa estrutura para o canal de escuta

LO_EndSMTP.sin_family = AF_INET;
LO_EndSMTP.sin_addr.s_addr = inet_addr("65.55.162.200"); // IP da smtp.live.com (utilizado pela hotmail, é a porta 25 para smtp)
LO_EndSMTP.sin_port = htons(25); // Porta SMTP
for( LO_Con = 0; LO_Con < 8; LO_Con++ )
{
LO_EndSMTP.sin_zero[LO_Con] = 0;
}
LO_TamEndSMTP = sizeof(LO_EndSMTP);

//-----> Cria canal de conexão socket

if(( LO_CanalSMTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP )) <= 0 )
{
printf( "Erro ao criar o canal!\n" );
getch();
return(-1);
}

//-----> Conecta ao servidor

if( connect( LO_CanalSMTP, (struct sockaddr*)&LO_EndSMTP, LO_TamEndSMTP ) == -1 )
{
printf( "Erro ao se conectar!\n" );
getch();
return(-1);
}

printf( "Conectado ao servidor!\n\n" );

printf( "Enviando mensagem...\n\n" );

memset( LO_Retorno, '\0', 512 );
recv( LO_CanalSMTP, LO_Retorno, 512, 0 );
printf( "Retorno: %s\n", LO_Retorno );

char *LO_Helo = "HELO www.hotmail.com.br";

printf( "Mensagem: %s\n", LO_Helo );
send( LO_CanalSMTP, LO_Helo, strlen(LO_Helo), 0);
send( LO_CanalSMTP, LO_vbcrlf, 2, 0);

memset( LO_Retorno, '\0', 512 );
recv( LO_CanalSMTP, LO_Retorno, 512, 0 );
printf( "Retorno: %s\n", LO_Retorno );

char *LO_De = "MAIL FROM: ";
printf( "%Mensagem: %s\n", LO_De );
send( LO_CanalSMTP, LO_De, strlen(LO_De), 0);
send( LO_CanalSMTP, LO_vbcrlf, 2, 0);

memset( LO_Retorno, '\0', 512 );
recv( LO_CanalSMTP, LO_Retorno, 512, 0 );
printf( "Retorno: %s\n", LO_Retorno );

char *LO_Para = "RCPT TO: ";
printf( "%Mensagem: %s\n", LO_Para );
send( LO_CanalSMTP, LO_Para, strlen(LO_Para), 0);
send( LO_CanalSMTP, LO_vbcrlf, 2, 0);

memset( LO_Retorno, '\0', 512 );
recv( LO_CanalSMTP, LO_Retorno, 512, 0 );
printf( "Retorno: %s\n", LO_Retorno );


// Início da mensagem

char *LO_Data = "DATA";
printf( "%Mensagem: %s\n", LO_Data );
send( LO_CanalSMTP, LO_Data, strlen(LO_Data), 0);
send( LO_CanalSMTP, LO_vbcrlf, 2, 0);

memset( LO_Retorno, '\0', 512 );
recv( LO_CanalSMTP, LO_Retorno, 512, 0 );
printf( "Retorno: %s\n", LO_Retorno );

char *LO_Subject = "Subject: Mensagem Teste!";
printf( "Mensagem: %s\n", LO_Subject );
send( LO_CanalSMTP, LO_Subject, strlen(LO_Subject), 0);
send( LO_CanalSMTP, LO_vbcrlf, 2, 0);

char *LO_From = "From: [email]meu_email@hotmail.com[/email]";
printf( "Mensagem: %s\n", LO_From );
send( LO_CanalSMTP, LO_From, strlen(LO_From), 0);
send( LO_CanalSMTP, LO_vbcrlf, 2, 0);

char *LO_To = "To: [email]meu_email@hotmail.com[/email]";
printf( "Mensagem: %s\n", LO_To );
send( LO_CanalSMTP, LO_To, strlen(LO_To), 0);
send( LO_CanalSMTP, LO_vbcrlf, 2, 0);

char *LO_Msg = "Ola, voce acabou de receber uma mensagem!";
printf( "Mensagem: %s\n", LO_Msg );
send( LO_CanalSMTP, LO_Msg, strlen(LO_Msg), 0);
send( LO_CanalSMTP, LO_vbcrlf, 2, 0);

// Fim da mensagem

send( LO_CanalSMTP, ".", 1, 0);
send( LO_CanalSMTP, LO_vbcrlf, 2, 0);

memset( LO_Retorno, '\0', 512 );
recv( LO_CanalSMTP, LO_Retorno, 512, 0 );
printf( "Retorno: %s\n", LO_Retorno );

// Envia comando de encerramento

printf( "%Mensagem: QUIT\n" );
send( LO_CanalSMTP, "QUIT", 4, 0);
send( LO_CanalSMTP, LO_vbcrlf, 2, 0);

memset( LO_Retorno, '\0', 512 );
recv( LO_CanalSMTP, LO_Retorno, 512, 0 );
printf( "Retorno: %s\n", LO_Retorno );

printf( "Fim do envio!\n" );

closesocket( LO_CanalPOP );
closesocket( LO_CanalSMTP );

getch();
return 0;
}

No lugar de "meu_email" é "1234" eu coloquei meu email e senha verdadeiro.
Deu um erro sobre autenticação. Sabe como que eu posso resolver isso?
pflynn
pflynn Ubbergeek Registrado
5.5K Mensagens 122 Curtidas
#4 Por pflynn
28/03/2012 - 14:41
Henry-Keys disse:
Caras, eu programo com a biblioteca winsock2, usando os protocolos SMTP e POP3 é um tanto difícil, por isso eu prefiro enviar mensagens com o protocolo TCP.


Você está confundindo um pouco alhos com bugalhos. O TCP é um protocolo de transporte e, somente em ocasiões específicas, você trabalha diretamente com ele. Você não manda e-mails "por tcp". Normalmente você trabalha apenas com os protocolos de aplicação, no caso, o POP3 e o SMTP que você citou. Trabalha diretamente com esses dois protocolos se a sua aplicação estiver mandando e recebendo as mensagens dos protocolos (por exemplo, por meio de sockets), ou indiretamente, se estiver usando uma biblioteca que abstraia esse trabalho na sua aplicação. Essa alternativa (de usar uma abstração) é a melhor solução se você não quer ou não pode trabalhar diretamente com os protocolos de aplicação.
insectopos
insectopos Novo Membro Registrado
5 Mensagens 0 Curtidas
#5 Por insectopos
28/03/2012 - 16:54
Quero criar um programa em linguagem C para enviar arquivo para o email.
Usei esse fonte do FabianoTraple. Mas não funcionou como esperado, talvez seja por causa que meu email é da hotmail. (FabianoTraple postou o fonte nesse endereço aqui)

Alguem tem algum outro fonte que funcione para meu propósito?
Ou alguma solução que do pq esse fonte não funcionou?
intruso
intruso Tô em todas Registrado
1.8K Mensagens 41 Curtidas
#7 Por intruso
29/03/2012 - 00:46
Servidores de email na net geralmente usam algum tipo de criptografia durante o processo de autenticação, o código está fazendo tudo na mão via socket, logo, está sem criptografia ... verifique o erro que está retornando no socket e as configurações do servidor e depois post por aqui.

Pergunta, você tem alguma idéia de como implementar o protocolo smtp?
insectopos
insectopos Novo Membro Registrado
5 Mensagens 0 Curtidas
#8 Por insectopos
02/04/2012 - 19:00
O retorno que foi dado foi esse aqui:


Mensagem: USER [email]meu_email@hotmail.com[/email]
Retorno:
Mensagem: PASS 1234
Retorno:
Conectado ao servidor!

Enviando mensagem...

Retorno: 220 BLU0-SMTP201.phx.gbl Microsoft ESMTP MAIL Service, Version: 6.0.379
0.4675 ready at Mon, 2 Apr 2012 14:53:45 -0700

Mensagem: HELO www.hotmail.com.br
Retorno: 250 BLU0-SMTP201.phx.gbl Hello [189.49.246.15]

Mensagem: MAIL FROM:
Retorno: 550 5.7.3 Requested action aborted; user not authenticated

Mensagem: RCPT TO:
Retorno:
Mensagem: DATA
Retorno:
Mensagem: Subject: Mensagem Teste!
Mensagem: From: [email]meu_email@hotmail.com[/email]
Mensagem: To: [email]meu_email@hotmail.com[/email]
Mensagem: Ola, voce acabou de receber uma mensagem!
Retorno:
Mensagem: QUIT
Retorno:
Fim do envio!
intruso
intruso Tô em todas Registrado
1.8K Mensagens 41 Curtidas
#9 Por intruso
02/04/2012 - 19:36
Aparentemente, podem existir várias causas, vamos a algumas delas:
- Você está realizando autenticação sem o layer de segurança (consulte a documentação do SMTP - RFC ?).
- Seu usuário e senha estão errados.
- Você está sendo classificado pelo servidor como lixo eletrônico e acaba por cair no bloqueio automatico.

Se seu servidor requer autenticação segura, você terá de implementar essa parte do protocolo, ou usar uma api que já tenha suporte.
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal