2013-05-16 2 views
1

Это весь код, связанный с разделом, о котором я прошу (см. Сокращенное более подробное описание пункта ниже этого).Как я могу запустить функцию PHP mail() без загрузки пользователем страницы/.php-файла?

if($register == "true") //Registration "checks out" okay 
     { 
     $gooddata['password'] = md5($gooddata['password']); 
//This is where the information is saved to the database. 
      $query = "INSERT INTO member (username,password,votingdistrict,email,birthmonth,birthyear,city,state,zip5,registeredtovote) 
         VALUES ('$gooddata[username]','$gooddata[password]','$gooddata[votingdistrict]','$gooddata[email]','$gooddata[birthmonth]','$gooddata[birthyear]','$gooddata[city]','$gooddata[state]','$gooddata[zip5]','$gooddata[registeredtovote]')"; 

     $result = mysqli_query(dbcxn('member'),$query) 
       or die("<h3 class=\"headertag\">Username or E-mail already exists. <a href=\"./register.php\">Try a different username</a> or <a href=\"./resetpassword.php\">reset your password</a></h3>\n</header>"); 
     if($result) 
      { 
      $query = "SELECT vernumber FROM member WHERE username='$gooddata[username]'"; 

      $result = mysqli_query(dbcxn('member'),$query) 
       or die("Could not find a verification number!"); 
       if($result) 
        { 
        $preextract = mysqli_fetch_assoc($result); 
        extract($preextract); 
        $email = $gooddata['email']; 
        $subject = "Confirmation of Unipartisan registration for " . $gooddata['username']; 
        $message = wordwrap("Please click <a href=\"\">this link<a> to complete your registration.<br /> \n" . 
           "If you did not try to register with <a href=\"http://unipartisan.com\">Unipartisan.com</a> please disregard this e-mail or click here.",70); 
        $mailsent = mail($email,$subject,$message); 
        if($mailsent == true) 
         { 
         echo "An e-mail has been sent to you to complete your registration</h3>\n"; 
         } 
        else 
         { 
          echo "The registration email failed to send</h3>\n"; 
         } 

        } 
      }   

     echo "</header>\n"; 
     echo "<article class=\"index\">\n"; 
     echo " <h3>Return to the <a href=\"./index.php\">homepage</a></h3>\n"; 
     echo "</article>\n";   
     } 

Мой вопрос, как я все еще могу отправить пользователю по электронной почте после того, как регистрация будет успешно завершен, но не делая это в том же .php файл, и без того, чтобы отправить этот файл .php пользователя ,

Причина, по которой я спрашиваю, заключается в том, что функция mail() занимает много времени для обработки, и страница не загружается в течение примерно 30 секунд. Однако письмо действительно отправляется успешно.

Ниже приведен конкретный раздел, о котором я говорю.

$email = $gooddata['email']; 
$subject = "Confirmation of Unipartisan registration for " . $gooddata['username']; 
$message = wordwrap("Please click <a href=\"\">this link<a> to complete your registration.<br /> \n" . 
"If you did not try to register with <a href=\"http://unipartisan.com\">Unipartisan.com</a> please disregard this e-mail or click here.",70); 
$mailsent = mail($email,$subject,$message); 
if($mailsent == true) 
    { 
    echo "An e-mail has been sent to you to complete your registration</h3>\n"; 
    } 

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

Как я могу сделать это одновременно с завершением регистрации?

Вот соответствующий раздел моего PHP.ini.

[mail function] 
; For Win32 only. 
; http://php.net/smtp 
;SMTP = localhost 
; http://php.net/smtp-port 
;smtp_port = 25 

; For Win32 only. 
; http://php.net/sendmail-from 
;sendmail_from = [email protected] 

; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). 
; http://php.net/sendmail-path 
sendmail_path = /usr/sbin/sendmail -t -i -f [email protected] 

; Force the addition of the specified parameters to be passed as extra parameters 
; to the sendmail binary. These parameters will always replace the value of 
; the 5th parameter to mail(), even in safe mode. 
;mail.force_extra_parameters = 
+2

«Функция mail() требует много времени для обработки, и страница не будет загружаться в течение примерно 30 секунд». Это странно. Он должен просто передать данные в MTA, мгновенно. – zerkms

