Как написать PHP форму двойной подписки - PullRequest
4 голосов
/ 09 октября 2011

Я пытаюсь написать небольшой скрипт PHP для управления подписками на список рассылки. Я пытался найти все ресурсы, которые смогу найти в интернете, но я только придумал:

  1. Очень простые PHP-скрипты с одним или несколькими поддельными функциями "opt-in".
  2. Очень сложные PHP-проекты с несколькими МБ, такие как PHPList (7,8 МБ!)

При "поддельной" двойной подписке я вызываю методы, которые либо помещают адрес электронной почты в качестве строки проверки, либо те, которые используют куки в браузере.

Все, чего я хотел бы достичь:

  1. Кто-то может написать свой адрес электронной почты в форме PHP и нажать «Отправить»
  2. Он получает электронное письмо с URL-адресом, по которому ему нужно нажать. Ссылка должна содержать не адрес электронной почты, а некоторую md5 или случайную строку
  3. После нажатия на URL он попадает на страницу, на которой отображается сообщение «подтверждено по электронной почте»

На стороне сервера адреса могут быть сохранены в текстовом файле в защищенной папке или, если вы считаете, что очень важно сохранить их в базе данных, а затем в базе данных.

Пока мои вопросы:

  1. Может ли кто-нибудь подсказать мне какое-нибудь руководство или рецензию о том, как написать такой скрипт
  2. Должен ли я использовать базу данных или простой файл . Все, что мне нужно, это вставить простые строки новых писем с возможностью проверки на наличие дубликатов.
  3. Как сохранить временные идентификаторы для системы двойного согласия. Я думал о том, чтобы использовать что-то вроде md5 ("email" . "passphrase") для генерации идентификаторов и хранить их рядом с адресами электронной почты.

Ответы [ 2 ]

4 голосов
/ 18 октября 2011

Просто для забавы, вот довольно глубокий пример. Должно быть легко понять, что там происходит и почему.

Предупреждение: код не был протестирован, поэтому возможны синтаксис и другие ошибки.

<?php

// Salt for hashing confirmation keys
$salt = 'yoursecretstring12#11;.-_.21';

$url = 'http://www.yoursite.tld/thisscript.php';
$fromEmail = 'you@yoursite.tld';

$dbHost = 'localhost';
$dbUser = 'dbuser';
$dbPass = 'dbpass';
$dbDatabase = 'dbname';

mysql_connect($dbHost, $dbUser, $dbPass);
mysql_select_db($dbDatabase);

$ip = $_SERVER["REMOTE_ADDR"];

if ( isset( $_GET['key'] ) && isset( $_GET['email'] ) ) {

  // If we have 'email' and 'key' parameters, we are handling an opt-in click

  $email = mysql_real_escape_string( $_GET['email'] );

  // Check if key matches hash of email and salt combination and if email is really an email

  if ( sha1( $email.$salt ) == $_GET['key'] && filter_var($email, FILTER_VALIDATE_EMAIL) ) {

    // Check if entry already exists

    $checkDupes = mysql_query( "SELECT COUNT(*) as cnt FROM emails WHERE email = '$email'"; ); 
    $result = mysql_fetch_assoc($checkDupes);

    if ($result['cnt'] < 1) {

      // Fresh email, insert into db along with remote ip and timestamp

      mysql_query( "INSERT INTO emails (email, ip, timestamp) VALUES ( '$email', $ip, NOW() );" );
      die('Subscription confirmed!');

    } else {

      die('Email already exists in database');

    }

  } else {

    die('Key mismatch or invalid email!');  

  } 

} else if ( isset( $_POST['email'] ) && filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) ) {

  // Form submission, send confirmation email    

  $email = $_POST['email'];
  $key = sha1( $email.$salt );

  $link = $url . '?email=' . $email . '&key=' . $key;

  $mailSubject = 'Please confirm your subscription';
  $mailTo = $email;
  $mailBody = 'Please confirm your subscription by clicking <a href="$link">this link</a>'; 
  $headers = 'From: ' . $fromEmail . "\r\n";

  mail( $mailTo, $mailSubject, $mailBody );

} else {

  // Present form and show error if needed

  if ( isset( $_POST['email'] ) ) {
    echo "Ivalid email submitted!<br />";
  } 

  echo '
  <form method="post" action="'.$url.'">
    Email: <input type="text" name="email" /><br />
    <input type="submit" value="Submit" />
  </form>
  ';

}
1 голос
/ 09 октября 2011

Я бы порекомендовал создать случайную строку, используя md5(rand()), и сохранить ее в базе данных. Затем создайте ссылку для пользователя и отправьте его по электронной почте. Эта ссылка должна содержать случайную строку в переменной GET, и при загрузке страницы подтверждения вы можете сравнить ее с базой данных.

Если строка неправильная, ничего не делать и вывести ошибку. Если это правильно, удалите строку из таблицы и добавьте ее в другую таблицу, в которой есть подтвержденные электронные письма (или, если поле электронной почты подтверждено, измените его на TRUE).

У вас также должен быть аналогичный метод, позволяющий пользователю отписаться от рассылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...