PHP: Электрондук почтага орнотулган сүрөттү жүктөөдө сценарийди иштетиңиз

Бул кеңеш сиз жөнөткөн электрондук почта окулгандыгын билгиси келгендерге пайдалуу. Бул учурда, электрондук почта билдирүүсүнүн негизги бөлүгүнө сүрөт киргизебиз, ачылганда, алыскы сервердеги скриптти күйгүзөт.

көрсөтүү

Бул ыкма электрондук почта маркетингинде кеңири колдонулат, ошондуктан жөнөтүүчү максаттуу аудиторияга жетүү үчүн түз почтаңыздын алуучуларына жүздөгөн же миңдеген электрондук каттарды жөнөтөт, жана пикирди билгиси келет (кайра) кампаниясынын, Башка сөз менен айтканда,, алуучу электрондук почтага салынган жарнаманы окуп же окуган жокпу.

Бул кантип иштейт?
Ой жүгүртүү жөнөкөй, сиз жөн гана электрондук почтага киргизип койсоңуз болот (ыраазы) HTML IMAGE теги, SRC атрибутун көрсөтүү менен, кадимкидей эле сүрөттү түз эле эмес, бирок алыскы серверде жайгашкан өзгөчөлөштүрүлгөн сценарий үчүн, бир жерде кандайдыр бир тартипти аткара турган жана, Ооба, сүрөт тартуу (же жок). татаал? Эч нерсе жок, мисалды караңыз:

1
2
3
<?PHP
  <img src="http://seuservidor.com/script.php?email=pessoa@gmail.com&Destinatario = Тейлор + Лопес" />
?>

Бул эмне үчүн?
Колдонуучу электрондук почтаны ачканда, болжолдонгон сүрөт автоматтык түрдө жүктөлөт, бул чындыгында эле сценарий. Бул көрүлгөн электрондук каттардын статистикасын жүргүзүү үчүн пайдалуу, анын ичинде ДСУ аныкталды (алуучу аял) жана качан (Дата убакыт). ачык, бул эч нерсе эмес “төлгө”, электрондук почтаны ким ачканын билебиз, анткени бул маалыматты жөнөтүүдө сүрөт URL дарегине шилтеме кылабыз.

ыңгайсыз
Бул иштеш керек, электрондук почта билдирүүлөрүн HTML форматында окуу үчүн алуучу сөзсүз түрдө конфигурациялаган болушу керек, бирок бул буга чейин көпчүлүк колдонуучулар кабыл алган стандарт. Эң жаманы, электрондук почта провайдери сүрөттөрдү бөгөттөп салгандыгы жөнүндө билдирүү көрсөтөт, бирок колдонуучу көрсөтүүнү каалап жатабы деп сурап жатат, адатта кабыл алынат, анткени, мындай иш-аракеттерди аз адамдар көрүшөт. Google учурда, билдирүү шилтеме катары пайда болот, ушундай:

1
2
3
...
  Сүрөттөр көрсөтүлбөйт - Сүрөттөрдү төмөндө көрсөтүү - Ар дайым колдоо сүрөттөрүн көрсөтүү@электрондук почта.Текшерүү.менен
...

Муну жасоонун эки жолу жөнүндө айтып берем; экөө тең бирдей иштешет, экинчиси акылдуураак, анткени ал URL дарегинде маалыматтарды көрсөтпөйт, көп сактоо ресурстарын талап кылса дагы. келгиле!

чечим 1

иш жүзүндө
Сизге эки гана PHP коду керек:
(1) имейлди HTML форматында IMG теги менен жөнөтүү үчүн
(2) электрондук почта ачылган учурга чейин маалымат алуу үчүн дагы бир жолу

STEP 1 – Электрондук почта билдирүүсүн жөнөтүү