+0

Эта вещь MTA, о которой вы говорите, может быть неправильной. Я использую sendmail в Linux Mint 13, и я установил свой почтовый путь PHP.ini в/usr/sbin/sendmail. Я добавлю свой PHP.ini к вопросу. –

+1

Я использую постфикс для ослов лет и не имел проблем. Гораздо проще настроить, чем sendmail (установить, и он просто работает). Возможно, было бы проще попробовать постфикс, если сможете. –

ответ

0

Если вам действительно нужно отделить это, вы могли бы:

  1. Создать новый столбец в таблице пользователя с именем «welcomeEmailSent». Установите это как bool, по умолчанию 0.
  2. Напишите сценарий с именем sendRegisterEmails.php. Этот скрипт должен подключиться к базе данных и получить все строки с приветствиемEmailSent = 0.
  3. Сценарий затем перебирает ваш материал mail() для каждого ожидающего пользователя, а также обновляет таблицу пользователя, чтобы отметить welcomeEmailSent = 1
  4. настроить задачу cron для запуска скрипта sendRegisterEmails.php.

Введите «crontab -e», а затем добавьте эту строку для запуска команды каждые 10 минут.

*/10 * * * * /usr/local/bin/php5 /path/to/sendRegisterEmails.php 

Убедитесь, что путь к вашему PHP правильный.

Я бы попытался решить, почему функция mail() занимает так много времени, но это было бы быстрым решением.

+0

Дело в том, что я ожидаю, что эта команда будет запущена, как только кто-то зарегистрируется. Если они были неудачными и должны ждать 10 минут, они могут полностью отказаться от сайта. Я не думаю, что cron - это решение, в котором я нуждаюсь. У моего доменного имени есть свои электронные письма, обрабатываемые Google. Это дает мне другие варианты? –

+0

Если его собственный сервер затем просто запускает работу по запуску каждую минуту. Если его на общем хостинге он обычно ограничивает минимум 10-минутными интервалами. Если у вас есть задержки MTA по какой-либо причине, и вам нужно вывести почтовый код из скрипта регистрации, то это единственный реальный способ сделать это ... Задача, выполняемая в фоновом режиме с небольшими интервалами. –

1

Я написал два файла в php, которые показывают, как это делается. Если нет необходимости в задержке или запустить файл с интервалами, просто используйте терминал.

