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;
}


Responder a