Array
(
)

Encaminhamento automático de e-mails com PHP

PHP
Moisés
   - 10 jul 2016

Boa tarde.
Pessoal, hoje me deparei coma necessidade de um grupo de e-mail e encaminhar todas a mensagens que chegassem para uma determinada conta, porém minha os hospedagam não oferece este tipo de serviço.
Diante de deste problemas gastaria saber se á possível criar algum script em PHP para isso? Pois preciso apenas que verifique de tempo em tempo se há novas mensagens na caixa postal e faça faça o encaminhamento automaticamente para um grupo x de e-mail.

Raylan
|
MVP
Pontos: 710
    10 jul 2016

Comecei a trabalhar num código uns meses atras. Não terminei, mas você pode tentar concluir. O primeiro arquivo é uma classe pra ler a caixa de entrada. O segundo é um exemplo de uso.
O processo pra você seria ler a caixa de entrada e encaminhar cada e-mail pra conta que quiser. Verifique se sua hospedagem fornece tarefas agendadas (Cron Job) pra automatizar a execução.

// receivemail.class.php

#Código
<?php
error_reporting(0);

class receiveMail
{
var $server='''';
var $username='''';
var $password='''';
var $marubox='''';
var $email='''';
function receiveMail($username,$password,$EmailAddress,$mailserver=''localhost'',$servertype=''pop'',$port=''110'',$ssl = false, $marcar_como_lida = false) //Constructure
{
if($marcar_como_lida){
$so_ler = "";
} else {
$so_ler = "/readonly";
}
if($servertype==''imap'')
{
if($port=='''') {
$port=''143'';
}
$strConnect=''{''.$mailserver.'':''.$port. ''/novalidate-cert/imap''.$so_ler.($ssl ? "/ssl" : "").''}INBOX'';
}
else
{
$strConnect=''{''.$mailserver.'':''.$port. ''/novalidate-cert/pop3''.$so_ler.($ssl ? "/ssl" : "").''}INBOX'';
}
$this->server = $strConnect;
$this->username = $username;
$this->password = $password;
$this->email = $EmailAddress;
}
function connect() //Connect To the Mail Box
{
$this->marubox = imap_open($this->server,$this->username,$this->password);

if(!$this->marubox)
{
echo "Error: Problemas ao se conectar no servidor";
exit;
} else {
/*
$check = imap_mailboxmsginfo($this->marubox);
if ($check) {
echo "Date: " . $check->Date . "<br />\n" ;
echo "Driver: " . $check->Driver . "<br />\n" ;
echo "Mailbox: " . $check->Mailbox . "<br />\n" ;
echo "Messages: " . $check->Nmsgs . "<br />\n" ;
echo "Recent: " . $check->Recent . "<br />\n" ;
echo "Unread: " . $check->Unread . "<br />\n" ;
echo "Deleted: " . $check->Deleted . "<br />\n" ;
echo "Size: " . $check->Size . "<br />\n" ;
} else {
echo "imap_mailboxmsginfo() failed: " . imap_last_error() . "<br />\n";
}
*/
}
}
function getHeaders($mid) // Capturar os cabeçalhos da mensagem
{
if(!$this->marubox)
return false;
$mail_header=imap_header($this->marubox,$mid);
$sender=$mail_header->from[0];
$sender_replyto=$mail_header->reply_to[0];
if(strtolower($sender->mailbox)!=''mailer-daemon'' && strtolower($sender->mailbox)!=''postmaster'')
{
$mail_details=array(
''from''=>strtolower($sender->mailbox).''@''.$sender->host,
''fromName''=>$sender->personal,
''toOth''=>strtolower($sender_replyto->mailbox).''@''.$sender_replyto->host,
''toNameOth''=>$sender_replyto->personal,
''subject''=>$mail_header->subject,
''to''=>strtolower($mail_header->toaddress),
''date''=>strtolower($mail_header->date)
);
}
return $mail_details;
}
function get_mime_type(&$structure) //Capturando o mime type dos arquivos
{
$primary_mime_type = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER");

if($structure->subtype) {
return $primary_mime_type[(int) $structure->type] . ''/'' . $structure->subtype;
}
return "TEXT/PLAIN";
}

