Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Remazela

Enviar E-mail com PHP

Recommended Posts

Caros amigos.

 

Saudações amante de informática. 

 

Apenas uma dúvida:

- para testar envio de e-mail com PHP eu preciso hospedar o sistema ou tem como testar sem estar hospedado ?

 

Se não precisar qual o procedimento devo usar ?

 

Grato, 

 

Renato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você diz enviando através de um servidor local (seu computador)?

 

Sim tem como, você deve usar um SMTP para isso, e configurar o servidor local para tal ação.

 

Veja essa classe a própria descrição dele mostra como fazer, além que é uma classe para envios usando PHPMailer

Spoiler

<?php

/**
 * ****************************************************
 * @Copyright (c) 2016, Spell Master.
 * @Version 3.0
 * ****************************************************
 * @Class Envio de e-mail
 * ****************************************************
 * @requires
 * * PHPMailer 5.2
 * * Contants de definição
 * ****************************************************
 * * @const MAILSLL  : Tipo de acesso tls/ssl ao SMTP
 * * @const MAILHOST : Endereço do SMTP
 * * @const MAILPORT : Porta de Acesso
 * * @const MAILUSER : endereço do e-mail que envia
 * * @const MAILPASS : Senha do e-mail que envia
 * * @const NAME     : Nome de quem envia
 * ****************************************************
 * @tutorial localhost
 * - Abra o arquivo httpd.conf do apache
 * Habilite o ssl_module
 * - Abra o arquivo php.ini
 * Ative as extensões:
 * php_curl
 * php_openssl
 * php_sockets
 * php_smtp(caso tenha)
 * - NOTA -
 * Caso o SMTP do e-mail que envia tenha segurança de
 * criptografia de dados como é o caso do GMAIL:
 * Acessar: https://myaccount.google.com/security
 * Procure por: "Acesso a aplicativos menos seguros"
 * e libere a autorização.
 * - NOTA 2 -
 * Em localhost no windows alguns softwares anti-virus
 * podem bloquear o acesso SMTP, uma vez que a máquina
 * estará a enviar dados para um local onde o mesmo
 * não pode monitorar.
 * ****************************************************
 */
class Mail {

    private $mailer;
    private $address;
    private $template;
    private $title;
    private $content;
    private $find;
    private $replaces;
    private $sendError;
    private $sendAcept;

    /**
     * ************************************************
     * @Method: Construtor, altera o comportamento da
     * class PHPMailer
     * ************************************************
     */
    function __construct() {
        $this->mailer = new PHPMailer;
        $this->mailer->IsSMTP();
        $this->mailer->IsHTML(true);
        $this->mailer->SMTPAuth = true;
        $this->mailer->SMTPSecure = MAILSLL;
        $this->mailer->Host = MAILHOST;
        $this->mailer->Port = (int) MAILPORT;
        $this->mailer->Username = MAILUSER;
        $this->mailer->Password = MAILPASS;
        $this->mailer->FromName = NAME;
    }

    /**
     * ************************************************
     * @Method: Recebe os dados
     * @Param ($Address) : Para quem o e-mail vai ser
     * enviado.
     * @Param ($title) : Título do e-mail
     * @Param ($html) : Arquivo que contém o html do
     * e-mail
     * @Param ($values) : Array com as informações que
     * serão enviadas.
     * ************************************************
     */
    public function sendMail($Address, $title, $html, $values = []) {
        $this->address = (string) $Address;
        $this->title = (string) $title;
        $this->template = (string) $html;
        $this->templateDir();
        $this->find = [];
        $this->replaces = [];
        foreach ($values as $key => $value) {
            $this->find[] = '{' . $key . '}';
            $this->replaces[] = $value;
        }
        $this->objectValues();
    }

    /**
     * ************************************************
     * @Method: Quando não consegue enviar informa o
     * erro que ocorreu.
     * ************************************************
     */
    public function mailError() {
        return $this->sendError;
    }

