Potwierdzenie odbioru maila

0

Cześć Wam, wysyłam maila do 400 osób w mailu jest m.in. link do potwierdzenia odbioru wiadomości np:

//http://example.pl/[email protected].

W linku [email protected], to indywidualny identyfikator klienta, po którym można sprawdzić, czy już kliknął w link, czy nie.
Jak mogę to przetworzyć bez bazy danych bazując na pliku txt z mechanizmem zabezpieczającym, aby nie mógł kliknąć 2 razy? Dodatkowym zabezpieczeniem mógłby być adres ip.

Finalnie chciałbym uzyskać wiadomość, która przyjdzie po kliknięciu w link, jako potwierdzenie odbioru maila.
Z góry dziękuję za pomoc

Póki co mam tyle...

<?php
//http://example.pl/[email protected]

if (isset($_GET['email'])) {
        $EMAIL = $_GET['email'];
        echo "Twój adres email to: <b>" . htmlspecialchars($EMAIL) . "</b><br>";
        $ipaddress = getenv("REMOTE_ADDR") ;
        echo " Twoje IP to: <b> " . $ipaddress . "</b>";
} else {
        echo 'Brak maila';
}
?>
0

No to sobie zapisuj do tego pliku txt listę maili, które już zostały potwierdzone, co za problem? I w sumie nie kumam co ma adres IP do tego? Chcesz sprawdzić, czy ktoś nie potwierdził dwóch różnych maili?

0

Poczytaj sobie o operacjach na plikach, masz tam też przykłady i linki do podobnych funkcji, z których możesz skorzystać.

https://www.php.net/manual/en/function.file-put-contents.php

Po przejściu na link po prostu odczytujesz plik i sprawdzasz, czy email już tam istnieje. Jak tak, to dajesz info, że już wcześniej było kliknięcie, jak nie, to zapisujesz maila do listy.

0

Nie potrzebujesz zapisywać IP ani nic takiego.

<?php
//http://example.pl/[email protected]

if (isset($_GET['email'])) {
        $EMAIL = $_GET['email'];
        echo "Twój adres email to: <b>" . htmlspecialchars($EMAIL) . "</b><br>";
        mail(); // tutaj wyślij potwierdzenie maila
} else {
        echo 'Brak maila';
}
?>

Co do samego designu, to nie projektuj linka w taki sposób. http://example.pl/[email protected]. Zrób tak, żeby ten indywidualny identyfikator klienta to nie była żadna znana wartość. Najlepiej żeby to był jakiś token, typu sha1($email . $salt), czyli e-mail + sól, którą jedynie zapisujesz w bazie, i wysyłasz mailem, ale nie dajesz userowi nigdy, bo to z maila gość ma odczytać tą wartość. Noi dobrze myślisz, musisz sprawdzić czy mail już nie jest potwierdzony zanim wyślesz kolejny z potwierdzeniem.

0

@TomRiddle: Dokładnie chciałbym uzyskać to, jak ktoś kliknie w mailu w link, który ode mnie dostał, to po wejściu na link po prostu chwiałbym zapisać jego maila w pliku, aby mieć potwierdzenie, że widział (odczytał) maila. A żeby nie było ciągłego zapisu, to muszę to jakoś zablokować. Odczytać plik i sprawdzasz, czy email już tam istnieje. Jak tak, to dajesz info np. "Potwierdzenie odbioru maila zostało wykonane." , a jak nie, to zapisujesz maila do listy."

0

Okej, więc widzę dwa problemy.

  • Ludzie potwierdzający swój e-mail wiele razy (to zabezpieczysz sprawdzając czy mail już jest w pliku)
  • Ludzie weryfikujący mail, mimo że go nie mają (to trzeba załatwić hashwaniem)

Drugi problem jest taki, że jak ja się zarejestruję na Twojej stronie mailem [email protected], to potem wystarczy że wejdę na Twój adres http://example.pl/[email protected], i Twoja strona uzna mnie za zweryfikowanego. Dlatego własnie mówiłem że tokenem weryfikacyjnym musi być coś, do czego ma dostęp tylko właściciel maila. Sam adres nie jest czymś takim.

Co do pierwszego punktu, ja bym zrobił tak

Stwórz plik emails.json

{
  "emails": []
}

Kod:

