Filtre pour newsletters gmail

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 577 fois - Téléchargée 18 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
misterclic66 Messages postés 12 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 22 avril 2011
17 févr. 2011 à 13:56
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.
cs_nico1610 Messages postés 395 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 19 juin 2009 1
15 sept. 2008 à 08:47
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.
durealex Messages postés 23 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 26 août 2008
13 août 2008 à 09:00
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.
cs_miss fafa Messages postés 46 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 25 février 2009
12 août 2008 à 15:17
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)