    /**
     * ************************************************
     * @Method: Informa o e-mail foi enviado.
     * @return (bool)
     * ************************************************
     */
    public function sendStatus() {
        if ($this->sendAcept) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * ************************************************
     * @Method: Checa se o arquivo de template do html
     * existe.
     * @access private
     * ************************************************
     */
    private function templateDir() {
        if (!file_exists($this->template)) {
            die('Erro ao solicitar dados para envio de e-mail');
        }
    }

    /**
     * ************************************************
     * @Method: Cria os objetos de envio
     * @access private
     * ************************************************
     */
    private function objectValues() {
        ob_start();
        include($this->template);
        $content = ob_get_clean();
        if (!empty($this->find) && !empty($this->replaces)) {
            $this->content = str_replace($this->find, $this->replaces, $content);
        }
        if ($this->sendValues()) {
            return true;
        }
    }

    /**
     * ************************************************
     * @Method: Envia os dados
     * @access private
     * @return Exeption (true/false)
     * ************************************************
     */
    private function sendValues() {
        $this->mailer->AddAddress($this->address);
        $this->mailer->Subject = $this->title;
        $this->mailer->Body = $this->content;
        try {
            $this->mailer->Send();
            $this->sendAcept = true;
        } catch (Exception $e) {
            $this->sendError = "Erro ao enviar e-mail linha: {$e->getCode()}<br/>Arquivo: {$e->getFile()}<br/>Detalhes: {$e->getMessage()}";
            $this->sendAcept = false;
        }
    }

}

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
5 horas atrás, Omar~ disse:

Você diz enviando através de um servidor local (seu computador)?

 

Sim tem como, você deve usar um SMTP para isso, e configurar o servidor local para tal ação.

 

Veja essa classe a própria descrição dele mostra como fazer, além que é uma classe para envios usando PHPMailer

  Ocultar conteúdo


<?php

/**
 * ****************************************************
 * @Copyright (c) 2016, Spell Master.
 * @Version 3.0
 * ****************************************************
 * @Class Envio de e-mail
 * ****************************************************
 * @requires
 * * PHPMailer 5.2
 * * Contants de definição
 * ****************************************************
 * * @const MAILSLL  : Tipo de acesso tls/ssl ao SMTP
 * * @const MAILHOST : Endereço do SMTP
 * * @const MAILPORT : Porta de Acesso
 * * @const MAILUSER : endereço do e-mail que envia
 * * @const MAILPASS : Senha do e-mail que envia
 * * @const NAME     : Nome de quem envia
 * ****************************************************
 * @tutorial localhost
 * - Abra o arquivo httpd.conf do apache
 * Habilite o ssl_module
 * - Abra o arquivo php.ini
 * Ative as extensões:
 * php_curl
 * php_openssl
 * php_sockets
 * php_smtp(caso tenha)
 * - NOTA -
 * Caso o SMTP do e-mail que envia tenha segurança de
 * criptografia de dados como é o caso do GMAIL:
 * Acessar: https://myaccount.google.com/security
 * Procure por: "Acesso a aplicativos menos seguros"
 * e libere a autorização.
 * - NOTA 2 -
 * Em localhost no windows alguns softwares anti-virus
 * podem bloquear o acesso SMTP, uma vez que a máquina
 * estará a enviar dados para um local onde o mesmo
 * não pode monitorar.
 * ****************************************************
 */
class Mail {

    private $mailer;
    private $address;
    private $template;
    private $title;
    private $content;
    private $find;
    private $replaces;
    private $sendError;
    private $sendAcept;

    /**
     * ************************************************
     * @Method: Construtor, altera o comportamento da
     * class PHPMailer
     * ************************************************
     */
    function __construct() {
        $this->mailer = new PHPMailer;
        $this->mailer->IsSMTP();
        $this->mailer->IsHTML(true);
        $this->mailer->SMTPAuth = true;
        $this->mailer->SMTPSecure = MAILSLL;
        $this->mailer->Host = MAILHOST;
        $this->mailer->Port = (int) MAILPORT;
        $this->mailer->Username = MAILUSER;
        $this->mailer->Password = MAILPASS;
        $this->mailer->FromName = NAME;
    }