sendmail.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?PHP
  // *** Электрондук почтаңыз (жөнөтүүчүнүн электрондук почтасы)
  $SENDER_NAME     = "Anonymous";
  $SENDER_EMAIL    = "Anonimo@email.com";
 
  // *** Сиздин максатыңыз (жөнөтүүчүгө электрондук почта билдирүүсү) 
  $destinatario_nome  = 'Марио Бросс';
  $destinatario_email = "Mariobross@email.com";
 
  // *** Кабардын темасы жана мазмуну
  $предмет      = 'Сүрөттү жүктөөдө скрипттердин аткарылышын текшерүү.';
  $билдирүү     = "
    <html lang="pt-br">
      <баш>
        <meta charset="iso-8859-1" />    
        <наам>".$предмет."</наам>
      </баш>
      <дене>
        <img src="http://seuservidor.com/script.php?электрондук почта = '.urlencode($destinatario_email)."&алуучу = '.urlencode($destinatario_nome)."&тема = '.urlencode($предмет)."" />
      </дене>
    </HTML>";
 
  // Мазмун HTML түрүндө экендигин көрсөтүүчү баш аты (IMG тегин окуп, сценарийди аткара алат)
  $сап       = "MIME-Version: 1.0"; 
  $сап      .= "Content-type: текст / HTML; белги = ISO-8859-1"; 
  $сап      .= "From: ".(бош($SENDER_NAME) ? $SENDER_EMAIL : '"'.$SENDER_NAME."" <".$SENDER_EMAIL.">")."";
 
  // Электрондук почта билдирүүсүн жөнөтүү
  $электрондук почта = бош($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome."" <".$destinatario_email.">";
  почта($электрондук почта, $предмет, $билдирүү, $сап);
?>

STEP 2 – Маалыматты тартып алыңыз

жакшы, IMG TAG программасын окуп жатканда файлга чалуу жасала тургандыгын байкадыңызбы “script.php”, Албетте? Ошентип, биз маалыматты алып, сактоо үчүн аны түзүшүбүз керек, de preferência num banco de dados.

Criando TABELA
Já que precisamos persistir os dados do destinatário que abriu o e-mail, podemos criar uma tabela como esta abaixo. Veja o campo `datahora_visualizado`, que refere-se última data e hora em que o usuário visualizou o e-mail e o campo `contador`, que irá registrar a quantidade de vezes que o e-mail foi visto.

maladireta.sql
1
2
3
4
5
6
7
8
9
CREATE TABLE  `maladireta` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `email` VARCHAR( 100 ),
  `destinatario` VARCHAR( 100 ),
  `assunto` VARCHAR( 200 ),
  `datahora_envio` DATETIME NOT NULL,
  `datahora_visualizado` DATETIME,
  `contador` INT DEFAULT 0
) ENGINE = MYISAM ;

Script para captar informações e exibir uma imagem
Finalizando, сыяктуу маалыматтарды алалы Алуучунун электрондук дареги, Алуучунун аты, кабардын темасы жана датасы / убактысы катты ким ачкан, бардыгын биз түзгөн маалыматтар базасында сактоо, эгерде биз келечекте статистиканы жасашыбыз керек болсо. Акыркы сценарий жок, Келгиле, чындыгында сүрөттү түзүп, көрсөтөлү, экзистенциалдык кризис менен IMG TAGдин алдын алуу үчүн :), бирок сиз эч нерсе көрсөтүүнү каалабасаңыз, жок дегенде бир бош сүрөт жаратыңыз (1×1 пиксел) сынган тегин алуу үчүн эмес.

