Filtre pour newsletters gmail

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 025 fois - Téléchargée 16 fois

Contenu du snippet

Voici un nouveau code qui rend compatible une newsletters html à gmail. Et oui car comme tous le monde sait, ou pas :D le webmail gmail n'aime pas parmis plein de chose le css. Il veut que des balises styles, donc le code remplace les balises class par style et met tous les paramètres des cc dans la balise style.
J'espere j'explique pas trop mal.

La fonction main est filtrage qui prend en paramètre une chaine de caractère contenant la newsletters.

Source / Exemple :


<?

$coco = filtrage($string);
echo $coco;

function search_name_class($class)
{
  $long = strlen($class);
  $i = 0;
  if ($class[$i] == "\"")
    {
      $i++;
      while ($i < $long)
        {
          if ($class[$i] == "\"")
            {
              $i--;
              break;
            }
          $i++;
        }
      return(substr($class, 1, $i));
    }
  return(NULL);
}

function isclass($newsletter, $i)
{
  global $globu;     $tmp=substr($newsletter,$i,6);                                                                                                                                          
  if ($tmp == "class=" || $tmp == "CLASS=")
    {  
      $class = substr($newsletter, $i + 6);
      return (search_name_class($class));
    }
  return (0);
}

function check_end_balise($tmp, $balise)
{
  $i = 0;
  $long = strlen($tmp);
  if ($tmp[0] == '/')
    $i++;
  while ($i < $long && $tmp[$i] != '\t' && $tmp[$i] != ' ')
    $i++;
  if ($tmp[0] == '/')
    $bal = substr($tmp, 1, $i);
  else
    $bal = substr($tmp, 0, $i);
  $sav = $i;
  while ($i < $long)
    {
      if (($class = isclass($tmp, $i)))
        break;
      $i++;
    }
  if ($tmp[0] == '/')
    {
      $i = 0;
      while ($balise[$i])
        {
          $check_bal = substr($balise[$i], 0, strlen($bal));
          if ($check_bal === $bal)
            $balise[$i] = "None";
          $i++;
        }
    }
  else
    $balise[] = $bal . ' ' . $class;
  return ($balise);
}

function check_balise($newsletter, $i, $balise)
{
  $i++;
  $j = $i;
  $long = strlen($newsletter);

  while ($i < $long && $newsletter[$i] != '>')
    $i++;
  $tmp = substr($newsletter, $j, $i - $j);
  $balise = check_end_balise($tmp, $balise);
  return ($balise);
}
function filtrage($newsletter)
{
  $letter = $newsletter;
  $i = 0;
  $long = strlen($newsletter);
  while ($i < $long)
    {                                                                                                    
      if (($class = isclass($newsletter, $i)))        {                                                                                                                       
          $letter = replace_css($newsletter, $i, $class, $letter);
	}
      $i++;
    }
  return ($letter);
}

function search_div($div, $class)
{                                                                                               
  $long = strlen($div);
  $i = 0;
  while ($i < $long && $div[$i] != '{')
    $i++;
  $i++;
  $j = 0;
  while ($j < $long && $div[$j] != '}')
    $j++;
  $div = substr($div, $i, $j - $i);                                                                                                          
  return ($div);
}

function search_sub_div($div, $i, $class)
{
  $long = strlen($div);
  while ($i < $long && $div[$i] != '{')
    $i++;
  $i++;
  $j = 0;
  while ($j < $long && $div[$j] != '}')
    $j++;
  $div = substr($div, $i, $j - $i);
  return ($div);
}
function is_div_class($newsletter, $i, $class)
{
  if ($newsletter[$i] == ".")
    {
      $div = substr($newsletter, $i + 1);
      $j = 0;
      $long = strlen($div);
      while ($j < $long)
        {
          if ($div[$j] == " " || $div[$j] == '\t' || $div[$j] == '{')
            break;
          $j++;
        }
      $i = $j;
      while ($i < $long && $div[$i] != '{')
        {
          if ($div[$i] != " " && $div[$i] != '\t')
            {
              if ($class == substr($div, $i, $i - $j))
                return (search_sub_div($div, $i, $class));
              else
                return (NULL);
            }
          $i++;
	}
      if ($class == substr($div, 0, $j))
        return (search_div($div, $class));
      return (NULL);
    }
  return (NULL);
}

function css_exist($newsletter, $class)
{
  $long = strlen($newsletter);
  $i = 0;
  while ($i < $long)
    {
      if (($div = is_div_class($newsletter, $i, $class)))
        {
          return ($div);
        }
      $i++;
    }
  return (NULL);
}

function replace_css($newsletter, $i, $class, $letter)
{
	if (($div = css_exist($newsletter, $class)))
    {
      $div = 'style="' . $div . '"';
      $tmp = 'class="' . $class . '"';
	$letter = eregi_replace($tmp, $div, $letter);
    }
  return ($letter);
}
?>

Conclusion :


Voila excusez moi pour les deux fonctions de plus de 25 lignes.
J'espere que ce code pourra vous être utile.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
12
Date d'inscription
lundi 27 avril 2009
Statut
Membre
Dernière intervention
22 avril 2011

C'est bien pensé, bien ficelé, mais l'absence de commentaire risquerait de rebuter quelques développeurs débutant en PHP. Dommage car ton code est vachement utile.
Messages postés
402
Date d'inscription
jeudi 26 août 2004
Statut
Membre
Dernière intervention
19 juin 2009
1
tu devrais passer pas des regexp (REGular EXPression) plus rapide et bien plus sur que de passer par des substr() et autre fonction moin puissant et plus lente.
Messages postés
23
Date d'inscription
vendredi 20 juillet 2007
Statut
Membre
Dernière intervention
26 août 2008

Bonjour,

Donc pour tester tu peux mettre dans la variable $string ta newsletters.
exemple:
$string = ''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http\
://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Newsletter aubade</title>
<style type="text/css">
...'

Ensuite à la place du echo $coco tu peut mettre :
$headers ='From: "nom"'."\n";
$headers .='Reply-To: adresse_de_reponse@fai.fr'."\n";
$headers .='Content-Type: text/html; charset="iso-8859-1"'."\n";
$headers .='Content-Transfer-Encoding: 8bit';

$message = $coco;

if(mail('tonmail@gmail.com', 'Sujet', $message, $headers))
{
echo 'Le message a été envoyé';
}
else
{
echo 'Le message n\'a pu être envoyé';
}

Voila j'espere ca va t'aider sinon n'hésite pas.
Messages postés
46
Date d'inscription
mercredi 4 avril 2007
Statut
Membre
Dernière intervention
25 février 2009

bjr tt le monde ,
j voie ce code est tres long , mé utile. moi j vx le tester psq j'ai bq de pb ds le chargement ds ma page gmail,j'ai besoin des explications comment le testé ,avec quel serveur local???
merci en avance pour la reponse!!!!!!!!!!!
miss fafa
++

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (durealex)