Enviar um e-mail com o PHP do formulário html ao enviar com o mesmo programa

Quero enviar um e-mail com o PHP quando um utilizador tiver terminado de preencher um formulário HTML e, em seguida, enviar informações por e-mail do formulário. Eu quero fazê-lo a partir do mesmo script que exibe a página web que tem o formulário.

Encontrei este código, mas o correio não envia.

<?php 

if (isset($_POST['submit'])) {
    $to = $_POST['email']; 
    $subject = $_POST['name'];
    $message = getRequestURI();
    $from = "[email protected]";
    $headers = "From:" . $from;

    if (mail($to, $subject, $message, $headers)) {
        echo "Mail Sent.";
    }
    else {
        echo "failed";
    }
}

?>

Qual é o código para enviar um e-mail em PHP?

Author: Markus Amalthea Magnuson, 2013-08-22

8 answers

Editar (#1)

Se bem entendi, deseja ter tudo numa página e executá-lo a partir da mesma página.

Você pode usar o seguinte código para enviar e-mail de uma única página, por exemplo index.php ou contact.php

A única diferença entre esta e a minha resposta original é a <form action="" method="post"> onde a acção foi deixada em branco.

É melhor usar header('Location: thank_you.php'); em vez de echo no manipulador PHP para redireccionar o utilizador para outra página depois.

Copie o código inteiro abaixo para um ficheiro.

<?php 
if(isset($_POST['submit'])){
    $to = "[email protected]"; // this is your Email address
    $from = $_POST['email']; // this is the sender's Email address
    $first_name = $_POST['first_name'];
    $last_name = $_POST['last_name'];
    $subject = "Form submission";
    $subject2 = "Copy of your form submission";
    $message = $first_name . " " . $last_name . " wrote the following:" . "\n\n" . $_POST['message'];
    $message2 = "Here is a copy of your message " . $first_name . "\n\n" . $_POST['message'];

    $headers = "From:" . $from;
    $headers2 = "From:" . $to;
    mail($to,$subject,$message,$headers);
    mail($from,$subject2,$message2,$headers2); // sends a copy of the message to the sender
    echo "Mail Sent. Thank you " . $first_name . ", we will contact you shortly.";
    // You can also use header('Location: thank_you.php'); to redirect to another page.
    }
?>

<!DOCTYPE html>
<head>
<title>Form submission</title>
</head>
<body>

<form action="" method="post">
First Name: <input type="text" name="first_name"><br>
Last Name: <input type="text" name="last_name"><br>
Email: <input type="text" name="email"><br>
Message:<br><textarea rows="5" name="message" cols="30"></textarea><br>
<input type="submit" name="submit" value="Submit">
</form>

</body>
</html> 

Resposta Original


Não tinha a certeza de qual era a pergunta, mas tenho a impressão de que uma cópia da mensagem deve ser enviada à pessoa que preencheu o formulário.

Aqui está uma cópia testada/de trabalho de um formulário HTML e tratador de PHP. Isto usa a função PHP mail().

O manipulador de PHP também enviará uma cópia da mensagem à pessoa que preencheu o formulário. formulario.

Você pode usar duas barras dianteiras {[[9]} em frente de uma linha de código se você não vai usá-lo.

Por exemplo: // $subject2 = "Copy of your form submission"; não será executado.

FORMULÁRIO HTML:

<!DOCTYPE html>
<head>
<title>Form submission</title>
</head>
<body>

<form action="mail_handler.php" method="post">
First Name: <input type="text" name="first_name"><br>
Last Name: <input type="text" name="last_name"><br>
Email: <input type="text" name="email"><br>
Message:<br><textarea rows="5" name="message" cols="30"></textarea><br>
<input type="submit" name="submit" value="Submit">
</form>

</body>
</html>

Manipulador de PHP (mail_ handler.php)

(usa a informação do formulário HTML e envia o e-mail)

<?php 
if(isset($_POST['submit'])){
    $to = "[email protected]"; // this is your Email address
    $from = $_POST['email']; // this is the sender's Email address
    $first_name = $_POST['first_name'];
    $last_name = $_POST['last_name'];
    $subject = "Form submission";
    $subject2 = "Copy of your form submission";
    $message = $first_name . " " . $last_name . " wrote the following:" . "\n\n" . $_POST['message'];
    $message2 = "Here is a copy of your message " . $first_name . "\n\n" . $_POST['message'];

    $headers = "From:" . $from;
    $headers2 = "From:" . $to;
    mail($to,$subject,$message,$headers);
    mail($from,$subject2,$message2,$headers2); // sends a copy of the message to the sender
    echo "Mail Sent. Thank you " . $first_name . ", we will contact you shortly.";
    // You can also use header('Location: thank_you.php'); to redirect to another page.
    // You cannot use header and echo together. It's one or the other.
    }
?>

Para enviar como HTML:

Se você deseja enviar e-mail como HTML e para ambas as instâncias, então você terá que criar dois conjuntos separados de Cabeçalhos HTML com nomes de variáveis diferentes.

Leia o manual em mail() para saber como enviar e-mails como HTML:


Notas de rodapé:

  • no que diz respeito ao HTML5

Você tem que especificar o URL do serviço que irá lidar com os dados enviados, usando o atributo action.

Conforme descrito em https://www.w3.org/TR/html5/forms.html em 4. 10. 1. 3 Configurar um formulário para comunicar com um servidor . Para informações completas, consulte a página.

Portanto, action="" não funcionará no HTML5.

A sintaxe adequada seria:

  • action="handler.xxx" ou
  • action="http://www.example.com/handler.xxx".

Note que xxx será a extensão do tipo de arquivo usado para lidar com o processo. Isto pode ser ... .php, .cgi, .pl, .jsp extensão do ficheiro etc.


Consulte o seguinte Q & A na pilha se o envio do correio falha:

 114
Author: Funk Forty Niner, 2017-05-23 12:02:42

Programa de PHP para se ligar a um servidor de SMTP e enviar e-mail no Windows 7

Enviar um e-mail do PHP no Windows é um campo minado com gotchas e arranhões na cabeça. Vou tentar levá-lo através de uma instância onde eu consegui-lo para trabalhar no Windows 7 e PHP 5.2.3 abaixo (IIS) Internet Information Services webserver.

Presumo que não queira usar nenhum framework pré-construído, como o código ou o Symfony, que contenha a capacidade de enviar e-mails. Nós teremos enviado e-mail de um ficheiro PHP autônomo. Eu adquiri este código sob o CodeIgniter hood (sob system/libraries) e modifiquei-o de modo que você pode simplesmente cair neste Email.o ficheiro php deve funcionar.

Isto deve funcionar com versões mais recentes do PHP. Mas nunca se sabe.

Passo 1, você precisa de um utilizador / Senha com um servidor de SMTP:

Estou a usar o servidor smtp de smtp.ihostexchange.net que já foi criado e configurado para mim. Se não tens isto, não podes continuar. Você deve ser capaz de usar um cliente de E-mail como thunderbird, evolution, Microsoft Outlook, para especificar o seu servidor de smtp e, em seguida, ser capaz de enviar e-mails por lá.

Passo 2, Criar o seu ficheiro de E-mail Hello World:

Presumo que esteja a usar IIS. Então crie um arquivo chamado index.php Sob C:\inetpub\wwwroot e coloque este código aqui:
<?php

  include("Email.php");

  $c = new CI_Email();

  $c->from("[email protected]");
  $c->to("[email protected]");
  $c->subject("Celestial Temple");
  $c->message("Dominion reinforcements on the way.");
  $c->send();
  echo "done";
?>
Deve poder visitar este índice.php navegando para localhost / index.php em um navegador, ele vai vomitar erros porque E-mail.o php desapareceu. Mas certifique-se de que você pode, pelo menos, executá-lo a partir do navegador.

Passo 3, Criar um ficheiro chamado Email.php:

Crie um novo ficheiro chamado Email.php under C:\inetpub\wwwroot.

Copiar / colar este código PHP em E-mail.php:

Https://github.com/sentientmachine/standalone_php_script_send_email/blob/master/Email.php

Uma vez que existem muitos tipos de servidores smtp, você terá que mexer manualmente com as configurações em o topo de Email.php. Configurei-o para funcionar automaticamente com smtp.ihostexchange.net, mas o seu servidor de smtp pode ser diferente.

Por exemplo:

  1. configure a opção smtp_port para o porto do seu servidor de smtp.
  2. defina a configuração do smtp_ Crypto para o que o seu servidor de smtp precisa.
  3. defina a $newline e a $crlf para que seja compatível com o que o seu servidor de smtp usa. Se escolher mal, o servidor de smtp poderá ignorar o seu pedido sem erro. Eu uso \r\n, para ti talvez \n seja necessario.

O código associado é demasiado longo para colar como Resposta de stackoverflow, se quiser editá-lo, deixe um comentário aqui ou através do github e eu mudo-o.

Passo 4, certifique-se do seu php.o ini tem a extensão ssl activa:

Encontra o teu PHP.processo ini e descomenda o
;extension=php_openssl.dll

Então parece:

extension=php_openssl.dll

Passo 5, corre o índice.ficheiro php que acabou de criar num navegador:

Você deve obter o seguinte resultado:

220 smtp.ihostexchange.net Microsoft ESMTP MAIL Service ready at 
Wed, 16 Apr 2014 15:43:58 -0400 250 2.6.0 
<[email protected]> Queued mail for delivery 
lang:email_sent

done

Passo 6, verifique o seu e-mail e pasta de spam:

Visite a conta de E-mail para [email protected] e devias ter recebido um e-mail. Deve chegar dentro de 5 ou 10 segundos. Se você não o fizer, inspecione os erros retornados na página. Se isso não funcionar, tente esmagar seu rosto no teclado no google enquanto canta: "trabalhar na Mercearia não é tão ruim."

 4
Author: Eric Leschinski, 2014-04-16 21:38:07

Se ainda não o fez, olhe para o seu {[[0]} e certifique-se de que os parâmetros sob a configuração [mail function] estão definidos correctamente para activar o serviço de E-mail. Depois de poder utilizar a Biblioteca PHPMailer e seguir as instruções.

 3
Author: KB9, 2014-04-16 20:39:53

Também pode usar a aplicação mandrill para enviar o correio em php. Você vai obter a API de https://mandrillapp.com/api/docs/index.php.html onde você pode encontrar os detalhes completos sobre e-mails enviados e outros detalhes.

 3
Author: Hareesh S Nair, 2014-09-25 05:36:56

Tem de adicionar um action na sua forma como:

    <form name='form1' method='post' action='<?php echo($_SERVER['PHP_SELF']);'>
          <!-- All your input for the form here -->
    </form>

Depois coloque o seu excerto no topo do documento e envie o correio. O que {[[2]} faz é que ele envia as suas informações para o topo do seu script para que você possa usá-lo.

 1
Author: Tom, 2013-08-22 11:53:29

Aqui estão as configurações de correio PHP que eu uso:

//Mail sending function
$subject = $_POST['name'];
$to = $_POST['email'];
$from = "[email protected]";

//data
$msg = "Your MSG <br>\n";       

//Headers
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=UTF-8\r\n";
$headers .= "From: <".$from. ">" ;

mail($to,$subject,$msg,$headers);
echo "Mail Sent.";
 1
Author: Eric Leschinski, 2014-04-16 20:41:14

Você precisa de um servidor SMPT para

... mail($to,$subject,$message,$headers);
Para o trabalho.

Podias tentar servidores SMTP leves como o xmailer

 0
Author: Andrei CACIO, 2013-08-22 11:46:43

Acho que um erro no código original pode ter sido que ele tinha:

$message = echo getRequestURI();

Em vez de:

$message = getRequestURI();

(o código já foi editado.)

 -1
Author: Markus Amalthea Magnuson, 2015-12-09 08:50:20