script.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?PHP
  // Киргизүү параметрлерин демилгелейт жана иштетет
  $destinatario_email = кырка(strip_tags(addslashes($_REQUEST["Электрондук почта"])));
  $destinatario_nome  = кырка(strip_tags(addslashes($_REQUEST["Адресат"])));
  $предмет            = кырка(strip_tags(addslashes($_REQUEST["предмет"])));       
 
  // Маалыматтар базасына туташат (ТҮЙҮНҮҢҮЗДҮ ТАНДОО)
  $байланыш = mysql_connect("Mysql.seuservidor.com", "Тамыры", '*** сырсөзүңүз ***') же жана('Маалыматтар базасына туташа албай койду.'); 
  mysql_select_db("Yourdatabase") же жана('Маалыматтар базасын тандоо ишке ашкан жок');
 
  // Monta a SQL e insere no banco de dados, caso email ainda não exista, ou atualiza contador se existir
  $sql = 'SELECT email FROM maladireta WHERE email="'.$destinatario_email.'"';
  $res = mysql_query($sql);
  эгер (mysql_num_rows($res) > 0) {
    $sql = 'UPDATE maladireta SET datahora_visualizado="'.date('Y-m-d H:i:s').'", contador=contador+1 WHERE email="'.$destinatario_email.'"';    
  }
  else {
    $sql = 'INSERT INTO maladireta VALUES (null, "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$предмет.'", "'.date('Y-m-d H:i:s').'", null, 0)";
  }
  mysql_query($sql);
 
  // Cria e exibe a imagem embutida ao email
  сап("Content-type: image/png");
  $img = imagecreatefrompng("imagem.png");
  imagepng($img);
  imagedestroy($img);
?>

пикир: Сценарийдин жанына сүрөт койууну унутпаңыз, эч нерсе жок, Мен чалдым “imagem.png”. Бул сүрөт алуучунун электрондук почтасынын корпусунда пайда болот, жана ошол жерде маркетинг адамдар жарнаманы коюшат, бирок логотип же каалаган нерсеңиз болушу мүмкүн. Сценарий сыналды жана иштейт!

чечим 2

Дагы бир мүмкүнчүлүк
Кесиптешиңизге чачыңызды Леандро сунуш кылгандай, бир топ акылдуу жана “коопсуз” болмок, сүрөттүн URL дарегиндеги электрондук почта сыяктуу көптөгөн маалыматтарды штамптоонун ордуна, предмет, жана башкалар, Электрондук почта билдирүүсүн ушул маалыматтар менен байланыштыруу жолу менен HASH түзүңүз, жана URL'ге HASH гана жөнөтүңүз. Алуучу электрондук почтаны ачып, сүрөттү жүктөп бергенде, траффик HASH гана калат, аны кийин биздин сценарий басып алат жана биз билгибиз келген маалыматтар менен байланыштырат.

Хэш таблицасын жана маалымат шилтемесин түзүү
Электрондук почта билдирүүсү жөнөтүлгөн сайын популярдуу боло турган үстөл түзөлү. Талаага көңүл буруңуз `hash`, жөнөтүлгөн электрондук почтага жана таблицада сакталган алуучунун маалыматтарына шилтеме катары кызмат кылат.

maladireta.sql
1
2
3
4
5
6
7
8
9
10
CREATE TABLE  `maladireta` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `таштанды`VARCHAR( 50 ) NOT NULL,
  `email` VARCHAR( 100 ),
  `destinatario` VARCHAR( 100 ),
  `assunto` VARCHAR( 200 ),
  `datahora_envio` DATETIME NOT NULL,
  `datahora_visualizado` DATETIME,
  `contador` INT DEFAULT 0
) ENGINE = MYISAM

Электрондук почта билдирүүсү жөнөтүлүүдө

