Enviando email com PHP de um servidor SMTP


131
$from = "someonelse@example.com";
$headers = "From:" . $from;
echo mail ("borutflis1@gmail.com" ,"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?

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


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", "YOURMAIL@gmail.com");

$message = "The mail message was sent with the following mail setting:\r\nSMTP = aspmx.l.google.com\r\nsmtp_port = 25\r\nsendmail_from = YourMail@address.com";

$headers = "From: YOURMAIL@gmail.com";

mail("Sending@provider.com", "Testing", $message, $headers);
echo "Check your email now....&lt;BR/>";
?>

ou, para mais detalhes, continue a ler .


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.


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.


17

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

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

$from = '<your@mail.com>'; //change this to your email address
$to = '<someone@mail.com>'; // 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' => 'your@gmail.com', //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


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.


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/


ssmtp também é uma solução, consulte (guia em francês): elliptips.info/guide-debian-7-envoi-de-mails-ligne-de-commande
— ɾuɾ
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.