Как отправить бэкап дампа базы mysql по почте

Понадобился на днях скрипт, делающий слепок базы данных сайта, и отправляющий его по почте. Готовые рабочие варианты искать было некогда :-)

Системные требования:

  • linux
  • php
  • mysql с установленной утилитой mysqldump
  • sendmail, доступный из php
  • gzip (можно и без него, тогда убрать из файла строки «| gzip» и «.gz»)
В целях минимизации, сторонние библиотеки для работы с почтой и вложениями решил не использовать, всё сурово.
Сначала сделаем бекап, и сожмём его

$dump = `mysqldump --add-locks -u <username> -p<password> <database> | gzip`;
(замените <username>, <password>, и <database> на свои)

Обратные кавычки « в php — синоним функции shell_exec()
Теперь, сформируем заголовок письма с вложением

$header = 'From: Server Robot <robot@server.ru>\r\n'.
.'MIME-Version: 1.0\r\n'.
'Content-type: multipart/mixed; boundary=sqldump0001";

И само сообщение, включающее в себя строку «This is a database backup» и файл.
Сжатый gzip-ом дамп кодируется функцией base64 и разбивается на строки одинаковой длины.
Стандарты e-mail не позволяют отправлять файлы больше 25 Мб., поэтому, если база очень большая, этот скрипт надо дописывать.
В моём же случае сжатый архив не превышал 50 килобайт.

$message = "--sqldump0001\r\n".
."Content-Type: text/plain; charset=ISO-8859-1\r\n\r\n".
."This is a database backup\r\n\r\n".
."--sqldump0001\r\n".
."Content-Type: application/octet-stream; name=\"dreamrace.sql\"\r\n".
."Content-Disposition:attachment; filename=\"dreamrace.sql\"\r\n".
."Content-Transfer-Encoding:base64\r\n\r\n";
$message.= chunk_split(base64_encode($dump));

и, наконец, отправим всё по почте:

mail("<your_email>", "Server Database Backup", $message, $header );

Готовый скрипт(скачать целиком его можно тут: http://shattl.org/files/mysqlbackup.zip ) помещается в папку /etc/cron.daily и выставляются права на запуск.

Всё готово!