sendmail.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?PHP
  // *** Электрондук почтаңыз (жөнөтүүчүнүн электрондук почтасы)
  $SENDER_NAME     = "Anonymous";
  $SENDER_EMAIL    = "Anonimo@email.com";
 
  // *** Сиздин максатыңыз (жөнөтүүчүгө электрондук почта билдирүүсү) 
  $destinatario_nome  = 'Марио Бросс';
  $destinatario_email = "Mariobross@email.com";
 
  // *** Башка маалыматтар сакталсын жана HASH (аныктагыч)
  $таштанды               = md5(ранды());
  $предмет            = 'Сүрөттү жүктөөдө скрипттердин аткарылышын текшерүү.';
  $Дата убакыт     = date('Y-m-d H:i:s');
 
  // Маалыматтар базасына туташат
  $байланыш = mysql_connect("Mysql.seuservidor.com", "Тамыры", '*** сырсөзүңүз ***') же жана('Маалыматтар базасына туташа албай койду.'); 
  mysql_select_db("Yourdatabase") же жана('Маалыматтар базасын тандоо ишке ашкан жок');  
 
  // Monta a SQL e insere no banco de dados
  $sql = 'INSERT INTO maladireta VALUES (null, "'.$таштанды.'", "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$предмет.'", "'.$Дата убакыт.'", null, 0)";
  mysql_query($sql);
 
  // *** Билдирүү жөнөтүлсүн
  $билдирүү     = "
    <html lang="pt-br">
      <баш>
        <meta charset="iso-8859-1" />    
        <наам>".$предмет."</наам>
      </баш>
      <дене>
        <img src="http://seuservidor.com/script.php?таштанды = '.$таштанды."" />
      </дене>
    </HTML>";
 
  // Мазмун HTML түрүндө экендигин көрсөтүүчү баш аты (IMG тегин окуп, сценарийди аткара алат)
  $сап       = "MIME-Version: 1.0"; 
  $сап      .= "Content-type: текст / HTML; белги = ISO-8859-1"; 
  $сап      .= "From: ".(бош($SENDER_NAME) ? $SENDER_EMAIL : '"'.$SENDER_NAME."" <".$SENDER_EMAIL.">")."";
 
  // Электрондук почта билдирүүсүн жөнөтүү
  $электрондук почта = бош($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome."" <".$destinatario_email.">";
  почта($электрондук почта, $предмет, $билдирүү, $сап);
?>

Муну түшүн, Бул учурда, URL (СИБ) сүрөттүн HASH менен гана.

Көрүлгөн электрондук почтаны эсепке алуу

script.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?PHP
  // Көрүлгөн электрондук каттын HASH жаздырыңыз
  $таштанды = кырка(strip_tags(addslashes($_REQUEST["Таштанды"])));
 
  // Маалыматтар базасына туташат
  $байланыш = mysql_connect("Mysql.seuservidor.com", "Тамыры", '*** сырсөзүңүз ***') же жана('Маалыматтар базасына туташа албай койду.'); 
  mysql_select_db("Yourdatabase") же жана('Маалыматтар базасын тандоо ишке ашкан жок');
 
  // SQL санын кыскартат жана электрондук почтаны көрүү датасын жана эсептегичти маалымат базасында жаңыртат
  $sql = 'SELECT hash FROM maladireta WHERE hash="'.$таштанды.'"';
  $res = mysql_query($sql);
  эгер (mysql_num_rows($res) > 0) {
    $sql = 'UPDATE maladireta SET datahora_visualizado="'.date('Y-m-d H:i:s').'", contador=contador+1 WHERE hash="'.$таштанды.'"';
    mysql_query($sql);
  }
 
  // Cria e exibe a imagem embutida ao email
  сап("Content-type: image/png");
  $img = imagecreatefrompng("imagem.png");
  imagepng($img);
  imagedestroy($img);
?>

Ах, se você quiser consultar os e-mails que foram visualizados a partir de uma data, poderia fazer um script com uma SQL tipo essa que, эч нерсе жок, busca todos os registros recentes de e-mail vistos a partir de 27 January 2013. Fica a dica

1
2
3
4
5
6
7
8
 
  SELECT * 
  FROM 
      `maladireta` 
  WHERE 
      contador > 0 AND 
      DATE(datahora_visualizado) >= DATE("2013-01-27")
;
жалпы кайрылат: 34898

8 сын-пикир “PHP: Электрондук почтага орнотулган сүрөттү жүктөөдө сценарийди иштетиңиз

  1. Leandro Chaves мындай деди::

    Тейлор,
    Não é uma boa prática colocar o email do usuário no link da imagem. Идеал - маалыматтарды банкка жөнөтүп жаткан учурда салып, шилтемени же столдун id шилтемесин коюу, электрондук почтаны ким ачкандыгын аныктоо.

    • Oi Leandro, комментарий үчүн рахмат. Бул талаштуу. Маалыматтык коопсуздук жөнүндө ой жүгүртүү сиз туура айтасыз, бирок иш жүзүндө ал бир аз баалуу болмок, анткени электрондук почта шилтемеси (Image) сиз коргоону маанилүү деп эсептеген нерсе алуучунун жеке куржунунда гана болот. Бул мен билгенден бир нерсени жашыруу сыяктуу! Мындан тышкары, Сиздин банкта түз почтаңыздагы миңдеген жазууларды камтыган башка таблицаны сакташыңыз керек, андагы электрондук почта билдирүүлөрүнүн жарактуулугун билбей туруп эле. Эгер кааласаңыз “жапкыч” сиздин банк, алган жок, анткени таблицалардын ортосундагы шилтеме бүтүндүгү үчүн, иш кагаздарын жүргүзүү талап кылынат, электрондук почтаны ким ачканын эч качан билбестен кыйналдым. Бирок биз коопсуздук жөнүндө сүйлөшүп жатабыз, электрондук почта жашоонун Wireshark тарабынан тоскоол болбошу үчүн, эмне кылса болот SSL колдонуу (HTTPS) электрондук почта билдирүүсүн жөнөтүүдө, сүрөт шилтемесинде көрсөтүлгөндөй. Бирок мага сиздин сунушуңуз жакты, Мен ушул сыяктуу чечимди жарыялайм, тапкан!

  2. Ола ,
    Билдирүүнү окуган адамдын IP дарегин алууга аракет кылып жатам , Бирок, эгер сиз hotmail кардары болсоңуз, ал АКШда домендик аталышы бар IP алат. Ошентип, бул мага көп деле жардам бербейт . Кантип мен анын машинасынын чыныгы IP алууга болот ?

  3. Регис мындай деди::

    Strange Кээде ал иштейт, ал эми кээде Chrome аркылуу иштебейт, Opera e Fire Fox эч кандай gmail e hotmail жок – кэшти жана cookies файлдарын тазалоо, бирок кээде электрондук почта ачылса же болбосо, анда маалымат базасына жазбайт !!

  4. Диего мындай деди::

    Guys..Мен аты-жөнү бар электрондук почта каттоосу бар…CPF…RG…Колдонуучу бардыгын каттап, менин маалымат базамга жөнөтүп койгондон кийин, мен аны кааладым …электрондук почтага бир нерсени автоматтык түрдө кайтарат ...
    ҮЛГҮ:”маалымат ийгиликтүү катталды ..” биздин байланышты күтөбүз

    эненин??

  5. Сиз аны дагы эле Тейлордон көрө аласыз??

    Бул image.php ачкан жалгыз сервер - бул gmail. Бул ишти жасоого байланыштуу менде кандайдыр бир кеңеш барбы???

    • Опа, мен Постто айткандай: “Бул иштеш керек, электрондук почта билдирүүлөрүн HTML форматында окуу үчүн алуучу сөзсүз түрдө конфигурациялаган болушу керек”. Демейки боюнча HTML көрсөтүлөт, бирок Gmail дагы рендерингди TEXT деп өзгөртөт, анда ал иштебейт, анткени ал HTML TAGдерди тексттин ордуна текст катары көрсөтөт.

Таштап Жооп

Сиздин электрондук почтанын дареги, жарыяланган жок. Милдеттүү талаалар менен белгиленет *