Enviando email com PHP de um servidor SMTP

131
$from = "[email protected]";
$headers = "From:" . $from;
echo mail ("[email protected]" ,"testmailfunction" , "Oj",$headers);

Estou com problemas para enviar email em PHP. Eu recebo um erro: SMTP server response: 530 SMTP authentication is required.

Fiquei com a impressão de que você pode enviar um email sem o SMTP para verificar. Sei que esse e-mail provavelmente será filtrado, mas isso não importa no momento.

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = someonelse@example.com

Esta é a configuração no php.iniarquivo. Como devo configurar o SMTP? Existem servidores SMTP que não exigem verificação ou eu mesmo devo configurar um servidor?

Borut Flis
fonte

Respostas:

168

Ao enviar um email por um servidor que requer autenticação SMTP, você realmente precisa especificá-lo e definir o host, o nome de usuário e a senha (e talvez a porta, caso não seja a padrão - 25).

Por exemplo, eu costumo usar o PHPMailer com configurações semelhantes a estas:

$mail = new PHPMailer();

// Settings
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';

$mail->Host       = "mail.example.com"; // SMTP server example
$mail->SMTPDebug  = 0;                     // enables SMTP debug information (for testing)
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Port       = 25;                    // set the SMTP port for the GMAIL server
$mail->Username   = "username"; // SMTP account username example
$mail->Password   = "password";        // SMTP account password example

// Content
$mail->isHTML(true);                                  // Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

$mail->send();

Você pode encontrar mais informações sobre o PHPMailer aqui: https://github.com/PHPMailer/PHPMailer

Ivo Pereira
fonte
21
+1 para phpMailer - é a alternativa de pessoas sãs à mail()função incorporada do PHP .
SDC
8
Vale a pena notar para os que se deparam com essa resposta que o PHPMailer também está embutido no WordPress e pode ser configurado usando o 'phpmailer_init'gancho de ação. É uma maneira conveniente de configurar o WordPress para correio SMTP ou Amazon SES (que suporta conexões SMTP).
Matt van Andel
1
O PHP Mailer pode ser usado em scripts pagos?
Luka
2
@Luka Sim, é. De acordo com o arquivo de licença, o PHPMailer usa a licença LGPL 2.1, que permite o uso comercial.
Alejandro
Preciso fazer algo especial para usar esse código? Onde eu coloco isso? Posso chamá-lo com um formulário HTML5 com uma solicitação POST? Como envio um email depois de criar este objeto PHPMailer?
Aaron Franke
53
<?php
ini_set("SMTP", "aspmx.l.google.com");
ini_set("sendmail_from", "[email protected]");

$message = "The mail message was sent with the following mail setting:\r\nSMTP = aspmx.l.google.com\r\nsmtp_port = 25\r\nsendmail_from = [email protected]";

$headers = "From: [email protected]";

mail("[email protected]", "Testing", $message, $headers);
echo "Check your email now....&lt;BR/>";
?>

ou, para mais detalhes, continue a ler .

Dipesh Parmar
fonte
O IP que você está usando para enviar email não está autorizado a enviar 550-5.7.1 diretamente para nossos servidores. Eu recebo esse erro. tudo o que eu quero é uma retransmissão de email aberta.
precisa saber é o seguinte
Eu não tenho um IP estático. Você conhece alguma retransmissão de email aberta.
precisa saber é o seguinte
1
Além disso, consulte support.google.com/a/answer/176600?hl=en para retransmissões do Google SMTP.
fyrye
5
Esta é a melhor resposta para GoDaddy php mail()questões de função - 2017 - não deve ter que baixar PHPMailer ou algum outro recurso 3rd party - graças
soulshined
4
O link "LER ON" está quebrado
vladkras 7/11/18
46

Para usuários do Unix, mail () está realmente usando o comando Sendmail para enviar email. Em vez de modificar o aplicativo, você pode alterar o ambiente. O msmtp é um cliente SMTP com sintaxe da CLI compatível com o Sendmail, o que significa que pode ser usado no lugar do Sendmail. Requer apenas uma pequena alteração no seu php.ini.

sendmail_path = "/usr/bin/msmtp -C /path/to/your/config -t"

Mesmo a função low (mail) pode funcionar com o SMTP. É super útil se você estiver tentando conectar um aplicativo existente a serviços de correio como sendgrid ou mandrill sem modificar o aplicativo.

txyoji
fonte
1
Ótima solução, use-a em vários servidores agora!
raice
3
Implementando isso nos meus contêineres do Docker para aplicativos que não usam uma biblioteca de correspondência.
Batandwa
Excelente caminho de migração do vanilla mail()para algo que suporta SMTP. Obrigado!
Rinogo 31/08/19
O MSMTP também está disponível para Windows. Os downloads óbvios têm a versão 1.4. A versão que encontrei em algum lugar é 1.6.2. Não sei se existe um 1.8.6 para Windows.
Bilbo
O autor parou de fornecer binários do Windows antes de fevereiro de 2016.
Bilbo
17