if (isset($_GET['email'])) {
    $email= $_GET['email'];
    $confirmedEmails = json_decode(file_get_contents('emails.json'), true);  // wczytaj json z pliku
    var_dump($confirmedEmails); // wywal jak wrzucisz na server
    if (in_array($email, $confirmedEmails['emails'])) {
        echo "Już się zarejestrowałeś";
    }
    else {
       array_push($confirmedEmails['emails'], $email);  // dodaj email do arraya
       file_put_contents('emails.json', json_encode($confirmedEmails));  // zapisz JSON do pliku
       echo "Twój adres email to: <b>" . htmlSpecialChars($email) . "</b><br>";
     }
} else {
     echo 'Brak maila';
}

Oczywiście pozostaje więcej problemów, jak np to czy ktoś faktycznie przekazał adres e-mail, etc. Noi nadal pozostaje fakt że nie masz hashowania ani soli.

0

Nie znam się na programowaniu i uczę się nie wszystko jest jeszcze dla mnie jasne. Jakby wyglądała składnia:
Mam zmienną: $id = $_GET['email'];
Plik z mailami emaile.txt w którym jest 200 maili
i jak sprawdzić, czy mail podany w zmiennej $id istnieje w pliku ?

To nie jest potwierdzenie rejestracji na stronie tylko potwierdzenie przeczytania maila.
W mailu jest link, na który osoba musi kliknąć, dzięki temu będę widział, że mail dotarł i został otwarty przez adresata.

Mechanizm nie musi być skomplikowany. Może być najprostszy, ale działający. Najtrudniejsze dla mnie, to porównanie przechwyconego maila z plikiem emaile.txt, aby sprawdzić, czy mail jest już na liście.

3

Linijka nr 3 w przedstawionym rozwiązaniu to wczytanie pliku i na jego podstawie utworzenie tablicy. Popatrz na komentarze.
Linijka 5 to sprawdzenie czy mail jest w tablicy utworzonej z pliku.

Tak w ogóle myślisz, że ludzie po przeczytaniu klikną w jakiś link w mailu? Ja np. bym tego nie zrobił. Tym bardziej jeśli maila otrzymałbym z niesprawdzonego źródła.

Edit.
Jak już do czegoś takiego służy nagłówek w mailu, gdzie z automatu jest wysyłana odpowiedź. Czasem niektóre korposzczury ustawiają to z automatu w jakimś Outlook u. Oczywiście taki klient poczty pyta o to czy wysłać takiego maila, ale to już lepsze niż klikanie w link.
Zobacz tutaj:
https://stackoverflow.com/questions/28609156/read-confirmation-with-phpmailer/51062558
Podłączasz się do skrzynki z jakiej wysyłasz i sobie odczytujesz maile z potwierdzeniem. Jak skrzynka obsługuje IMAP to jakiś losowy tutorial z netu:
https://www.techfry.com/php-tutorial/how-to-read-emails-using-php

0
armen100 napisał(a):

Mechanizm nie musi być skomplikowany. Może być najprostszy, ale działający. Najtrudniejsze dla mnie, to porównanie przechwyconego maila z plikiem emaile.txt, aby sprawdzić, czy mail jest już na liście.

No więc problem z plikiem email.txt, gdzie maile są wpisane "tak po prostu", np tak

[email protected]
[email protected]

etc.

Problem jest taki, że po prostu znajdując wystąpienie w stringu; narażasz się na to że ktoś z mailem [email protected], zostanie znaleziony, bo w pliku jest ktoś z e-mailem [email protected]. Jeden mail zawiera się w drugim.

Można by to obejść, gdybyś sprawdzał same tylko linijki, tylko wtedy musisz otworzyć plik do iteracji, oraz lecieć tylko po linijkach, a nie chunkach, i to będzie też zależeć od końcówek linii \r lub \r\n. No albo użył wyrażeń regularnych z ^ oraz $, tylko to ma tą wadę że musiałbyś wtedy encodować znak "@".

Rozwiązanie z email.txt jest niepraktyczne. Dużo lepszym rozwiązaniem jest trzymanie tego w JSON w pliku email.json. Zaletą email.txt jest TYLKO i wyłącznie to, że możesz dodać do niego wartości otwierając go w trybie ammend, ale to i tak mała zaleta bo musisz go otworzyć całego w trybie read, żeby go nim całym przelecieć.

1

@TomRiddle: Działa super!!! Dziękuję Ci bardzo.

0

