Você se refere aos emails que os sites enviam atraves da função 'mail' do PHP ?
Se for, use a ferramenta que anexei a este email, 'sceo_mail' , que vem no
pacote do MTA Sceo.
O deixei sob licensa GPL
Compile-o assim:
# gcc sceo_mail.c -o sceo_mail
Copie o binário gerado para /usr/sbin
# cp sceo_mail /usr/sbin
Edite o seu php.ini e altere a opção sendmail_path para:
sendmail_path /usr/sbin/sceo_mail -ip <IP do Serv. SMTP> -au
<usuario:senha>
Exemplo:
sendmail_path /usr/sbin/sceo_mail -ip 192.168.0.1 -au roberto:senha124
Reinicie o Apache.
Agora sempre que for executado a função 'mail' do PHP pelos seus sites, o
sceo_mail será acionado e enviará o email
via TCP/IP ao SMTP 192.168.0.1 se autenticando com o usuário roberto
Espero ter ajudado
Abraço,
Lucas
---- ORIGINAL MESSAGE ----
FROM: Roberto Pereira ;
TO: ;
SUBJECT: [slack-users] Sendmail
DATE: 16/04/2009 - 01:01 Pessoa estou com um pequeno
probleminha, gostaria de saber se alguem já implementou alguma solução parecida
com isso, tenho um servidor de pagina com sendmail, mais ele não é o servidor
principal de email, ai quando fosse enviar email por esse servidor ele
repassaria ao servidor principal de email, porem ele precisaria antes
autenticar nesse servidor mediante login e senha, seria como se monta-se um
servidor de email que utiliza-se o servidor de email do terra para submeter
seus email.. já pesquisei sobre relay e masquerading, literalmente estou sem
rumo, se alguem tiver um luz agradeço e muito.....
Desde já agradeço a ajuda e colaboração.. obrigado
--
Roberto Benedito
[email protected]
--~--~---------~--~----~------------~-------~--~----~
GUS-BR - Grupo de Usuários de Slackware Brasil
http://www.slackwarebrasil.org/
http://groups.google.com/group/slack-users-br
Antes de perguntar:
http://www.istf.com.br/perguntas/
Para sair da lista envie um e-mail para:
[email protected]
-~----------~----~----~----~------~----~------~--~---
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Utilitario para enviar emails a partir de um prompt. Substitui o
binario do sendmail para operacoes de envio do PHP, CRON entre
outros
Programado por Lucas Priori
Versao: 0.1t
Compilar Linux:
gcc sceo_mail.c -o sceo_mail
Compilar FreeBSD:
gcc sceo_mail.c -o sceo_mail -DFreeBSD
******************************************************************
sceo_mail e' um utilitario de envio de emails via prompt
Copyright (C) 2009 Lucas Priori
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<time.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
#include<netdb.h>
#ifndef FreeBSD
#include<netinet/ip_icmp.h>
#endif
#include<stdarg.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<pwd.h>
#define VERSAO "v0.1t"
#define TAM_buffer 2048
#define TAM_campo_email 200
#define NUM_rcpts 100
#define NUM_opcoes 68
#define TMP_dir "/tmp"
#define NUM_msgs 32
#define DEF_timeout 30
#define MAX_op_a 50
#define MAX_rcpts 100
/*--------------- Variaveis globais ---------------*/
//TEMPO
struct servs_tempo{
char dia_semana[3];
char fim1;
char mes[3];
char fim2;
char dia[2];
char fim3;
char hora[2];
char fim4;
char minuto[2];
char fim5;
char segundo[2];
char fim6;
char ano[4];
char fim7;
}infotempo,tlog;
time_t tempo;
struct timeval tval;
struct sockaddr_in rede_remota;
int sock_remoto;
char tab_base64[65]=
{ 'A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z',
'0','1','2','3','4','5','6','7','8','9','+','/', 0
};
/***************************************************/
/* Funcoes Uteis */
/***************************************************/
//---------------------------------------------------
void pegtempo_log(void){
time(&tempo);
memcpy(&tlog,ctime(&tempo),sizeof(tlog));
tlog.fim1=tlog.fim2=tlog.fim3=tlog.fim4=tlog.fim5=tlog.fim6=tlog.fim7=0;
if(tlog.dia[0]==' ')tlog.dia[0]='0';
if((tlog.mes[0]=='J')&&(tlog.mes[1]=='a')&&(tlog.mes[2]=='n'))strcpy(tlog.mes,"01");
else if((tlog.mes[0]=='F')&&(tlog.mes[1]=='e')&&(tlog.mes[2]=='b'))strcpy(tlog.mes,"02");
else if((tlog.mes[0]=='M')&&(tlog.mes[1]=='a')&&(tlog.mes[2]=='r'))strcpy(tlog.mes,"03");
else if((tlog.mes[0]=='A')&&(tlog.mes[1]=='p')&&(tlog.mes[2]=='r'))strcpy(tlog.mes,"04");
else if((tlog.mes[0]=='M')&&(tlog.mes[1]=='a')&&(tlog.mes[2]=='y'))strcpy(tlog.mes,"05");
else if((tlog.mes[0]=='J')&&(tlog.mes[1]=='u')&&(tlog.mes[2]=='n'))strcpy(tlog.mes,"06");
else if((tlog.mes[0]=='J')&&(tlog.mes[1]=='u')&&(tlog.mes[2]=='l'))strcpy(tlog.mes,"07");
else if((tlog.mes[0]=='A')&&(tlog.mes[1]=='u')&&(tlog.mes[2]=='g'))strcpy(tlog.mes,"08");
else if((tlog.mes[0]=='S')&&(tlog.mes[1]=='e')&&(tlog.mes[2]=='p'))strcpy(tlog.mes,"09");
else if((tlog.mes[0]=='O')&&(tlog.mes[1]=='c')&&(tlog.mes[2]=='t'))strcpy(tlog.mes,"10");
else if((tlog.mes[0]=='N')&&(tlog.mes[1]=='o')&&(tlog.mes[2]=='v'))strcpy(tlog.mes,"11");
else if((tlog.mes[0]=='D')&&(tlog.mes[1]=='e')&&(tlog.mes[2]=='c'))strcpy(tlog.mes,"12");
}
//---------------------------------------------------
//Função de log do sistema
//Retornos
// 0 = Sucesso
// 1 = Erro ao abrir o arquivo
// 2 = Tempo limite de espera atingido
char sceo_log(char *CAM_log,char *msg_log){
#define MAX_log_espera 100
int arq_log;
unsigned int cont1=0;
arq_log=open(CAM_log,O_CREAT | O_WRONLY,0666);
if(arq_log<0)return 1;
while(lockf(arq_log,F_TLOCK,0)&& cont1<MAX_log_espera){
cont1++;
sched_yield(); // Passar a vez para outro processo. Aguardando até o arquivo de log liberar
}
if(cont1==MAX_log_espera){
close(arq_log);
return 2;
}
lseek(arq_log,0,2);
write(arq_log,msg_log,strlen(msg_log));
lockf(arq_log,F_ULOCK,0);
close(arq_log);
return 0;
}
//---------------------------------------------------
// Funcao snprintf + strcat
int snprintfcat(char *buffer_local,int tam_buffer,char *formato,...){
va_list args;
char *posi_buffer;
unsigned int tam_restante;
unsigned int tam_total;
posi_buffer=buffer_local+strlen(buffer_local);
tam_restante=tam_buffer-(posi_buffer-buffer_local);
tam_total=posi_buffer-buffer_local;
if((posi_buffer-buffer_local)>=tam_buffer-1)tam_buffer;
va_start(args,formato);
tam_total+=vsnprintf(posi_buffer,tam_restante,formato,args);
va_end(args);
return tam_total;
}
//---------------------------------------------------
//Funcao para comparar duas strings desconciderando
//a diferença entre maiúsculas e minúsculas
//Retornos:
//0 = strings são iguais
//1 = strings são diferentes
int cmp_str(unsigned char *string1,unsigned char *string2,int num_bytes){
if(!num_bytes){
if(string1[0]==string2[0])return 0;
return 1;
}
int ret_val=0;
asm(
"movl %0,%%edi \n"
"movl %1,%%esi \n"
"CMP_STR_proxbyte: \n"
"movb (%%esi),%%al \n"
"cmpb (%%edi),%%al \n"
"jne CMP_STR_trocar \n"
"CMP_STR_incr: \n"
"incl %%esi \n"
"incl %%edi \n"
"loop CMP_STR_proxbyte \n"
"jmp CMP_STR_term \n"
"CMP_STR_trocar: \n"
"xorb $32,%%al \n"
"cmpb (%%edi),%%al \n"
"je CMP_STR_incr \n"
"CMP_STR_term: \n"
"testw %%cx,%%cx \n"
"jz CMP_STR_fim \n"
"movw $1,%%cx \n"
"CMP_STR_fim: \n"
"movw %%cx,%3 \n"
:
:"m"(string1),"m"(string2),"c"(num_bytes),"m"(ret_val)
:"edi","esi","eax"
);
return ret_val;
}
//---------------------------------------------------
//Pega a data e hora atual
void pegtempo(void){
time(&tempo);
memcpy(&infotempo,ctime(&tempo),sizeof(infotempo));
infotempo.fim1=0;
infotempo.fim2=0;
infotempo.fim3=0;
infotempo.fim4=0;
infotempo.fim5=0;
infotempo.fim6=0;
infotempo.fim7=0;
if(infotempo.dia[0]==' ')infotempo.dia[0]='0';
}
//---------------------------------------------------
//Função de envio de buffer via socket
int sceo_send(int num_sock, char *buffer_local, int tamanho, unsigned int flags){
unsigned int enviados=0;
int b_enviados=0;
enviados=tamanho;
do{
b_enviados=send(num_sock,buffer_local,tamanho,0);
if(b_enviados<0)return -1;
buffer_local=buffer_local+b_enviados;
tamanho=tamanho-b_enviados;
}while(tamanho && b_enviados);
return enviados;
}
//---------------------------------------------------
//Função de recebimento de buffer via socket com
//segurança de timeout
int sceo_recv(int num_sock, char *buffer_local, int tamanho, unsigned int flags){
int local_b_recebidos;
fd_set ldesc;
FD_ZERO(&ldesc);
FD_SET(num_sock,&ldesc);
tval.tv_sec=DEF_timeout;
tval.tv_usec=0;
select(num_sock+1,&ldesc,NULL,NULL,&tval);
if(FD_ISSET(sock_remoto,&ldesc)){
// -- Dados recebidos --
local_b_recebidos=recv(num_sock,buffer_local,TAM_buffer,flags);
if(local_b_recebidos>=0)buffer_local[local_b_recebidos]=0;
}else {
// -- Tempo esgotado. Fechar a conexao --
local_b_recebidos=0;
}
return local_b_recebidos;
}
//---------------------------------------------------
//Função para codificar um buffer para MIME64
void base64_codif(unsigned char *retorno,unsigned char *str_normal,int tamanho){
char *base=tab_base64;
asm(
"xorl %%edx,%%edx \n"
"movl $3,%%ebx \n"
"divl %%ebx \n"
"movl %%eax,%%ecx \n"
"pushw %%dx \n"
"testb %%dl,%%dl \n"
"jz CODI_Pular \n"
"incl %%ecx \n"
"CODI_Pular: \n"
"movl %0,%%edi \n"
"movl %1,%%esi \n"
"movl %2,%%ebx \n"
"CODI_Prox_casa: \n"
"pushl %%ecx \n"
"movl (%%esi),%%eax \n"
"rorw $8,%%ax \n"
"rorl $16,%%eax \n"
"rorw $8,%%ax \n"
"shrl $8,%%eax \n"
"movw $4,%%cx \n"
"shll $2,%%eax \n"
"addl $4,%%edi \n"
"CODI_Prox_byte: \n"
"shrb $2,%%al \n"
"xlatb \n"
"decl %%edi \n"
"movb %%al,(%%edi) \n"
"shrl $6,%%eax \n"
"loop CODI_Prox_byte \n"
"addl $4,%%edi \n"
"addl $3,%%esi \n"
"popl %%ecx \n"
"loop CODI_Prox_casa \n"
"popw %%dx \n" // Parte que coloca o '=' no final da string
"testb %%dl,%%dl \n" // gerada
"jz CODI_Fim \n"
"movl $3,%%ecx \n"
"subb %%dl,%%cl \n"
"subl %%ecx,%%edi \n"
"movb $61,(%%edi) \n"
"decb %%cl \n"
"incl %%edi \n"
"testb %%cl,%%cl \n"
"jz CODI_Fim \n"
"movb $61,(%%edi) \n"
"incl %%edi \n"
"CODI_Fim: \n"
"movb $0,(%%edi) \n"
:
:"m"(retorno),"m"(str_normal),"m"(base),"a"(tamanho)
:"edi","esi","ebx","ecx","edx"
);
return ;
}
/***************************************************/
/* Programa principal */
/***************************************************/
int main(int argc,char *argv[]){
FILE *arq_tmp,*arq_anexo;
struct passwd *userdb;
struct stat dados_entr;
char buffer[TAM_buffer+1];
char linha[TAM_buffer+1];
char byte=0;
char *ptr_aux1;
char *ptr_aux2;
char op_sf[1024]={0};
char op_log[1024]="/var/log/sceo_mail.log";
char op_su[512]={0};
char op_to[MAX_rcpts][512]={0};
char op_f[512]={0};
char op_ip[20]="127.0.0.1";
char op_au_usu[512]={0};
char op_au_sen[512]={0};
char op_fuso[20]="-0300\0";
char *op_a[MAX_op_a];
char modo_op_a=0;
char modo_to_acionado=0;
char email_tmp[1024];
char from_existe=0;
char to_existe=0;
char subject_existe=0;
char boundary[100]={0};
int total_op_a=0;
int numero=0;
int b_enviados=0;
int b_recebidos=0;
unsigned short rcpts_aceitos=0;
unsigned int cont_to=0;
unsigned int b_lidos=0;
unsigned int b_gravados=0;
unsigned int cont1=0;
unsigned int cont2=0;
unsigned int cont3=0;
unsigned int cont4=0;
/*--- Lendo parametros passados ---*/
for(cont1=1,cont2=2;cont1<argc;cont1++,cont2++){
if(!strcmp(argv[cont1],"-f")){
if(argv[cont2]){
//strcpy(op_to,argv[cont2]);
cont3=0;
cont4=0;
while(argv[cont2][cont3]){
if(argv[cont2][cont3]!='<' && argv[cont2][cont3]!='>'){
op_f[cont4]=argv[cont2][cont3];
cont4++;
}
cont3++;
}
modo_op_a=0;
}
}else if(!strcmp(argv[cont1],"-to")){
if(argv[cont2]){
strcpy(op_to[cont_to],argv[cont2]);
modo_op_a=0;
cont_to++;
}
}else if(!strcmp(argv[cont1],"-sf")){
if(argv[cont2]){
strcpy(op_sf,argv[cont2]);
modo_op_a=0;
}
}else if(!strcmp(argv[cont1],"-log")){
if(argv[cont2])strcpy(op_log,argv[cont2]);
}else if(!strcmp(argv[cont1],"-su")){
if(argv[cont2]){
strcpy(op_su,argv[cont2]);
modo_op_a=0;
}
}else if(!strcmp(argv[cont1],"-ip")){
if(argv[cont2]){
strcpy(op_ip,argv[cont2]);
modo_op_a=0;
}
}else if(!strcmp(argv[cont1],"-au")){
if(argv[cont2]){
ptr_aux1=argv[cont2];
ptr_aux2=strchr(ptr_aux1,':');
if(!ptr_aux2 || *ptr_aux1==':'){
printf("Parametro -au requer um usuario e senha separados por ':'\n");
goto Ajuda;
}
*ptr_aux2=0;
ptr_aux2++;
strcpy(op_au_usu,ptr_aux1);
strcpy(op_au_sen,ptr_aux2);
modo_op_a=0;
}
}else if(!strcmp(argv[cont1],"-h") || !strcmp(argv[cont1],"--help") || !strcmp(argv[cont1],"--ajuda")){
Ajuda:
printf("Sceo Mail %s\n",VERSAO);
printf("Opcoes | Descrição\n");
printf(" -to ----> Para forcar o Destinatario (To) da mensagem\n");
printf(" Ex: ./sceo_arq -to [email protected] -sf /home/arq_email.txt\n");
printf(" OBS: Com esta opção o email NÃO precisa ter um campo To:\n");
printf(" -f ----> Para forcar o Remetente (From) da mensagem\n");
printf(" Ex: ./sceo_arq -f [email protected] -sf /home/arq_email.txt\n");
printf(" OBS: Com esta opção o email NÃO precisa ter um campo From:\n");
printf(" -sf ----> Enviar um arquivo de email");
printf(" Ex: ./sceo_arq -sf /home/arq_email.txt\n");
printf(" OBS: Caso voce nao use a opcao -a (anexos) o arquivo de email precisa conter os campos\n");
printf(" From:, To: e Subject:\n");
printf(" -su ----> Para forcar o Assunto (Subject) da mensagem\n");
printf(" Ex: ./sceo_arq -su \"Este é o campo assunto\" -sf /home/arq_email.txt\n");
printf(" OBS: Com esta opção o email NÃO precisa ter um campo Subject:\n");
printf(" -ip ----> Para usar o modo de entrega via TCP/IP\n");
printf(" Voce deve colocar o numero do servidor smtp nesta opção\n");
printf(" Ex: ./sceo_arq -ip 192.168.0.254 -sf /home/arq_email.txt\n");
printf(" -au ----> Forca uma autentiação na hora de entregar o email ao SMTP\n");
printf(" Voce deve especificar o usuario e senha separados por ':'\n");
printf(" Ex: ./sceo_arq -ip 192.168.0.254 -au meuusuario:minhasenha -sf /home/arq_email.txt\n");
printf(" -log ---> Indica qual sera o arquivo de log\n");
printf(" Ex: ./sceo_arq -log /var/log/sceo/sceo_mail.log\n");
printf(" -a ----> Indica um Anexo a incluir no email\n");
printf(" Voce deve especificar o caminho do arquivo a anexar\n");
printf(" OBS: Atualmente só é permitido %d anexos\n",MAX_op_a);
printf(" Para usar esta opcao, voce precisa utilizar as opcoes\n");
printf(" -f, -to e -su pois se voce passar um cabeçalho, ele será\n");
printf(" desconsiderado e incluido no corpo do email\n");
printf(" A especificacao dos anexos devem ser separados por espacos\n");
printf(" Ex ./sceo_arq -sf /home/arq_email.txt -su \"Teste com anexo\" -to [email protected] -a /home/usuario/figura.jpg\n");
printf(" ./sceo_arq -sf /home/arq_email.txt -su \"Teste com anexo\" -to [email protected] -a /home/usuario/figura.jpg /home/usuario/figura2.jpg /home/usuario/figura50.jpg\n");
printf("\n");
return 0;
}else if(!strcmp(argv[cont1],"-a")){
// Ligando o modo anexo
modo_op_a=1;
}else if(modo_op_a){
if(total_op_a==MAX_op_a){
printf("Muitos anexos\n");
goto Ajuda;
}
op_a[total_op_a]=argv[cont1];
total_op_a++;
}
}
if(total_op_a){
if(!op_to[0][0] || !op_su[0]){
printf("\nPara usar a opção -a é preciso especificar no minimo um destinatario (-to)\n e o assunto (-su)\n\n");
goto Ajuda;
}
}
sprintf(email_tmp,"%s/mail_%d.eml",TMP_dir,getpid());
arq_tmp=fopen(email_tmp,"wb");
if(!arq_tmp){
printf("Nao foi possível criar o arquivo: %s \n",email_tmp);
return 1;
}
if(!op_sf[0]){
// Opção -sf nao especificada
// Pegando o email via STDIN
/*if(total_op_a)printf("Entre com o corpo do email\n");
else {
if(!op_to[0][0] && !op_su[0])printf("Entre com o cabeçalho e corpo do email\nObs: O cabecalho e o corpo devem ser separados por uma linha em branco\n");
else printf("Entre com o corpo do email\n");
}
printf("Para finalizar pressione CTRL + D\n\n");*/
cont1=0;
while((byte=fgetc(stdin))!=EOF){
buffer[cont1]=byte;
cont1++;
if(cont1==TAM_buffer){
b_gravados=fwrite(&buffer,1,cont1,arq_tmp);
if(b_gravados!=cont1){
fclose(arq_tmp);
remove(email_tmp);
printf("Sem espaco na particao\n\n");
return 1;
}
cont1=0;
}
}
if(cont1>0){
b_gravados=fwrite(&buffer,1,cont1,arq_tmp);
if(b_gravados!=cont1){
fclose(arq_tmp);
remove(email_tmp);
printf("Sem espaco na particao\n\n");
return 1;
}
}
strcpy(op_sf,email_tmp);
fclose(arq_tmp);
}
/* -- Abrindo o arquivo com a mensagem -- */
arq_tmp=fopen(op_sf,"rb");
if(!arq_tmp){
printf("Nao foi possivel abrir o arquivo: %s\n",op_sf);
return 1;
}
if(!op_f[0] || !op_to[0][0]){
// Pegando o From ou To do arquivo de email
cont2=0;
while(!feof(arq_tmp)){
b_lidos=fread(&buffer,1,TAM_buffer,arq_tmp);
for(cont1=0;cont1<b_lidos;cont1++){
if(buffer[cont1]==10){
linha[cont2]=0;
if(!cont2)goto Fora_achar_campos;
if(modo_to_acionado)if(linha[0]!=' ' && linha[0]!=9)modo_to_acionado=0;
// Checando por From
if(!cmp_str(linha,"from:",5)){
// from achado
from_existe=1;
ptr_aux1=strchr(linha,'@');
ptr_aux2=ptr_aux1;
if(ptr_aux1 && !op_f[0]){
while(*ptr_aux1!=' ' && *ptr_aux1!='<')ptr_aux1--;
ptr_aux1++;
while(*ptr_aux2!=' ' && *ptr_aux2!='>' && *ptr_aux2!=0)ptr_aux2++;
*ptr_aux2=0;
strcpy(op_f,ptr_aux1);
}
}
// Checando por To
if(!cmp_str(linha,"to:",3) || !cmp_str(linha,"cc:",3) || !cmp_str(linha,"bcc:",3) || modo_to_acionado){
// to achado
ptr_aux2=linha;
modo_to_acionado=1;
do{
ptr_aux1=strchr(ptr_aux2,'@');
ptr_aux2=ptr_aux1;
if(ptr_aux1){
while(*ptr_aux1!=' ' && *ptr_aux1!='<' && *ptr_aux1!=',')ptr_aux1--;
ptr_aux1++;
while(*ptr_aux2!=' ' && *ptr_aux2!='>' && *ptr_aux2!=',' && *ptr_aux2!=0)ptr_aux2++;
byte=*ptr_aux2;
*ptr_aux2=0;
strcpy(op_to[cont_to],ptr_aux1);
to_existe=1;
cont_to++;
if(cont_to==MAX_rcpts){
printf("Muitos destinatarios\n");
fclose(arq_tmp);
remove(email_tmp);
return 1;
}
if(byte)ptr_aux2++;
}
}while(ptr_aux2 && *ptr_aux2);
}
if(!cmp_str(linha,"Subject:",8))subject_existe=1;
cont2=0;
}else if(buffer[cont1]!=10){
linha[cont2]=buffer[cont1];
cont2++;
}
}
}
}
Fora_achar_campos:
fseek(arq_tmp,0,0);
if(!op_to[0][0]){
printf("É preciso especificar um destinatario\nno corpo do email ou com a opção -to\n\n");
return 1;
}
if((sock_remoto=socket(AF_INET,SOCK_STREAM,0))==-1){
printf("Erro: %s\n\n",strerror(errno));
return 1;
}
if(setsockopt(sock_remoto,SOL_SOCKET,SO_REUSEADDR,&numero,sizeof(int))==-1){
printf("Erro: %s\n\n",strerror(errno));
return 1;
}
rede_remota.sin_family=AF_INET;
rede_remota.sin_port=htons(25);
rede_remota.sin_addr.s_addr=inet_addr(op_ip);
memset(rede_remota.sin_zero,0,8);
if((connect(sock_remoto,(struct sockaddr *)&rede_remota,sizeof(struct sockaddr)))==-1){
printf("\nErro: %s\n", strerror(errno));
close(sock_remoto);
fclose(arq_tmp);
remove(email_tmp);
return 0;
}
b_recebidos=sceo_recv(sock_remoto,buffer,TAM_buffer,0);
if(b_recebidos<=0){
printf("Conexão fechada pelo Host\n");
Fechar_conexao:
close(sock_remoto);
fclose(arq_tmp);
remove(email_tmp);
return 1;
}
if(strncmp(buffer,"220",3)){
printf("Host nao esta aceitando conexoes no momento\n");
goto Fechar_conexao;
}
// CMD HELO
buffer[0]=0;
b_lidos=sprintf(buffer,"Helo localhost\r\n");
b_enviados=sceo_send(sock_remoto,buffer,b_lidos,0);
b_recebidos=sceo_recv(sock_remoto,buffer,TAM_buffer,0);
if(strncmp(buffer,"250",3)){
printf("Comando helo recusao pelo Host\n");
goto Fechar_conexao;
}
if(op_au_usu[0]){
buffer[0]=0;
// Autenticando-se
b_lidos=sprintf(buffer,"auth login\r\n");
sceo_send(sock_remoto,buffer,b_lidos,0);
b_recebidos=sceo_recv(sock_remoto,buffer,TAM_buffer,0);
if(b_recebidos<=0){
printf("Comando auth login recusao pelo Host\n");
goto Fechar_conexao;
}
if(!strncmp(buffer,"334 ",4)){
base64_codif(linha,op_au_usu,strlen(op_au_usu));
b_lidos=sprintf(buffer,"%s\r\n",linha);
sceo_send(sock_remoto,buffer,b_lidos,0);
b_recebidos=sceo_recv(sock_remoto,buffer,TAM_buffer,0);
if(b_recebidos<=0){
printf("Comando auth login recusao pelo Host\n");
goto Fechar_conexao;
}
if(!strncmp(buffer,"334 ",4)){
base64_codif(linha,op_au_sen,strlen(op_au_usu));
b_lidos=sprintf(buffer,"%s\r\n",linha);
sceo_send(sock_remoto,buffer,b_lidos,0);
b_recebidos=sceo_recv(sock_remoto,buffer,TAM_buffer,0);
if(strncmp(buffer,"235 ",4)){
printf("Falha na autenticacao [%s]\n",buffer);
goto Fechar_conexao;
}
}
}
}
// CMD Mail From:
buffer[0]=0;
b_lidos=sprintf(buffer,"Mail from: <%s>\r\n",op_f);
b_enviados=sceo_send(sock_remoto,buffer,b_lidos,0);
b_recebidos=sceo_recv(sock_remoto,buffer,TAM_buffer,0);
if(strncmp(buffer,"250",3)){
printf("Remetente recusado pelo Host [%s]\n",buffer);
goto Fechar_conexao;
}
// CMD Rcpt to:
for(cont2=0;cont2<cont_to;cont2++){
buffer[0]=0;
b_lidos=sprintf(buffer,"Rcpt to: <%s>\r\n",op_to[cont2]);
b_enviados=sceo_send(sock_remoto,buffer,b_lidos,0);
b_recebidos=sceo_recv(sock_remoto,buffer,TAM_buffer,0);
if(!strncmp(buffer,"250",3))rcpts_aceitos++;
}
if(!rcpts_aceitos){
printf("Nenhum destinatario foi aceito\n");
goto Fechar_conexao;
}
// CMD Data:
buffer[0]=0;
b_lidos=sprintf(buffer,"Data\r\n");
b_enviados=sceo_send(sock_remoto,buffer,b_lidos,0);
b_recebidos=sceo_recv(sock_remoto,buffer,TAM_buffer,0);
if(strncmp(buffer,"354",3)){
printf("Comando Data recusado pelo Host [%s]\n",buffer);
goto Fechar_conexao;
}
// Criando linha Date o Message-ID
pegtempo();
//Date: Sat, 14 Apr 2007 18:37:53 -0300
snprintf(buffer,sizeof(buffer),"Date: %s, %s %s %s %s:%s:%s -%s\r\nMessage-ID: <%ld...@localhost>\r\n",infotempo.dia_semana,infotempo.dia,infotempo.mes,infotempo.ano,infotempo.hora,infotempo.minuto,infotempo.segundo,op_fuso,tempo,getpid());
if(!from_existe){
// Criando a linha From
snprintfcat(buffer,TAM_buffer,"From: %s\r\n",op_f);
}
if(!to_existe){
// Criando a linha To
snprintfcat(buffer,TAM_buffer,"To: %s\r\n",op_to[0]);
}
if(!subject_existe){
// Criando a linha Subject
snprintfcat(buffer,TAM_buffer,"Subject: %s\r\n",op_su);
}
userdb=getpwuid(getuid());
snprintfcat(buffer,TAM_buffer,"X-SysUser: %s\r\n",userdb->pw_name);
b_lidos=strlen(buffer);
b_enviados=sceo_send(sock_remoto,buffer,b_lidos,0);
if(b_enviados!=b_lidos)goto Cnx_interrompida;
if(total_op_a){
// Criando multipart/mixed
sprintf(boundary,"%ld_%ld.%d",tempo>>1,tempo,getpid());
b_lidos=sprintf(buffer,"MIME-Version: 1.0\r\nContent-Type: multipart/mixed;\r\n\tboundary=\"%s\"\r\nX-Mailer: Sceo_mail %s\r\n",boundary,VERSAO);
b_enviados=sceo_send(sock_remoto,buffer,b_lidos,0);
if(b_enviados!=b_lidos)goto Cnx_interrompida;
b_lidos=sprintf(buffer,"\r\nThis is a multi-part message in MIME format.\r\n\r\n--%s\r\nContent-Type: text/plain;\r\n\tcharset=\"iso-8859-1\"\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\n",boundary);
b_enviados=sceo_send(sock_remoto,buffer,b_lidos,0);
if(b_enviados!=b_lidos)goto Cnx_interrompida;
}else if(!from_existe && !to_existe && !subject_existe){
strcat(buffer,"\r\n\r\n");
b_lidos=strlen(buffer);
b_enviados=sceo_send(sock_remoto,buffer,b_lidos,0);
if(b_enviados!=b_lidos)goto Cnx_interrompida;
}
while(!feof(arq_tmp)){
b_lidos=fread(&buffer,1,TAM_buffer,arq_tmp);
b_enviados=sceo_send(sock_remoto,buffer,b_lidos,0);
if(b_enviados!=b_lidos){
Cnx_interrompida:
printf("Conexao interrompida pelo Host durante a entrega\n");
goto Fechar_conexao;
}
}
if(total_op_a){
memset(&buffer,' ',10);
b_enviados=sceo_send(sock_remoto,buffer,10,0);
if(b_enviados!=10)goto Cnx_interrompida;
// Enviado anexos
for(cont1=0;cont1<total_op_a;cont1++){
ptr_aux1=op_a[cont1];
stat(ptr_aux1,&dados_entr);
if(!(dados_entr.st_mode & S_IFDIR)){
arq_anexo=fopen(ptr_aux1,"rb");
if(arq_anexo){
ptr_aux2=ptr_aux1;
ptr_aux1=ptr_aux1+strlen(ptr_aux1);
while(*ptr_aux1!='/' && ptr_aux1!=ptr_aux2)ptr_aux1--;
if(*ptr_aux1=='/')ptr_aux1++;
b_lidos=sprintf(buffer,"\r\n--%s\r\nContent-Type: application/octet-stream;\r\n\tname=\"%s\"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment;\r\n\tfilename=\"%s\"\r\n\r\n",boundary,ptr_aux1,ptr_aux1);
b_enviados=sceo_send(sock_remoto,buffer,b_lidos,0);
if(b_enviados!=b_lidos)goto Cnx_interrompida;
while(!feof(arq_anexo)){
b_lidos=fread(&buffer,1,57,arq_anexo);
base64_codif(linha,buffer,b_lidos);
b_lidos=sprintf(buffer,"%s\r\n",linha);
b_enviados=sceo_send(sock_remoto,buffer,b_lidos,0);
if(b_enviados!=b_lidos)goto Cnx_interrompida;
}
fclose(arq_anexo);
b_enviados=sceo_send(sock_remoto,"\r\n",2,0);
if(b_enviados!=2)goto Cnx_interrompida;
}else printf("Anexo [%s] nao encontrado\n",ptr_aux1);
}
}
b_lidos=sprintf(buffer,"--%s--\n\r",boundary);
b_enviados=sceo_send(sock_remoto,buffer,b_lidos,0);
if(b_enviados!=b_lidos)goto Cnx_interrompida;
}
//strcpy(buffer,"\r\n.\r\n");
b_enviados=sceo_send(sock_remoto,"\r\n.\r\n",5,0);
b_recebidos=sceo_recv(sock_remoto,buffer,TAM_buffer,0);
if(strncmp(buffer,"250",3)){
printf("O email nao recusado pelo Host [%s]\n",buffer);
goto Fechar_conexao;
}
b_enviados=sceo_send(sock_remoto,"quit\r\n",6,0);
close(sock_remoto);
fclose(arq_tmp);
remove(email_tmp);
pegtempo_log();
sprintf(buffer,"[%s/%s/%s %s:%s:%s] (PID %d) From: %s (%s), To: (%s ...), %d dests\n",tlog.ano,tlog.mes,tlog.dia,tlog.hora,tlog.minuto,tlog.segundo,getpid(),userdb->pw_name,op_f,op_to,cont_to);
sceo_log(op_log,buffer);
return 0;
}