function get_part($stream, $msg_number, $mime_type, $structure = false, $part_number = false) //Capturando as partes internas das mensagens
{
if(!$structure) {
$structure = imap_fetchstructure($stream, $msg_number);
}
if($structure) {
if($mime_type == $this->get_mime_type($structure))
{
if(!$part_number)
{
$part_number = "1";
}
$text = imap_fetchbody($stream, $msg_number, $part_number);
if($structure->encoding == 3)
{
return imap_base64($text);
}
else if($structure->encoding == 4)
{
return imap_qprint($text);
}
else
{
return $text;
}
}
if($structure->type == 1) /* multipart */
{
while(list($index, $sub_structure) = each($structure->parts))
{
$prefix = "";
if($part_number)
{
$prefix = $part_number . ''.'';

}
$data = $this->get_part($stream, $msg_number, $mime_type, $sub_structure, $prefix . ($index + 1));
if($data)
{
return $data;
}
}
}
}
return false;
}
function getTotalMails() //Obtendo o total de emails da caixa de entrada
{
if(!$this->marubox)
return false;
$headers=imap_headers($this->marubox);
return count($headers);
}
function GetAttach($mid,$path) // Obtendo os arquivos anexos.
{
if(!$this->marubox)
return false;
$struckture = imap_fetchstructure($this->marubox,$mid);
$ar="";
if($struckture->parts)
{
foreach($struckture->parts as $key => $value)
{
$enc=$struckture->parts[$key]->encoding;
if($struckture->parts[$key]->ifdparameters)
{
$name=$struckture->parts[$key]->dparameters[0]->value;
$message = imap_fetchbody($this->marubox,$mid,$key+1);
if ($enc == 0)
$message = imap_8bit($message);
if ($enc == 1)
$message = imap_8bit ($message);
if ($enc == 2)
$message = imap_binary ($message);
if ($enc == 3)
$message = imap_base64 ($message);
if ($enc == 4)
$message = quoted_printable_decode($message);
if ($enc == 5)
$message = $message;
$fp=fopen($path.$name,"w");
fwrite($fp,$message);
fclose($fp);
$ar=$ar.$name.",";
}
if($struckture->parts[$key]->parts)
{
foreach($struckture->parts[$key]->parts as $keyb => $valueb)
{
$enc=$struckture->parts[$key]->parts[$keyb]->encoding;
if($struckture->parts[$key]->parts[$keyb]->ifdparameters)
{
$name=$struckture->parts[$key]->parts[$keyb]->dparameters[0]->value;
$partnro = ($key+1).".".($keyb+1);
$message = imap_fetchbody($this->marubox,$mid,$partnro);
if ($enc == 0)
$message = imap_8bit($message);
if ($enc == 1)
$message = imap_8bit ($message);
if ($enc == 2)
$message = imap_binary ($message);
if ($enc == 3)
$message = imap_base64 ($message);
if ($enc == 4)
$message = quoted_printable_decode($message);
if ($enc == 5)
$message = $message;
$fp=fopen($path.$name,"w");
fwrite($fp,$message);
fclose($fp);
$ar=$ar.$name.",";
}
}
}
}
}
$ar=substr($ar,0,(strlen($ar)-1));
return $ar;
}
function getBody($mid) // Capturando o corpo da mensagem
{
if(!$this->marubox)
return false;
$body = $this->get_part($this->marubox, $mid, "TEXT/HTML");
if ($body == "")
$body = $this->get_part($this->marubox, $mid, "TEXT/PLAIN");
if ($body == "") {
return "";
}
return $body;
}
function deleteMails($mid) // Deletando um email
{
if(!$this->marubox)
return false;

imap_delete($this->marubox,$mid);
}
function close_mailbox() //Fechando a conexão com o servidor
{
if(!$this->marubox)
return false;

imap_close($this->marubox, CL_EXPUNGE);
}
}
?>


// exibe_emails.php