O problema é que a mail()função PHP tem uma funcionalidade muito limitada. Existem várias maneiras de enviar email do PHP.

  1. mail()usa o servidor SMTP no seu sistema. Existem pelo menos dois servidores que você pode usar no Windows: hMailServer e xmail . Passei várias horas configurando e levantando-os. O primeiro é mais simples na minha opinião. No momento, o hMailServer está trabalhando no Windows 7 x64.
  2. mail()usa servidor SMTP em uma máquina remota ou virtual com Linux. Obviamente, um serviço de e-mail real como o Gmail não permite conexão direta sem credenciais ou chaves. Você pode configurar uma máquina virtual ou usar uma localizada na sua LAN. A maioria das distribuições linux possui servidor de correio pronto para uso. Configure e divirta-se. Eu uso o exim4 padrão no Debian 7 que escuta sua interface LAN.
  3. As bibliotecas de correspondência usam conexões diretas. Libs são mais fáceis de configurar. Eu usei o SwiftMailer e ele envia perfeitamente emails da conta do Gmail. Eu acho que o PHPMailer também é muito bom.

Não importa qual a sua escolha, recomendo que você use alguma camada de abstração. Você pode usar a biblioteca PHP em sua máquina de desenvolvimento executando o Windows e simplesmente mail()funcionar na máquina de produção com Linux. A camada de abstração permite trocar drivers de email, dependendo do sistema em que seu aplicativo está sendo executado. Crie MyMailerclasse abstrata ou interface com o send()método abstrato . Herdar duas classes MyPhpMailere MySwiftMailer. Implemente o send()método de maneira apropriada.

George Sovetov
fonte
17

Aqui está uma maneira de fazer isso com o PHP PEAR

// Pear Mail Library
require_once "Mail.php";

$from = '<[email protected]>'; //change this to your email address
$to = '<[email protected]>'; // change to address
$subject = 'Insert subject here'; // subject of mail
$body = "Hello world! this is the content of the email"; //content of mail

$headers = array(
    'From' => $from,
    'To' => $to,
    'Subject' => $subject
);

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => '[email protected]', //your gmail account
        'password' => 'snip' // your password
    ));

// Send the mail
$mail = $smtp->send($to, $headers, $body);

//check mail sent or not
if (PEAR::isError($mail)) {
    echo '<p>'.$mail->getMessage().'</p>';
} else {
    echo '<p>Message successfully sent!</p>';
}

Se você usa o SMTP do Gmail, lembre-se de habilitar o SMTP na sua conta do Gmail, em configurações

EDIT: Se você não encontrar o Mail.php no debian / ubuntu, você pode instalar o php-pear com

sudo apt install php-pear

Em seguida, instale a extensão de email:

sudo pear install mail
sudo pear install Net_SMTP
sudo pear install Auth_SASL
sudo pear install mail_mime

Então você deve poder carregá-lo simplesmente de require_once "Mail.php" outra forma, aqui:/usr/share/php/Mail.php

Bolli
fonte
1
require_once ('/usr/share/somewhere/Mail.php');
10

Existem alguns servidores SMTP que funcionam sem autenticação, mas se o servidor exigir autenticação, não há como contornar isso.

As funções de correio embutidas do PHP são muito limitadas - especificar o servidor SMTP é possível apenas no Windows. No * nix, mail()usará os binários do sistema operacional.

Se você deseja enviar email para um servidor SMTP arbitrário na rede, considere usar uma biblioteca como o SwiftMailer . Isso permitirá que você use, por exemplo, os servidores de saída do Gmail.

Pekka
fonte
2

Nos casos em que você está hospedando um site Wordpress no Linux e tem acesso ao servidor, pode salvar algumas dores de cabeça instalando o msmtp, que permite enviar via smtp a partir da função padrão php mail (). O msmtp é uma alternativa mais simples ao postfix, que requer um pouco mais de configuração.

Aqui estão os passos:

Instale o msmtp

sudo apt-get install msmtp-mta ca-certificates

Crie um novo arquivo de configuração:

sudo nano /etc/msmtprc

... com as seguintes informações de configuração:

# Set defaults.    
defaults

# Enable or disable TLS/SSL encryption.
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt

# Set up a default account's settings.
account default
host <smtp.example.net>
port 587
auth on
user <username@example.net>
password <password>
from <address-to-receive-bounces@example.net>
syslog LOG_MAIL

Você precisa substituir os dados de configuração representados por tudo dentro de "<" e ">" (inclusive, remova-os). Para host / nome de usuário / senha, use suas credenciais normais para enviar e-mail através do seu provedor de e-mail.

Diga ao PHP para usá-lo

sudo nano /etc/php5/apache2/php.ini

Adicione esta linha única:

sendmail_path = /usr/bin/msmtp -t

A documentação completa pode ser encontrada aqui:

https://marlam.de/msmtp/

Peter Drinnan
fonte
ssmtp também é uma solução, consulte (guia em francês): elliptips.info/guide-debian-7-envoi-de-mails-ligne-de-commande
ɾuɾ