@TomRiddle: A mógł jeszcze poprosić o sugestię odnośnie wysłania maila zwrotnego...
Załóżmy, że ktoś już kliknął w link w mailu i został dopisany do pliku "emails.json". Jak wysłać wiadomość mailem do zwroty@cośtam.pl używając serwera pocztowego google ?
Tu nasuwa się jeszcze jedna rzecz, jak zabezpieczyć, aby taki mail zwrotny został wysłany tylko raz...

0
armen100 napisał(a):

@TomRiddle: Działa super!!! Dziękuję Ci bardzo.

Ale ja nadal mogę się zweryfikować jako [email protected]? ;)

0

@TomRiddle: Nie już nie. Weryfikacja tylko raz i wysłanie maila. Wejście drugi raz w link zwraca "Mail jest już potwierdzony." i nic się nie dzieje. Skrypt ma dać exit.

0
armen100 napisał(a):

Załóżmy, że ktoś już kliknął w link w mailu i został dopisany do pliku "emails.json". Jak wysłać wiadomość mailem do zwroty@cośtam.pl używając serwera pocztowego google ?

No więc, po prostu musisz wysłać mail. Sugerowałbym Ci stworzyć po prostu nowy plik sendMail.php, i tam sobie to przetestować, a dopiero potem dodać to do Twojego całościowego skryptu.

Co do podpięcia servera pocztowego, to możesz albo użyć integracji z serverem pocztowym, np przez HTTP, jest np biblioteka SwiftMailer, albo mozesz skonfigurować swój server PHP, tak żebyś mógł wysyłać maile funkcją mail().

Tu nasuwa się jeszcze jedna rzecz, jak zabezpieczyć, aby taki mail zwrotny został wysłany tylko raz...

No jeśli zapisujesz je do pliku, to wiesz czy na dany adres poszedł mail czy nie.

0

@TomRiddle: Ok, niezły programista z Ciebie...

0
armen100 napisał(a):

@TomRiddle: Nie już nie. Weryfikacja tylko raz i wysłanie maila. Wejście drugi raz w link zwraca "Mail jest już potwierdzony." i nic się nie dzieje. Skrypt ma dać exit.

Jak, to :D

Wystarczy że się zarejestruję na mail [email protected], Ty wyślesz do niego maila, a potem ja wejdę na adres http://example.pl/[email protected], mimo że ani on ani ja żadnego maila nie otworzyliśmy.

0

@TomRiddle: Nie mogę sobie z tym poradzić dłubie już parę godzin... Aby wysłać maila muszę podpiąć najpierw własny serwer pocztowy (zewnętrzny).
Zamysł jest prostu w teorii...

if (isset($_GET['id'])) {
    $email= $_GET['id'];
    $confirmedEmails = json_decode(file_get_contents('emails.json'), true);  // wczytaj json z pliku
//    var_dump($confirmedEmails); // wywal jak wrzucisz na server
    if (in_array($email, $confirmedEmails['emails'])) {
        echo "<b>Twoje potwierdzenie zostało już zarejestrowane.</b>";
    }
    else {
       array_push($confirmedEmails['emails'], $email);  // dodaj email do arraya
       file_put_contents('emails.json', json_encode($confirmedEmails));  // zapisz JSON do pliku
       echo "<b>Dziękujemy za potwierdzenie wiadomości.</b><br>";

Tu chlałbym wysyłać wiadomość zwrotną na dany adres email.

     }
} else {
     echo 'Brak maila';
}

1

Mówiłem Ci już w wiadomości wcześniej. Najpierw napisz samo wysyłanie maila, tylko wysyłanie, w osobnym pliku, sendMail.php, i tam sobie to przetrenuj.

Dopiero potem dołącz to do całej aplikacji.

Co do samej implementacji, próbowałeś korzystać z biblioteki, np PhpMailer? Polecam również wpisać w google "php send gmail mail". Ja to wpisałem w google, i tu jest pierwszy link: https://netcorecloud.com/tutorials/send-an-email-via-gmail-smtp-server-using-php/

0

@TomRiddle: Dzięki, ja dopiero zaczynam więc dlatego tyle pytań...

1
armen100 napisał(a):

@TomRiddle: Dzięki, ja dopiero zaczynam więc dlatego tyle pytań...

No to rady na początek:

PS: Używasz PHP lokalnie na swoim komputerze, prawda? Nie testujesz tego na prawdziwym serverze?

1 użytkowników online, w tym zalogowanych: 0, gości: 1