    /**
     * ************************************************
     * @Method: Recebe os dados
     * @Param ($Address) : Para quem o e-mail vai ser
     * enviado.
     * @Param ($title) : Título do e-mail
     * @Param ($html) : Arquivo que contém o html do
     * e-mail
     * @Param ($values) : Array com as informações que
     * serão enviadas.
     * ************************************************
     */
    public function sendMail($Address, $title, $html, $values = []) {
        $this->address = (string) $Address;
        $this->title = (string) $title;
        $this->template = (string) $html;
        $this->templateDir();
        $this->find = [];
        $this->replaces = [];
        foreach ($values as $key => $value) {
            $this->find[] = '{' . $key . '}';
            $this->replaces[] = $value;
        }
        $this->objectValues();
    }

    /**
     * ************************************************
     * @Method: Quando não consegue enviar informa o
     * erro que ocorreu.
     * ************************************************
     */
    public function mailError() {
        return $this->sendError;
    }

    /**
     * ************************************************
     * @Method: Informa o e-mail foi enviado.
     * @return (bool)
     * ************************************************
     */
    public function sendStatus() {
        if ($this->sendAcept) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * ************************************************
     * @Method: Checa se o arquivo de template do html
     * existe.
     * @access private
     * ************************************************
     */
    private function templateDir() {
        if (!file_exists($this->template)) {
            die('Erro ao solicitar dados para envio de e-mail');
        }
    }

    /**
     * ************************************************
     * @Method: Cria os objetos de envio
     * @access private
     * ************************************************
     */
    private function objectValues() {
        ob_start();
        include($this->template);
        $content = ob_get_clean();
        if (!empty($this->find) && !empty($this->replaces)) {
            $this->content = str_replace($this->find, $this->replaces, $content);
        }
        if ($this->sendValues()) {
            return true;
        }
    }

    /**
     * ************************************************
     * @Method: Envia os dados
     * @access private
     * @return Exeption (true/false)
     * ************************************************
     */
    private function sendValues() {
        $this->mailer->AddAddress($this->address);
        $this->mailer->Subject = $this->title;
        $this->mailer->Body = $this->content;
        try {
            $this->mailer->Send();
            $this->sendAcept = true;
        } catch (Exception $e) {
            $this->sendError = "Erro ao enviar e-mail linha: {$e->getCode()}<br/>Arquivo: {$e->getFile()}<br/>Detalhes: {$e->getMessage()}";
            $this->sendAcept = false;
        }
    }

}

 

 

 

 

Amigo Omar

 

Grato por sua resposta.

 

Apenas mais uma dúvida surgida: 

- caso depois hospeda o Sistema em um Provedor, a classe mencionada pelo amigo irá funcionar no Provedor ?

- ou terei que utilizar outra forma, já que a Classe SMTP é apenas local (computador local) ?

 

Grato,

 

Renato

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Remazela, vai funcionar normalmente.

 

Servidor web é o seu servidor local ou de produção, que serve para acomodar e entregar o que é processado pelo PHP.

O servidor de e-mail é uma aplicação externa (fora da sua aplicação) responsável por receber/enviar os e-mails.

 

Quando você utiliza o PHPMailer com SMTP, você estará apenas utilizando um serviço/servidor alheio à sua aplicação, e isso significa que ele deverá funcionar em qualquer lugar. A diferença é que ao adotar esse caminho, você precisará configurar algumas coisas a mais, como login/senha e host do SMTP, coisas que você "não se preocupa" utilizando a função mail().

 

Veja a versão mais recente do PHPMailer e exemplos de uso: https://github.com/PHPMailer/PHPMailer

Compartilhar este post


Link para o post
Compartilhar em outros sites

É a mesma coisa, você só estará mudando de servidor.

Só que tem um porém no caso do G-Mail a google é rigorosa quando se trata de segurança da conta de seus usuários. Uma vez que vai usar a própria conta de e-mail para enviar.

Possivelmente vai bloquear o envio quando local, terá que acessar o gmail e confirmar que você mesmo quem está fazendo o processo.

E quando hospedado novamente será bloqueado, agora a google vai lhe alertar que a hospedagem de sua aplicação está tentando invadir sua conta, então novamente confirmar que é você mesmo quem fez tal ação. O mesmo torna a acontecer se mudar de hospedagem.

(Um porre mesmo, mas concordo plenamente com esse procedimento da google)

 

Em todo caso fiz um rabisco aqui (Sem testar, mas acho que irá funcionar)

Spoiler

<?php
defined('MAILSLL') || define('MAILSLL', 'tls');
defined('MAILHOST') || define('MAILHOST', 'smtp.gmail.com');
defined('MAILPORT') || define('MAILPORT', 587);
defined('MAILUSER') || define('MAILUSER', 'seu_gmail@gmail.com');
defined('MAILPASS') || define('MAILPASS', 'sua_senha_do_gmail');
defined('NAME') || define('NAME', 'qualquer nome');

include ('PHPMailer.php');
include ('smtp.php');
include ('Mail.php'); // Arquivo da classe Mail

$mail = new Mail();

// sendMail - 4 parâmetros
$mail->sendMail(
    "enviar_para@qualquer.com", // Quem vai receber o e-mail
    "Tittle", // Título (Não sei porque, mas buga se tiver acentos ou caracteres expeciais)
    __DIR__ . '/template.html', // Nesse caso no mesmo diretório desse arquivo deve existir um arquivo template.html
    [
      'envio_a' => "Estou enviando dados",
      'envio_b' => "Estou enviando mais dentro do array"
    ];
);

 

 

E o arquivo Html (estilize-o conforme as necessidades/vontade)

Spoiler

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Teste</title>
    </head>
    <body>
        <div style="padding:40px">
            <div style="font-size:30px; text-align:center;">{envio_a}</div>
        </div>
        <div style="padding:40px">
            <div style="font-size:30px; text-align:center;">{envio_b}</div>
        </div>
    </body>
</html>

 

 

Classe Mail e PHPMailer https://mega.nz/#!aIlCWCzA!--g0o8bGV_mQiYTRoGoBBPmJDv_UXpBLYgEpvpnH698

Obs.: Não é a versão mais recente porque de uns tempos para cá o PHPMailer se tornou uma porcaria.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera, tudo bem?
       
