Usando SMTP remoto no PHP

Publicado por Gustavo de Oliveira Corrêa em 15/06/2005

[ Hits: 40.605 ]

 


Usando SMTP remoto no PHP



Devido a alguns motivos não era possível instalar um servidor de e-mail no meu servidor WEB e o php.ini não permite (não que eu saiba) utilizar um SMTP remoto no Linux como no Windows. Essa foi a solução que encontrei. Depois de algum tempo descobri que o XOOPS (utilizado para fazer portais) também vem com essa opção e utilizando esse mesmo método.

Para isso eu utilizei uma classe que permitia usar um servidor SMTP remoto.

Vá em:
e faça download da última versão do phpmailer: phpmailer-1.x.x.tar.gz

Extraia-o para o local onde estão as bibliotecas do PHP. Esse diretório é indicado na linha "include_path" do php.ini, normalmente está em /usr/local/lib/php. Ou inclua um novo include_path no php.ini com o diretório desejado (não esqueça de reiniciar o Apache).

Pronto! Agora é só montar o script, no próprio site tem um exemplo. Mas por via das dúvidas, aí vai ele:


$mail = new PHPMailer();

$mail->IsSMTP(); // mandar via SMTP
$mail->Host = "smtp1.site.com;smtp2.site.com"; // Seu servidor smtp
$mail->SMTPAuth = true; // smtp autenticado
$mail->Username = "user"; // usuário deste servidor smtp
$mail->Password = "secret"; // senha

$mail->From = "from@email.com";
$mail->FromName = "Mailer";
$mail->AddAddress("josh@site.com","Josh Adams");
$mail->AddAddress("ellen@site.com"); // optional name
$mail->AddReplyTo("info@site.com","Information");

$mail->WordWrap = 50; // set word wrap
$mail->AddAttachment("/var/tmp/file.tar.gz"); // attachment
$mail->AddAttachment("/tmp/image.jpg", "new.jpg");
$mail->IsHTML(true); // send as HTML

$mail->Subject = "Here is the subject";
$mail->Body = "This is the HTML body";
$mail->AltBody = "This is the text-only body";

if(!$mail->Send())
{
echo "A mensagem não pode ser enviada

";
echo "Erro: " . $mail->ErrorInfo;
exit;
}

echo "Mensagem enviada";
?>

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

ERROR: SMTP Error: The following recipients failed: [Solução para Moodle - BlueHost]

Solucionando erro de anexo, sem nome no Uebimiau

Emexis Webmail

Uso da função mail() no código PHP

Amule atualizado no Acer Aspire One (Linpus Linux Lite)

  

Comentários
[1] Comentário enviado por thiago_mtr em 29/10/2007 - 16:41h

Amigo, o meu sisteminha que está hospedado em uma máquina usando o LAMPP tá retornando o seguinte erro.

Warning: fsockopen() [function.fsockopen]: php_network_getaddresses: getaddrinfo failed: Name or service not known in /opt/lampp/lib/php/class.smtp.php on line 105

Warning: fsockopen() [function.fsockopen]: unable to connect to smtp.montele.com.br:110 (Unknown error) in /opt/lampp/lib/php/class.smtp.php on line 105

Se puder me ajudar.

[2] Comentário enviado por gocorrea em 30/10/2007 - 07:07h

Thiago,

tudo indica que é um erro na conexão. O estranho é que até pra mim o seu servidor esta acessível. Deve ser algum bloqueio interno.

tente fazer:

# telnet smtp.montele.com.br 110

para ver se você realmente tem acesso a esse host, nessa porta.

[3] Comentário enviado por thiago_mtr em 30/10/2007 - 09:07h

Opa,

Tentei nas 3 portas possíveis... 25,110,587

No windows consegui conectar em todas.

Porém no linux não consegui conectar em nenhuma, nem sequer pingar.

safira:~ # telnet smtp.montele.com.br 110
telnet: smtp.montele.com.br: Name or service not known
smtp.montele.com.br: Unknown host

Vlw...

[4] Comentário enviado por gocorrea em 30/10/2007 - 13:28h

é algum bloqueio no linux então.

o windows que vc tentou é na mesma máquina? com o mesmo ip?

Se sim, é algum problema na máquina mesmo. Veja o iptables.

Se não pode se o firewall de algum gateway seu.

Enfim, você precisa ver as regras internas ai na sua rede.

[5] Comentário enviado por thiago_mtr em 31/10/2007 - 14:44h

Sim, consegui resolver esse erro.
Ele conecta no smpt na porta 587, que é a porta do smtp do servidor.
Não acontece mais nenhum erro na função.

Porém não chega nada no e-mail...

Não sei mais o que fazer.

[6] Comentário enviado por gocorrea em 31/10/2007 - 14:59h

hehe. Também não faço a menor ideia. Faz muito tempo que escrevi essa dica, me lembro de muito pouco. Deve ser por causa do LAMP.

[7] Comentário enviado por thiago_mtr em 09/11/2007 - 08:20h

Aeee...consegui enviar para o meu gmail.
Descobri que o sendmail estava zumbi, mas não estava instalado.

Agora, para o meu e-mail da Locaweb não consigo enviar. Estou contatando o suporte.

Esse classe usa a função mail?

[8] Comentário enviado por gocorrea em 09/11/2007 - 10:47h