<!--File Name: cmdlinetest.php 
This is the file that execute.php would run 
--> 
<?php 
/* 
In the Unix terminal I can write: 

php /pathtophpfile/cmdlinetest.php MyEmail MyEmail'sDomain EmailSubjectorOtherVariable 

1) Так что я называю программы, PHP, и говорю это, чтобы запустить cmdlinetest.php ...

2) Существует пространство, а затем я пишу электронную почту, я хочу .php-файл для обработки первой части моего письма: myemail

3) Затем пробел и вторую часть моего письма: google.com

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

4) Глобальная переменная командной строки $ argv передается в .php-файл.

$argv[0] == "/pathtophpfile/cmdlinetest.php"//this is pretty much useless, so ignore it! 
$argv[1] == "MyEmail"//no @ symbol. 
$argv[2] == "MyEmail'sDomain"//no @ symbol. 
$argv[3] == "EmailSubjectorOtherVariable" 

Что в основном происходит в том, что она проходит каждую строку, разделенных пробелом в команде терминала, что приходит ПОСЛЕ «PHP» в качестве значения массива, начиная с 0.

Для дальнейшего уточнения, если Я добавляю «EmailMessage» после «EmailSubjectorOtherVariable» и команда будет выглядеть следующим образом:

php /pathtophpfile/cmdlinetest.php MyEmail google.com EmailSubjectorOtherVariable EmailMessage 

программа вызывается с помощью команды: PHP

$ argv [0]: имя файла, так что php знает, что он работает, и он становится значением для $ argv [0] - это просто «побочный эффект», если вы ...

$ argv [ 1]: первая строка, разделенная пробелами после имени файла, которая является моей электронной почтой перед символом @.

$ argv [2]: Вторая строка, разделенная пробелами, которая является моей электронной почтой ПОСЛЕ символа @.

$ argv [3]: Имя пользователя для моего веб-сайта, которое я передаю в файл, я хотел бы сделать манипуляцию с базой данных или тему электронной почты, скажем так.

$ argv [4]: ​​Теперь, когда последняя строка, разделенная пробелом в команде терминала, является «EmailMessage» ... вы догадались; $ argv [4] == "EmailMessage"

ЕСЛИ ВЫ ВЫПОЛНИТЕ ЗНАЧЕНИЕ В КОМАНДЕ ЭТО БУДЕТ ПЕРЕРЫВ !!!!

[email protected] необходимо поместить в два ключа массива как «youremail» и «google.com» добавить символ @ в код php!

Это ошибка я для добавления @ в электронной почте:

PHP Parse error: syntax error, unexpected '@' in /opt/lampp/htdocs/unipartisan/cmdlinetest.php on line 26 

Теперь я эхо пройденного переменные для целей тестирования.

echo "E-mail part 1: " . $argv[1] . "\nE-mail part 2: " . $argv[2] . "\n";//Key 1 has email before the @. Key 2 has after the @. 

echo "Subject of e-mail(site's username): " . $argv[3] . "\n";//The username you want to test. (This can really be anything you want; username is an example) 

echo "Message of e-mail: " . $argv[4] . "\n"; //"EmailMessage" 

Вышеупомянутые эхо-сигналы предназначены только для проверки ваших выходов. Пользователь не увидит ничего из этого, когда он запущен в другом файле в функции exec()

Теперь, поскольку письмо раздвоено, нам нужно снова собрать его снова!

$wholeemail = $argv[1] . '@' . $argv[2]; 

echo $wholeemail . "\n"; 

Еще одно испытание для нас, людей, чтобы убедиться, что это правильно. Эхо будет отображаться, если вы запустите его с терминала.

Если он запущен в exec() в другом .php-файле, ваши пользователи его не увидят. Поэтому они служат только для тестирования при создании ЭТОГО ФАЙЛА!

Ниже я называю ключи $ argv в своей переменной, чтобы сделать этот взгляд менее запутанным для новых людей.

$subject = $argv[3];//Username or email subject 
$message = $argv[4];//"EmailMessage" 

mail($wholeemail,$subject,$message,"FROM: Unipartisan Registration");//"FROM: Who ever you are" 
exit(); 
?> 

Вот где cmdlinetest.php заканчивается.

Это где execute.php приходит.

<!--File Name: execute.php 
This is an example of the code you would enter in the 
php file being displayed to the user when you want to run an 
external script without showing it to the user. 
--> 

<!DOCTYPE html> 
<html> 
<body> 
<?php 
exec('php /YourPathTo/cmdlinetest.php EmailBeforeAt [email protected] YourEmailSubject YourMessage');//Abandon all hope ye who dare put an @ symbol here 
echo "Okay go check your e-mail and hope it comes."; 
?> 
</body> 
</html> 

Потому что я хороший парень, вот простой вариант cmdline.php без чрезмерного комментирования.

<!--File Name: cmdline.php--> 
<?php 
echo "E-mail part 1: " . $argv[1] . "\nE-mail part 2: " . $argv[2] . "\n";//Key 1 has email before the @. Key 2 has after the @. 
echo "Subject of e-mail(site's username): " . $argv[3] . "\n";//The username you want to test. (This can really be anything you want; username is an example) 
echo "Message of e-mail: " . $argv[4] . "\n"; //"EmailMessage" 

$wholeemail = $argv[1] . '@' . $argv[2]; 

echo $wholeemail . "\n"; //Another test for us humans to make sure it's right. The echos will show up if you run this from the terminal. 
//If it is ran in exec() in another .php file your users will not see it. So they only serve for testing while building THIS FILE! 

//Below I name the $argv keys in their own variable just to make this look less confusing for new people. 
$subject = $argv[3];//Username or email subject 
$message = $argv[4];//"EmailMessage" 

mail($wholeemail,$subject,$message,"FROM: Something");//"FROM: Who ever you are!" 
exit(); 
?> 
+0

Я думаю, что вы можете не раздваивать электронную почту, пока вы избегаете символа с помощью \. Поэтому, если у вас есть [email protected] Обязательно напишите youremail \ @ google.com. Если моя тема «Hello world» Write: Hello \ World. –

Смежные вопросы