PHP: აწარმოებს script სურათი იტვირთება ჩართული e-mail

ეს წვერი არის სასარგებლო მათთვის, ვისაც სურს იცოდეს, თუ e-mail თქვენ გაიგზავნა წაიკითხეს. ამ შემთხვევაში, ჩასვათ გამოსახულება ორგანოს ფოსტის გაგზავნა, როდესაც გაიხსნა, გამოიწვევს script დაშორებულ სერვერს.

პრეზენტაცია

ეს ტექნიკა ფართოდ გამოიყენება ელექტრონული ფოსტით მარკეტინგში, ისე, რომ გამგზავნი აგზავნის ასობით ან ათასობით ელ.წერილს თქვენი საფოსტო ფოსტის მიმღებისთვის, რათა მიაღწიოს მიზნობრივ აუდიტორიას, და მინდა იცოდეთ უკუკავშირი (დაბრუნების) კამპანიის, სხვა სიტყვებით, ადრესატმა წაიკითხა თუ არა ელექტრონული ფოსტით ჩასმული რეკლამა.

როგორ მუშაობს?
მსჯელობა მარტივია, თქვენ უბრალოდ განათავსეთ იგი ელ.ფოსტის სხეულში (შინაარსი) HTML IMAGE tag, SRC ატრიბუტით მითითებით, არა უშუალოდ სურათზე, როგორც ჩვეულებრივ ხდება, მაგრამ პერსონალური სკრიპტისთვის, რომელიც დისტანციურ სერვერზეა განთავსებული, სადაც შეგიძლიათ შეასრულოთ რუტინული და, კი, გამოსახულება (თუ არა). გართულებულია? ვიდრე არაფერი, იხილეთ მაგალითი:

1
2
3
<?php
  <img src="http://seuservidor.com/script.php?ელ.ფოსტა=pessoa@gmail.com&destinatario = ტეილორი + ლოპები" />
?>

Რისთვის არის?
გაითვალისწინეთ, რომ როდესაც მომხმარებელი გახსნის ელ.ფოსტს, სავარაუდო სურათი ავტომატურად იტვირთება, რაც სინამდვილეში არის დამწერლობა. ეს გამოსადეგია ელექტრონული ფოსტის სტატისტიკის შესაქმნელად, რაც ნახეს, ჯანმო-ს დადგენის ჩათვლით (მიმღები) და როცა (თარიღი / დრო). ნათელი, ეს არც ერთია “განგება”, ვიცით, ვინ გახსნა ელ, რადგან ჩვენ ვუკავშირდებით ამ მონაცემს სურათის URL– ს მისი გაგზავნისას.

მოუხერხებელი
ამისათვის, ადრესატს აუცილებლად სჭირდება კონფიგურაცია, რათა მისი ელ.ფოსტა იკითხოს HTML ფორმატში, მიუხედავად იმისა, რომ ეს უკვე სტანდარტია, რომელსაც მომხმარებლების უმეტესობა იღებს. უარესში, ელ.ფოსტის პროვაიდერი გამოაქვეყნებს შეტყობინებას იმის შესახებ, რომ იგი დაბლოკავს სურათებს, მაგრამ კითხვაზე, სურს თუ არა მომხმარებლის ჩვენება, რომელიც ასევე ჩვეულებრივ მიიღება, რადგან ამ პრაქტიკაში ცოტა ადამიანი ხედავს ბოროტებას. Google- ის შემთხვევაში, გაგზავნა ჩანს ბმულზე, ასე:

1
2
3
...
  სურათები არ არის ნაჩვენები - სურათების ჩვენება ქვემოთ - ყოველთვის აჩვენეთ დამხმარე სურათები@ელ.მიკროსოფტი.ერთად
...

ამაზე ორი გზაზე კომენტარს გავაკეთებ; ორივე თანაბრად მუშაობს, მეორე უფრო გონივრულია, რადგან ის არ აჩვენებს მონაცემებს URL- ში, თუმცა ეს მოითხოვს უფრო მეტ საცავ რესურსს. კარგით!

გადაწყვეტა 1

პრაქტიკაში
თქვენ მხოლოდ ორი PHP კოდი გჭირდებათ:
(1) ელ.ფოსტის გაგზავნა HTML ფორმატით, IMG ჩანაწერით
(2) ელ.ფოსტის გახსნისთანავე ინფორმაციის გადაღება