      Tenho o seguinte codigo:
       
       class Data {
      public static function ExibirTempoDecorrido($date)
      {
          if(empty($date))
          {
              return "Informe a data";
          }
          $periodos = array("segundo", "minuto", "hora", "dia", "semana", "mês", "ano", "década");
          $duracao = array("60","60","24","7","4.35","12","10");
          $agora = time();
          $unix_data = strtotime($date);
          // check validity of date
          if(empty($unix_data))
          {  
              return "Bad date";
          }
          // is it future date or past date
          if($agora > $unix_data) 
          {  
              $diferenca     = $agora - $unix_data;
              $tempo         = "atrás";
          } 
          else 
          {
              $diferenca     = $unix_data - $agora;
              $tempo         = "agora";
          }
          for($j = 0; $diferenca >= $duracao[$j] && $j < count($duracao)-1; $j++) 
          {
              $diferenca /= $duracao[$j];
          }
          $diferenca = round($diferenca);
          if($diferenca != 1) 
          {
              $periodos[$j].= "s";
          }
          return "$diferenca $periodos[$j] {$tempo}";
      }
      }
       
      Funciona redondinho se o valor retornado for de algumas horas, mas...
      Quando passa de dois meses, ele retorna a palavra mess. Deve ser por conta dessa linha
      if($diferenca != 1) 
          {
              $periodos[$j].= "s";
          }
       
      Quero que modre:
       
      2 meses atrás
      e não
      2 mess atrás.
       
      Espero que tenham entendido.
       
