2014-11-19 3 views
1

Я довольно новичок в создании сценариев сервера и заданий, которые сервер запускает каждый день.Сервер Linux: отправьте письмо моим пользователям

Моя проблема заключается в следующем:

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

Моя идея:

База данных -> собрать всех пользователей, которым необходимо быть уведомлен и вставить их в таблицу notify_user

Script -> найти всех пользователей и отправить им почту

Сценарий -> Удалить все из таблицы

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

Как я уже говорил ранее, я не очень увлекаюсь настройкой такого сценария.

Мой сервер - это сервер Ubuntu, а мое приложение - это PHP-программа.

Кто-нибудь знает, как я могу это достичь, или знаю, где я могу найти документацию по этому вопросу, так как я не смог найти что-либо, что решает эту проблему.

+2

Google для 'cron' /' crontab' –

ответ

1

Если вам известно, как заполнить таблицу «notify_user», то это мои шаги, чтобы воспроизвести образец решения для вас. Я сделал это на своем сервере VPS с запущенным демоном sendmail.

# mysql -u root -p 
Enter password: 
Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 167 
Server version: 5.5.40-0ubuntu0.14.04.1 (Ubuntu) 

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. 

Oracle is a registered trademark of Oracle Corporation and/or its 
affiliates. Other names may be trademarks of their respective 
owners. 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

mysql> create database stack_mail_db; 
Query OK, 1 row affec`enter code here`ted (0.05 sec) 
mysql> grant all privileges on stack_mail_db.* to 'stack_mail_usr'@'localhost' identified by 'stack_mail_pass'; 
Query OK, 0 rows affected (0.11 sec) 
mysql> use stack_mail_db; 
Database changed 
mysql> create table notify_user(id int not null auto_increment primary key, user_name tinytext, user_email tinytext); 
Query OK, 0 rows affected (0.28 sec) 

После создания этой базы данных примера мы должны заполнить его, по крайней мере 2 пользователей (для тестирования) с рабочими электронной почты. Я изменил здесь фактические письма, которые я использовал.

mysql> insert notify_user (user_name, user_email) values ('test1', '[email protected]'); 
Query OK, 1 row affected (0.18 sec) 

mysql> insert notify_user (user_name, user_email) values ('test2', '[email protected]'); 
Query OK, 1 row affected (0.03 sec) 

Теперь мы должны написать скрипт, который получает эти данные и посылает электронную почту:

# vim cron_email.php 
<?php 
$host = 'localhost'; 
$user = 'stack_mail_usr'; 
$pass = 'stack_mail_pass'; 
$dbname = 'stack_mail_db'; 

$conn = new mysqli($host, $user, $pass, $dbname); 

if ($conn->connect_error) { 
     trigger_error('DB connection failed: ' . $conn->connect_error, E_USER_ERROR); 
} 

$query = 'select * from notify_user'; 

$res = $conn->query($query); 

if ($res === false) { 
     trigger_error('Failed query: ' . $query . ' Error: ' . $conn->error, E_USER_ERROR); 
} 

$headers = 'From: [email protected]' . "\r\n" . 
     'Reply-To: [email protected]' . "\r\n" . 
     'X-Mailer: PHP/' . phpversion(); 
$res->data_seek(0); 
while ($row = $res->fetch_assoc()) { 
     $to = $row['user_email']; 
     $subject = 'Notification for ' . $row['user_name']; 
     $message = 'Hello ' . $row['user_name']; 
     $mail = mail($to, $subject, $message, $headers); 
     if ($mail) { 
       $conn->query('delete from notify_user where id=' . $row['id']); 
     } else { 
       echo "Email failed\n"; 
     } 
} 

Теперь пришло время, чтобы поместить этот скрипт на хронах:

# crontab -e 
0 0 * * * php -f /path/to/cron_email.php 

Это будет работать скрипт ровно каждую полночь. Если вы хотите установить более конкретный час, посмотрите на этом учебнике: http://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/

Надеется, что это помогает ^)

+1

Спасибо, что это было действительно полезно :)! –

+0

Мое удовольствие :) Я сделал небольшое исправление в разделе crontab. Если вы не используете «shebang» в вашем файле сценария, вы можете просто вызвать свой PHP-скрипт с помощью команды «php -f» – a1111exe

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