ნაბიჯი 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_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\n"; 
  $თავსართი      .= "Content-type: text / html; charset = iso-8859-1\n"; 
  $თავსართი      .= "From: ".(ცარიელი($გამგზავნის სახელი) ? $sender_email : '"'.$გამგზავნის სახელი.'" <'.$sender_email.'>')."\n";
 
  // ელ.ფოსტის გაგზავნა
  $ელ = ცარიელი($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome.'" <'.$destinatario_email.'>';
  ფოსტა($ელ, $განხილვის თემა, $მესიჯი, $თავსართი);
?>

ნაბიჯი 2 – ინფორმაციის მოპოვება

კარგად, შენიშნეთ, რომ TAG IMG– ს წაკითხვის დროს ფაილზე იძახებენ ზარი “სკრიპტი.php”, ზოგიერთი? ასე რომ, ახლა ჩვენ უნდა შევქმნათ ის, რომ ინფორმაცია მივიღოთ და შეინახოთ, სასურველია მონაცემთა ბაზაში.

მაგიდის შექმნა
ვინაიდან ჩვენ უნდა გავაგრძელოთ ადრესატის მონაცემები, ვინც გახსნა ელ.ფოსტა, ჩვენ შეგვიძლია შევქმნათ ცხრილი, როგორც ქვემოთ მოცემულია. იხილეთ ველი `datahora_visualizado`, რაც ეხება ბოლო თარიღსა და დროს, როდესაც მომხმარებელმა ელ.ფოსტა და ველი ნახა `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
დამთავრებული, vamos pegar dados como e-mail do destinatário, nome do destinatário, assunto da mensagem e a data/hora de quem abriu o e-mail, armazenando tudo no banco de dados que criamos, para caso futuramente precisarmos fazer uma estatística. No final do script, vamos de fato criar e exibir uma imagem, მხოლოდ იმისათვის, რომ თავიდან ავიცილოთ IMG TAG ეგზისტენციალური კრიზისი :), მაგრამ თუ არ გინდა არაფრის ჩვენება, შექმენით მინიმუმ ერთი ცარიელი სურათი (1×1 პიქსელი) არ მიიღოთ გატეხილი ტეგა.

სკრიპტი.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(დამატებების დამატება($_REQUEST['ელ.ფოსტა'])));
  $destinatario_nome  = მორთვა(strip_tags(დამატებების დამატება($_REQUEST["ადრესატი"])));
  $განხილვის თემა            = მორთვა(strip_tags(დამატებების დამატება($_REQUEST['განხილვის თემა'])));       
 
  // აკავშირებს მონაცემთა ბაზას (შეცვალეთ თქვენი კავშირი)
  $ბმული = mysql_connect('mysql.seuservidor.com', "ფესვი", '***თქვენი პაროლი***') ან die("მონაცემთა ბაზასთან დაკავშირება ვერ მოხერხდა."); 
  mysql_select_db('თქვენი მონაცემთა ბაზა') ან die("მონაცემთა ბაზის არჩევა ვერ მოხერხდა");
 
  // უერთდება SQL და ათავსებს მას მონაცემთა ბაზაში, თუ ელ.ფოსტა ჯერ არ არსებობს, ან განაახლეთ მრიცხველი, თუ ის არსებობს
  $sql = 'SELECT email FROM maladireta WHERE email="'.$destinatario_email.'"';
  $რეზ = mysql_query($sql);
  თუ (mysql_num_rows($რეზ) > 0) {
    $sql = 'UPDATE maladireta SET datahora_visualizado="'.თარიღი('Y-m-d H:მე:ის).'", contador=contador+1 WHERE email="'.$destinatario_email.'"';    
  }
  სხვაგან {
    $sql = 'INSERT Into maladireta ღირებულებები (ნულოვანი, "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$განხილვის თემა.'", "'.თარიღი('Y-m-d H:მე:ის).'", ნულოვანი, 0)';
  }
  mysql_query($sql);
 
  // Cria e exibe a imagem embutida ao email
  თავსართი("Content-type: image/png");
  $img = imagecreatefrompng("imagem.png");
  imagepng($img);
  imagedestroy($img);
?>

შენიშვნა: Não esqueça de colocar junto ao script uma imagem, არავითარ შემთხვევაში, chamei deimagem.png”. ეს სურათი გამოჩნდება მიმღების ელ.ფოსტის ორგანოში, და ეს არის ის, სადაც მარკეტინგული ხალხი განათავსებს რეკლამას, მაგრამ ეს შეიძლება იყოს ლოგო ან რაც გსურთ. სკრიპტი გამოცდილია და მუშაობს!

გადაწყვეტა 2

კიდევ ერთი შესაძლებლობა
როგორც ამას კოლეგა ლეანდრო გვთავაზობს, უფრო გონიერი და “უსაფრთხო” იქნებოდა, იმის ნაცვლად, რომ ელ.ფოსტის მსგავსად ბევრი მონაცემი დაასახელოთ გამოსახულების URL- ში, განხილვის თემა, და ა.შ., შექმენით HASH ელ.ფოსტის გაგზავნის დროს დაუკავშირდით მას ამ მონაცემებთან, და გაგზავნეთ URL მხოლოდ 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 ,
  `ჰაში`ვარჩარი( 50 ) არა 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_email    = 'anonimo@email.com';
 
  // *** შენი სამიზნე (გამგზავნი ელ.ფოსტით) 
  $destinatario_nome  = 'მარიო ბროსი';
  $destinatario_email = 'mariobross@email.com';
 
  // *** სხვა მონაცემები, რომ შენარჩუნდეს და HASH (იდენტიფიკატორი)
  $ჰაში               = md5(rand());
  $განხილვის თემა            = "სკრიპტის შესრულების ტესტირება სურათის დატვირთვისას.";
  $date_time     = თარიღი('Y-m-d H:მე:ის);
 
  // აკავშირებს მონაცემთა ბაზას
  $ბმული = mysql_connect('mysql.seuservidor.com', "ფესვი", '***თქვენი პაროლი***') ან die("მონაცემთა ბაზასთან დაკავშირება ვერ მოხერხდა."); 
  mysql_select_db('თქვენი მონაცემთა ბაზა') ან die("მონაცემთა ბაზის არჩევა ვერ მოხერხდა");  
 
  // უერთდება SQL და ათავსებს მას მონაცემთა ბაზაში
  $sql = 'INSERT Into maladireta ღირებულებები (ნულოვანი, "'.$ჰაში.'", "'.$destinatario_email.'", "'.$destinatario_nome.'", "'.$განხილვის თემა.'", "'.$date_time.'", ნულოვანი, 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\n"; 
  $თავსართი      .= "Content-type: text / html; charset = iso-8859-1\n"; 
  $თავსართი      .= "From: ".(ცარიელი($გამგზავნის სახელი) ? $sender_email : '"'.$გამგზავნის სახელი.'" <'.$sender_email.'>')."\n";
 
  // ელ.ფოსტის გაგზავნა
  $ელ = ცარიელი($destinatario_nome) ? $destinatario_email : '"'.$destinatario_nome.'" <'.$destinatario_email.'>';
  ფოსტა($ელ, $განხილვის თემა, $მესიჯი, $თავსართი);
?>

Perceba que, ამ შემთხვევაში, a URL (SRC) da imagem fica apenas com o HASH.

Contabilizando e-mail visualizado

სკრიპტი.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
  // Captura o HASH do e-mail visualizado
  $ჰაში = მორთვა(strip_tags(დამატებების დამატება($_REQUEST['hash'])));
 
  // აკავშირებს მონაცემთა ბაზას
  $ბმული = mysql_connect('mysql.seuservidor.com', "ფესვი", '***თქვენი პაროლი***') ან die("მონაცემთა ბაზასთან დაკავშირება ვერ მოხერხდა."); 
  mysql_select_db('თქვენი მონაცემთა ბაზა') ან die("მონაცემთა ბაზის არჩევა ვერ მოხერხდა");
 
  // Monta a SQL e atualiza data de visualização do email e contador no banco de dados
  $sql = 'SELECT hash FROM maladireta WHERE hash="'.$ჰაში.'"';
  $რეზ = mysql_query($sql);
  თუ (mysql_num_rows($რეზ) > 0) {
    $sql = 'UPDATE maladireta SET datahora_visualizado="'.თარიღი('Y-m-d H:მე:ის).'", 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);
?>

Ah, 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 იანვარი 2013. Fica a dica

1
2
3
4
5
6
7
8
 
  აირჩიეთ * 
  გაქცევისგან
      `maladireta`
  სადაც
      კონდატორი > 0 და 
      თარიღი(visualized_time) >= თარიღი("2013-01-27")
;
სულ ხელმისაწვდომი: 34926

8 მიმოხილვა “PHP: აწარმოებს script სურათი იტვირთება ჩართული e-mail

  1. ლეანდრო ჩავესი განაცხადა:

    Taylor,
    არ არის კარგი პრაქტიკა, რომ მომხმარებლის ელ.ფოსტა განათავსოთ გამოსახულების ბმულზე. იდეალურია მონაცემების ბანკში ჩასმა დროს და გაგზავნოთ ჰაში ან მაგიდის ID ბმულზე, იდენტიფიცირება ვინ გახსნა ელ.

    • ოი ლეანდრო, მადლობა კომენტარისთვის. ეს სადავოა. ინფორმაციის უსაფრთხოებაზე ფიქრი, მართალი ხართ, მაგრამ პრაქტიკაში ეს ცოტათი ძვირფასი იქნებოდა, რადგან ელ.ფოსტის ბმული (სურათი) რომ მნიშვნელოვანად მიიჩნევთ დაცვას, მხოლოდ ხელმისაწვდომი იქნება მიმღების საკუთარ ყუთში. ეს იგივეა, რაც ჩემგან რაღაცის დამალვა, რომელიც მე უკვე ვიცი! გარდა ამისა,, თქვენ უნდა მოაწყოთ სხვა ბანკი თქვენს ბანკში, ათასობით ჩანაწერით თქვენი პირდაპირი ფოსტით, მაშინაც კი, იმის ცოდნის გარეშე, შეიცავს მასში ელ.წერილს. მაშინ თუ გინდა “დანამატი” თქვენი ბანკი, ვერ შეძლო, რადგან ცხრილებს შორის რეფერენტული მთლიანობის გამო, საჭირო იქნება ჩანაწერების შენახვა, ტკივილის ქვეშ არ იცოდა ვინ გახსნა ელ.წერილი. მაგრამ რადგან ჩვენ ვსაუბრობთ უსაფრთხოებაზე, რათა თავიდან ავიცილოთ ელ.წერილი, რომელიც Wireshark უწყვეტია, რაც შეიძლება გაკეთდეს SSL– ის გამოყენება (https) ორივე ელ.ფოსტის გაგზავნისას, როგორც სურათის ბმულში. მაგრამ მე მომეწონა თქვენი წინადადება, ამაზე გამოსავალს გამოვაქვეყნებ, მიღებული!

  2. Ola ,
    ვცდილობ მივიღო ის IP, ვინც მესიჯს კითხულობს , ამასთან, თუ თქვენ ხართ hotmail მომხმარებელი, მაგალითად, ის იღებს IP- ს დომენური სახელწოდებით აშშ – ში. ეს დიდად არ მეხმარება . როგორ მივიღო მისი აპარატის რეალური IP ?

  3. რეგისი განაცხადა:

    უცნაური ზოგჯერ ის მუშაობს და ზოგჯერ ის Chrome Chrome- ის გამოყენებით არ მუშაობს, Opera e Fire Fox no gmail e hotmail – სუფთა ქეში და cookies, მაგრამ ზოგჯერ იგი მონაცემთა ბაზაში არ წერს, თუ ელ.ფოსტა გაიხსნა თუ არა !!

  4. დიეგო განაცხადა:

    ბიჭებო .. მე მაქვს სარეგისტრაციო სკრიპტი სახელწოდებით. ფოსტა…CPF…რგ…მინდოდა, რომ მომხმარებელმა ყველაფერი დაარეგისტრირა და ჩემს მონაცემთა ბაზაში გაგზავნა …ავტომატურად უბრუნდება რაღაც მის ელ.ფოსტს ...
    მაგალითი:”ინფორმაცია წარმატებით დარეგისტრირდა ..” დაელოდეთ ჩვენს კონტაქტს

    მოჰყვებოდა??

  5. თქვენ მაინც ხედავთ მას ტეილორს??

    როგორც ჩანს, ერთადერთი სერვერი, რომელიც ამ image.php- ს ხსნის, არის gmail. რამე რჩევა ხომ არ გექნებათ ამ საქმის გასაკეთებლად??

    • Opa, როგორც პოსტში ვთქვი: “ამისათვის, ადრესატს აუცილებლად სჭირდება კონფიგურაცია, რათა მისი ელ.ფოსტა იკითხოს HTML ფორმატში”. ნაგულისხმევი HTML მოცემულია, მაგრამ Gmailც კი ცვლის რედაქტირებას TEXT- ში, მაშინ ეს არ იმუშავებს, რადგან ის უბრალოდ აჩვენებს HTML ტეგებს, როგორც ტექსტს, მათი გადაცემის ნაცვლად.

დატოვე პასუხი

თქვენი ელ-ფოსტა არ გამოქვეყნდება. აუცილებელი ველები აღნიშნულია *