#Código
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
<body>
<?php
include_once("receivemail.class.php");
//criando o objeto com os parametros solicitados pelo método da classe receiveMail
$obj = new receiveMail('''','''','''','''',''imap'','''', true, false);
//fazendo a conexão
$obj->connect();
//recuperando com um laço as mensagens e seus anexos.
$headers = imap_headers($obj->marubox);
$naolidos = 0;
for($i=sizeof($headers); $i>0; $i--){
$flags = substr($headers[$i-1], 0, 4);
$isunr = true;//(strpos($flags, "U") != false);
if ($isunr){
$naolidos++;
echo "<div style=''background-color:#E6E6E6;margin:50px;padding:50px;''>";
$head=$obj->getHeaders($i);
$elements = imap_mime_header_decode($head[''subject'']);
$assunto = "";
$caracteres = strtolower(imap_utf8($elements[0]->charset));
foreach($elements as $ele){
if(($caracteres != ''default'') and (($caracteres != ''utf-8'')) and ($caracteres != ''windows-1252''))
$assunto .= utf8_encode(imap_utf8($ele->text)) . " ";
else
$assunto .= (imap_utf8($ele->text)) . " ";
}
echo "<b>Assunto :: </b>" . $assunto;
echo "<br>";
echo "<b>Destinos ::</b> ".$head[''to'']."<br>";
echo "<b>Origem ::</b> ".$head[''from'']."<br>";
echo "<b>Data ::</b> ".$head[''date'']."<br>";
echo "<b>Caracteres ::</b> ".$elements[0]->charset."<br>";
echo "<b>Mensagem ::</b><br>";
//obtendo o corpo de cada mnensagem
echo "<blockquote>";
if(($caracteres != ''default'') and (($caracteres != ''utf-8'')) and ($caracteres != ''windows-1252'')){
echo utf8_encode(imap_utf8($obj->getBody($i)));
}
else{
echo (imap_utf8($obj->getBody($i)));
}
echo "</blockquote>";
echo "<b>Anexos ::</b><br>" ;
//recuperando o anexo de cada mensagem e salvando na pasta anexos ou outro diretório qualquer.
$str=$obj->GetAttach($i,"anexos/");
// verificando o array de anexos da mensagem no laço e listando cada um.
$ar=explode(",",$str);
foreach($ar as $key=>$value){
echo ($value=="")?"":"Arquivo :: ".$value."<br>";
}
echo "<br><hr>";
echo "</div>";
}
}
if($naolidos == 0){
echo "Sem emails novos.";
}
//fechando a conexão
$obj->close_mailbox();
?>
</body>
</html>


O código pra enviar e-mail você pega com a sua hospedagem.

Moisés
   - 10 jul 2016


Citação:
Comecei a trabalhar num código uns meses atras. Não terminei, mas você pode tentar concluir. O primeiro arquivo é uma classe pra ler a caixa de entrada. O segundo é um exemplo de uso.
O processo pra você seria ler a caixa de entrada e encaminhar cada e-mail pra conta que quiser. Verifique se sua hospedagem fornece tarefas agendadas (Cron Job) pra automatizar a execução.

// receivemail.class.php

#Código
<?php
error_reporting(0);

class receiveMail
{
var $server='''';
var $username='''';
var $password='''';
var $marubox='''';
var $email='''';
function receiveMail($username,$password,$EmailAddress,$mailserver=''localhost'',$servertype=''pop'',$port=''110'',$ssl = false, $marcar_como_lida = false) //Constructure
{
if($marcar_como_lida){
$so_ler = "";
} else {
$so_ler = "/readonly";
}
if($servertype==''imap'')
{
if($port=='''') {
$port=''143'';
}
$strConnect=''{''.$mailserver.'':''.$port. ''/novalidate-cert/imap''.$so_ler.($ssl ? "/ssl" : "").''}INBOX'';
}
else
{
$strConnect=''{''.$mailserver.'':''.$port. ''/novalidate-cert/pop3''.$so_ler.($ssl ? "/ssl" : "").''}INBOX'';
}
$this->server = $strConnect;
$this->username = $username;
$this->password = $password;
$this->email = $EmailAddress;
}
function connect() //Connect To the Mail Box
{
$this->marubox = imap_open($this->server,$this->username,$this->password);

if(!$this->marubox)
{
echo "Error: Problemas ao se conectar no servidor";
exit;
} else {
/*
$check = imap_mailboxmsginfo($this->marubox);
if ($check) {
echo "Date: " . $check->Date . "<br />\n" ;
echo "Driver: " . $check->Driver . "<br />\n" ;
echo "Mailbox: " . $check->Mailbox . "<br />\n" ;
echo "Messages: " . $check->Nmsgs . "<br />\n" ;
echo "Recent: " . $check->Recent . "<br />\n" ;
echo "Unread: " . $check->Unread . "<br />\n" ;
echo "Deleted: " . $check->Deleted . "<br />\n" ;
echo "Size: " . $check->Size . "<br />\n" ;
} else {
echo "imap_mailboxmsginfo() failed: " . imap_last_error() . "<br />\n";
}
*/
}
}
function getHeaders($mid) // Capturar os cabeçalhos da mensagem
{
if(!$this->marubox)
return false;
$mail_header=imap_header($this->marubox,$mid);
$sender=$mail_header->from[0];
$sender_replyto=$mail_header->reply_to[0];
if(strtolower($sender->mailbox)!=''mailer-daemon'' && strtolower($sender->mailbox)!=''postmaster'')
{
$mail_details=array(
''from''=>strtolower($sender->mailbox).''@''.$sender->host,
''fromName''=>$sender->personal,
''toOth''=>strtolower($sender_replyto->mailbox).''@''.$sender_replyto->host,
''toNameOth''=>$sender_replyto->personal,
''subject''=>$mail_header->subject,
''to''=>strtolower($mail_header->toaddress),
''date''=>strtolower($mail_header->date)
);
}
return $mail_details;
}
function get_mime_type(&$structure) //Capturando o mime type dos arquivos
{
$primary_mime_type = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER");

if($structure->subtype) {
return $primary_mime_type[(int) $structure->type] . ''/'' . $structure->subtype;
}
return "TEXT/PLAIN";
}

function get_part($stream, $msg_number, $mime_type, $structure = false, $part_number = false) //Capturando as partes internas das mensagens
{
if(!$structure) {
$structure = imap_fetchstructure($stream, $msg_number);
}
if($structure) {
if($mime_type == $this->get_mime_type($structure))
{
if(!$part_number)
{
$part_number = "1";
}
$text = imap_fetchbody($stream, $msg_number, $part_number);
if($structure->encoding == 3)
{
return imap_base64($text);
}
else if($structure->encoding == 4)
{
return imap_qprint($text);
}
else
{
return $text;
}
}
if($structure->type == 1) /* multipart */
{
while(list($index, $sub_structure) = each($structure->parts))
{
$prefix = "";
if($part_number)
{
$prefix = $part_number . ''.'';

}
$data = $this->get_part($stream, $msg_number, $mime_type, $sub_structure, $prefix . ($index + 1));
if($data)
{
return $data;
}
}
}
}
return false;
}
function getTotalMails() //Obtendo o total de emails da caixa de entrada
{
if(!$this->marubox)
return false;
$headers=imap_headers($this->marubox);
return count($headers);
}
function GetAttach($mid,$path) // Obtendo os arquivos anexos.
{
if(!$this->marubox)
return false;
$struckture = imap_fetchstructure($this->marubox,$mid);
$ar="";
if($struckture->parts)
{
foreach($struckture->parts as $key => $value)
{
$enc=$struckture->parts[$key]->encoding;
if($struckture->parts[$key]->ifdparameters)
{
$name=$struckture->parts[$key]->dparameters[0]->value;
$message = imap_fetchbody($this->marubox,$mid,$key+1);
if ($enc == 0)
$message = imap_8bit($message);
if ($enc == 1)
$message = imap_8bit ($message);
if ($enc == 2)
$message = imap_binary ($message);
if ($enc == 3)
$message = imap_base64 ($message);
if ($enc == 4)
$message = quoted_printable_decode($message);
if ($enc == 5)
$message = $message;
$fp=fopen($path.$name,"w");
fwrite($fp,$message);
fclose($fp);
$ar=$ar.$name.",";
}
if($struckture->parts[$key]->parts)
{
foreach($struckture->parts[$key]->parts as $keyb => $valueb)
{
$enc=$struckture->parts[$key]->parts[$keyb]->encoding;
if($struckture->parts[$key]->parts[$keyb]->ifdparameters)
{
$name=$struckture->parts[$key]->parts[$keyb]->dparameters[0]->value;
$partnro = ($key+1).".".($keyb+1);
$message = imap_fetchbody($this->marubox,$mid,$partnro);
if ($enc == 0)
$message = imap_8bit($message);
if ($enc == 1)
$message = imap_8bit ($message);
if ($enc == 2)
$message = imap_binary ($message);
if ($enc == 3)
$message = imap_base64 ($message);
if ($enc == 4)
$message = quoted_printable_decode($message);
if ($enc == 5)
$message = $message;
$fp=fopen($path.$name,"w");
fwrite($fp,$message);
fclose($fp);
$ar=$ar.$name.",";
}
}
}
}
}
$ar=substr($ar,0,(strlen($ar)-1));
return $ar;
}
function getBody($mid) // Capturando o corpo da mensagem
{
if(!$this->marubox)
return false;
$body = $this->get_part($this->marubox, $mid, "TEXT/HTML");
if ($body == "")
$body = $this->get_part($this->marubox, $mid, "TEXT/PLAIN");
if ($body == "") {
return "";
}
return $body;
}
function deleteMails($mid) // Deletando um email
{
if(!$this->marubox)
return false;

imap_delete($this->marubox,$mid);
}
function close_mailbox() //Fechando a conexão com o servidor
{
if(!$this->marubox)
return false;

imap_close($this->marubox, CL_EXPUNGE);
}
}
?>


// exibe_emails.php

#Código
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
<body>
<?php
include_once("receivemail.class.php");
//criando o objeto com os parametros solicitados pelo método da classe receiveMail
$obj = new receiveMail('''','''','''','''',''imap'','''', true, false);
//fazendo a conexão
$obj->connect();
//recuperando com um laço as mensagens e seus anexos.
$headers = imap_headers($obj->marubox);
$naolidos = 0;
for($i=sizeof($headers); $i>0; $i--){
$flags = substr($headers[$i-1], 0, 4);
$isunr = true;//(strpos($flags, "U") != false);
if ($isunr){
$naolidos++;
echo "<div style=''background-color:#E6E6E6;margin:50px;padding:50px;''>";
$head=$obj->getHeaders($i);
$elements = imap_mime_header_decode($head[''subject'']);
$assunto = "";
$caracteres = strtolower(imap_utf8($elements[0]->charset));
foreach($elements as $ele){
if(($caracteres != ''default'') and (($caracteres != ''utf-8'')) and ($caracteres != ''windows-1252''))
$assunto .= utf8_encode(imap_utf8($ele->text)) . " ";
else
$assunto .= (imap_utf8($ele->text)) . " ";
}
echo "<b>Assunto :: </b>" . $assunto;
echo "<br>";
echo "<b>Destinos ::</b> ".$head[''to'']."<br>";
echo "<b>Origem ::</b> ".$head[''from'']."<br>";
echo "<b>Data ::</b> ".$head[''date'']."<br>";
echo "<b>Caracteres ::</b> ".$elements[0]->charset."<br>";
echo "<b>Mensagem ::</b><br>";
//obtendo o corpo de cada mnensagem
echo "<blockquote>";
if(($caracteres != ''default'') and (($caracteres != ''utf-8'')) and ($caracteres != ''windows-1252'')){
echo utf8_encode(imap_utf8($obj->getBody($i)));
}
else{
echo (imap_utf8($obj->getBody($i)));
}
echo "</blockquote>";
echo "<b>Anexos ::</b><br>" ;
//recuperando o anexo de cada mensagem e salvando na pasta anexos ou outro diretório qualquer.
$str=$obj->GetAttach($i,"anexos/");
// verificando o array de anexos da mensagem no laço e listando cada um.
$ar=explode(",",$str);
foreach($ar as $key=>$value){
echo ($value=="")?"":"Arquivo :: ".$value."<br>";
}
echo "<br><hr>";
echo "</div>";
}
}
if($naolidos == 0){
echo "Sem emails novos.";
}
//fechando a conexão
$obj->close_mailbox();
?>
</body>
</html>


O código pra enviar e-mail você pega com a sua hospedagem.


Rylan, muito obrigado.

Só esqueci de dizer sou bem leigo com php, estou tentando inseri as minha configurações seu arquivo tipo: $server=''mx.dominio.com.br'', var $username=''meu_email@dominio.com.br'', var $password=''minha_senha'', var $email='meu_email@dominio.com.br'', tem uma variável que não sei o que vai nela é var $marubox ="", vc poderia me ajudar?

tentei configurar sem inserir a informação da variável $marubox mas deu erro erro de conexão com o servidor.

Raylan
|
MVP
Pontos: 710
    10 jul 2016

Se você é "bem leigo com php", essa minha solução não vai te ajudar.