      Valeu
    • Por Carlos Web Soluções Web
      Olá...
      Estou tentando fazer o seguinte !!
      Listando dados em tabela !!
      Gostaria que....se na listagem houver 4 linhas...indepedente de seu número de ID, faça a listagem em ID ser em ordem 1 2 3 4 !!
      Exemplo...se tiver uma listagem de dados que está em ID 1 3 3...faça ficar 1 2 3 !!

       
      echo "<table class='tabela_dados' border='1'> <tr> <td>ID</td> <td>Nome Empresa</td> <td>Responsável</td> <td>Telefone 1</td> <td>Telefone 2</td> <td>E-mail 1</td> <td>E-mail 2</td> <td>Endereço</td> <td>CEP</td> <td>Bairro</td> <td>AÇÃO 1</td> <td>AÇÃO 2</td> </tr> "; $sql = "SELECT ID FROM usuarios_dados WHERE Usuario='$usuario'"; $result = $conn->query($sql); $num_rows = $result->num_rows; $Novo_ID = 1; for ($i = 0; $i < $num_rows; $i++) { $registro = $result -> fetch_row(); $sql2 = "UPDATE usuarios_dados SET ID='$Novo_ID' WHERE ID='$Novo_ID'"; $result2 = $conn->query($sql2); $Novo_ID++; } $sql = "SELECT * FROM usuarios_dados"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { echo "<tr> <td>$row[ID]</td> <td>$row[Nome_Empresa]</td> <td>$row[Responsavel]</td> <td>$row[Telefone_1]</td> <td>$row[Telefone_2]</td> <td>$row[Email_1]</td> <td>$row[Email_2]</td> <td>$row[Endereço]</td> <td>$row[CEP]</td> <td>$row[Bairro]</td> <td> <form method='post' action='Editar_Dados.php'> <input type='hidden' name='usuario' value='$usuario'> <input type='hidden' name='senha' value='$senha'> <input type='hidden' name='ID' value='$row[ID]'> <input type='submit' style='padding: 10px;' value='EDITAR'> </form> </td> <td> <form method='post' action='Deletar_Dados.php'> <input type='hidden' name='usuario' value='$usuario'> <input type='hidden' name='senha' value='$senha'> <input type='hidden' name='ID' value='$row[ID]'> <input type='submit' style='padding: 10px;' value='DELETAR'> </form> </td> </tr> "; } } else { echo "0 results"; } $conn->close();  
    • Por ILR master
      Boa tarde pessoal, tudo bem ?
       
      Eu uso o tinymce para cadastro de textos no meu siite, porém, quero fazer um sistema para que os colunistas possam fazer o próprio post.
      O problema do tinymce, é que ele mantém a formatação do texto copiado, como tamanho de fonts, negritos, etc... Quero que o usuário cole o texto e a própria textarea limpe a formatação para que ele formate como quiser.
       
      A pergunta é:
       
      O tinymce tem uma opção para desabilitar a formatação quando um texto é colocado?
      Tem alguma função via java ou php para retirar a formatação assim que o texto é colado?
      Ou é melhor usar um outro editor?
       
      Agradeço deste já.
    • Por Giovanird
      Olá a todos!
      Tenho uma pagina que possui uma DIV onde coloquei uma pagina PHP.
      Uso a função setInterval para atualizar a pagina inclusa dentro da DIV.
      O problema é que ao acessar o site , a DIV só me mostra a pagina inclusa somente quando completo o primeiro minuto.
      Preciso que a pagina inclusa já inicie carregada
       
      Meu código JavaScript e a DIV com a pagina PHP
       
      <script> function atualiza(){ var url = 'direita.php'; $.get(url, function(dataReturn) { $('#direita').html(dataReturn); }); } setInterval("atualiza()",60000); </script> <div> <span id="direita"></span> </div>  
    • Por ILR master
      Fala pessoal.
       
      Seguinte:
       
      Quero selecionar duas tabelas e mostrar com resultados intercalados. Abaixo segue um código explicando para vcs terem uma ideia.
       
      $consulta = "SELECT A.*, B.* FROM tabela1 A, tabela2 B'";
      $resultado = mysqli_query($conexao, $consulta) or die ("erro");
      while($busca = mysqli_fetch_array($resultado)){
       
      print $busca['cod_evento']; --> traz o código da tabela1 
      print $busca['titulo_evento']; -->  traz o titulo da tabela1
      print $busca['cod_noticia']; --> traz o código da tabela2
      print $busca['titulo_noticia']; --> traz o tituloda tabela2
       
      }
       
      Espero que entendam. Grato
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.