não, a função mail utiliza o servidor de e-mail local (no caso o sendmail). Se não me engano essa classe conecta ao outro pc via socket.

Você conseguiu mandar via gmail ou para um e-mail do gmail?

Se você recebeu no gmail mas não recebeu no Lacaweb o mesmo e-mail pode ser problema de spam. Talvez o Locaweb tenha marcado seu ip (ou o ip do servidor que esta mandado o e-mail) como spam.

[9] Comentário enviado por thiago_mtr em 16/11/2007 - 13:40h

Vim aqui dizer que consegui solucionar o problema !!! Após eu consegui enviar para o gmail, depois de muita pesquisa eu descobri que o problema era uma configuração no DNS, feito isso tive que colocar o ip do meu servidor na entrada TXT da locaweb para que ela não seja barrado no anti-spam.

Agora eu quero ajuda em outra coisa...
O e-mail está chegando da seguinte forma:

Número da OS: 1 Nome do Cliente: XEROX Código do Cliente: XXXXXXXXXXXXXXX Número do Equipamento: 1 Tipo do Equipamento:Elevador Rua: mais Número: 1 Bairro: bairro Cidade:BH Estado: mg Tel Contato:2212121 Resp Atendimento:thiago Data Atendimento: 2007-01-01 Descrição da Reclamação:teste Status:Pendente

Porém eu gostaria de formatar isso direitinho, porém não sei como fazer. Aguarda ajuda de vocês...
Abaixo o código que pega os dados do formulário e envia o e-mail:

<?php
$mensagem .= "Número da OS: ".$_POST["numos"]." \n";
$mensagem .= "Nome do Cliente: ".$_POST["nome_cliente"]." \n";
$mensagem .= "Código do Cliente: ".$_POST["codcli"]." \n";
$mensagem .= "Número do Equipamento: ".$_POST["num_equip"]." \n";
$mensagem .= "Tipo do Equipamento:".$_POST["equip"]." \n";
$mensagem .= "Rua: ".$_POST["equip_rua"]." \n";
$mensagem .= "Número: ".$_POST["equip_numero"]." \n";
$mensagem .= "Bairro: ".$_POST["equip_bairro"]." \n";
$mensagem .= "Cidade:". $_POST["equip_cidade"]." \n";
$mensagem .= "Estado: ".$_POST["equip_uf"]." \n";
$mensagem .= "Tel Contato:". $_POST["equip_tel"]." \n";
$mensagem .= "Resp Atendimento:". $_POST["resp_atend"]." \n";
$mensagem .= "Data Atendimento: ".$_POST["data_atend"]." \n";
$mensagem .= "Descrição da Reclamação:". $_POST["desc_reclamacao"]." \n";
$mensagem .= "Status:". $_POST["status"]." \n";

$mail = new PHPMailer();

$mail->IsSMTP(); // mandar via SMTP
$mail->Host = "localhost"; // Seu servidor smtp
$mail->Port = "25";
$mail->SMTPAuth = true; // smtp autenticado
$mail->From = "fulano@provedor.com.br";
$mail->FromName = "Empresa";
$mail->AddAddress("fulano@provedor.com.br","Empresa - Sistema de Manutenção");
$mail->AddAddress("fulano@provedor.com.br","Empresa - Sistema de Manutenção");
$mail->AddReplyTo("fulano@provedor.com.br","Resposta");

$mail->WordWrap = 50; // set word wrap
//$mail->AddAttachment("/var/tmp/file.tar.gz"); // attachment
//$mail->AddAttachment("/tmp/image. jpg", "new. jpg");
$mail->IsHTML(true); // send as HTML

$mail->Subject = "Serviço Web";
$mail->Body = $mensagem;
$mail->AltBody = "This is the text-only body";

if(!$mail->Send())
{
echo "A mensagem não pode ser enviada";
echo "Erro: " . $mail->ErrorInfo;
exit;
}

echo "Mensagem enviada com sucesso";

?>

[10] Comentário enviado por jgaboardi em 19/11/2007 - 09:24h

Bom dia,

Estou tentando por para funcionar e esta me dando esta menssagem de erro:
[Mon Nov 19 09:15:40 2007] [error] [client 200.xxx.yyy.z] PHP Warning: require(class.phpmailer.php) [<a href='function.require'>function.require</a>]: failed to open stream: No such file or directory in /srv/www/htdocs/mail.php on line 3
[Mon Nov 19 09:15:40 2007] [error] [client 200.xxx.yyy.z] PHP Fatal error: require() [<a href='function.require'>function.require</a>]: Failed opening required 'class.phpmailer.php' (include_path='.:/usr/lib/php5/PHPMailer') in /srv/www/htdocs/mail.php on line 3

e vejam como esta no arquivo:

<?php

require ("class.phpmailer.php");

$mail = new PHPMailer();

$mail->IsSMTP(); // set mailer to use SMTP
.......

[11] Comentário enviado por thiago_mtr em 19/11/2007 - 13:38h

Ele não está encontrando a classe phpmailer no diretorio do php.

[12] Comentário enviado por gocorrea em 19/11/2007 - 14:03h

Thiago: Substitua os "\n" da sua mensagem por "<br>"

jgaboardi: Verifique se a classe esta na pasta do seu script, se não certifique-se de ou informar o caminho correto até ela ou adicionar a classe no diretório /usr/lib/php5. Verifique também as permissões de acesso a classe.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts