Montando um servidor de e-mail completo com Postfix
Este tutorial aborda a criação de um servidor de e-mail baseado em banco de dados MySQL, com suporte a cota de usuários, antispam, antivírus, webmail e tudo mais o que se pode imaginar.
Parte 20: Migrando a database antiga
Se você montou seu ambiente utilizando o antigo tutorial, você
terá notado que eu mudei o nome da tabela e dos seus campos.
Essas alterações foram necessárias devido a necessidade de
adequação ao PostfixAdmin.
Você pode tomar dois caminhos:
Caso tenha optado pela segunda opção, vou explicar como fazer essa manobra com "pouco" trauma.
OBS: Esse solução que fiz talvez não seja a mais elegante, mas pelo menos funcionou. Prova de que os fins justificam os meios :-)
Preparando o arquivo:
Crie um backup da antiga tabela no diretório /root/tmp/:
# mysqldump -B mail --tables virtual_users -psenha > /root/tmp/backup_mail.cf
Edite o arquivo gerado, com o editor VI (Se você não conhece o VI, acho uma boa hora para aprender) e apague as linhas parecidas com:
Você pode tomar dois caminhos:
- Adequar o PostfixAdmin ao seu ambiente e suas tabelas do MySQL.
- Migrar o conteúdo do banco para as novas tabelas do PostfixAdmin.
Caso tenha optado pela segunda opção, vou explicar como fazer essa manobra com "pouco" trauma.
OBS: Esse solução que fiz talvez não seja a mais elegante, mas pelo menos funcionou. Prova de que os fins justificam os meios :-)
Preparando o arquivo:
Crie um backup da antiga tabela no diretório /root/tmp/:
# mysqldump -B mail --tables virtual_users -psenha > /root/tmp/backup_mail.cf
Edite o arquivo gerado, com o editor VI (Se você não conhece o VI, acho uma boa hora para aprender) e apague as linhas parecidas com:
# MySQL dump 8.16
#
# Host: localhost Database: mail
#--------------------------------------------------------
# Server version 3.23.46-log
#
# Table structure for table 'virtual_users'
#
CREATE TABLE virtual_users (
unique_id int(32) unsigned NOT NULL auto_increment,
id char(128) NOT NULL default '',
password char(128) default NULL,
uid int(10) unsigned default '502',
gid int(10) unsigned default '503',
home char(255) default NULL,
maildir char(255) default NULL,
date_add date default NULL,
time_add time default NULL,
domain char(128) default NULL,
nome char(255) default NULL,
imapok tinyint(3) unsigned default '1',
disk_usage int(10) unsigned default NULL,
quota char(128) default '10000000S',
htaccess tinyint(4) default '0',
PRIMARY KEY (id),
KEY unique_id (unique_id)
) TYPE=MyISAM;
#
# Dumping data for table 'virtual_users'
#
========================================
# Deixe só os dados da tabela. Exemplo:
INSERT INTO virtual_users VALUES (494, 'sandra.hirose@seu_dominio.com.br', 'ad6UWax8vrpqg', 108, 108, '/home/', 'seu_dominio.com.br/sandra.hirose/Maildir/', '2002-11-28', '03:09:58', 'seu_dominio.com.br', 'SANDRA ETSUKO HIROSE',1,0, '10000000S', 0);
#
# Host: localhost Database: mail
#--------------------------------------------------------
# Server version 3.23.46-log
#
# Table structure for table 'virtual_users'
#
CREATE TABLE virtual_users (
unique_id int(32) unsigned NOT NULL auto_increment,
id char(128) NOT NULL default '',
password char(128) default NULL,
uid int(10) unsigned default '502',
gid int(10) unsigned default '503',
home char(255) default NULL,
maildir char(255) default NULL,
date_add date default NULL,
time_add time default NULL,
domain char(128) default NULL,
nome char(255) default NULL,
imapok tinyint(3) unsigned default '1',
disk_usage int(10) unsigned default NULL,
quota char(128) default '10000000S',
htaccess tinyint(4) default '0',
PRIMARY KEY (id),
KEY unique_id (unique_id)
) TYPE=MyISAM;
#
# Dumping data for table 'virtual_users'
#
========================================
# Deixe só os dados da tabela. Exemplo:
INSERT INTO virtual_users VALUES (494, 'sandra.hirose@seu_dominio.com.br', 'ad6UWax8vrpqg', 108, 108, '/home/', 'seu_dominio.com.br/sandra.hirose/Maildir/', '2002-11-28', '03:09:58', 'seu_dominio.com.br', 'SANDRA ETSUKO HIROSE',1,0, '10000000S', 0);
ATENÇÃO: Retire todas as linhas vazias do COMEÇO e do FINAL do arquivo.
Com o VI aberto, no modo de comando (sinal de dois-pontos), execute o seguinte comando:
:%s/INSERT INTO virtual_users VALUES (//g
:%s/);//g
Com isso você vai deixar a linha parecida com isso:
494, 'sandra.hirose@seu_dominio.com.br', 'ad6UWax8vrpqg', 108, 108, '/home/', 'seu_dominio.com.br/sandra.hirose/Maildir/', '2002-11-28', '03:09:58', 'seu_dominio.com.br', 'SANDRA ETSUKO HIROSE', 1, 0, '10000000S', 0
Agora crie o script em PHP com o seguinte conteúdo (add_mysql.php):
#!/usr/bin/php -q
<?
// Variáveis de acesso ao MySQL
$host = "localhost";
$user = "root";
$senha = "senha";
$name_db = "postfix";
//Arquivo com o backup do antiga tabela "virtual_users"
$file_bak = "/root/tmp/backup_mail.cf";
//=============
//INICIO
//=============
$conexao = mysql_connect($host,$user,$senha); mysql_select_db("$name_db", $conexao);
// Corta o arquivo
$f=file("$file_bak");
for($i=0;$i<count($f);$i++) {
list($id, $username, $password, $uid, $gid, $home, $maildir, $date, $time, $domain, $name, $active, $disk_usage, $quota, $htaccess)=explode(", ", $f[$i]);
$insert = "INSERT INTO mailbox (username, password, name, home, maildir, quota, domain, create_date, active, uid, gid, disk_usage, htaccess) VALUES ($username, $password, $name, $home, $maildir, $quota, $domain, $date, $active, $uid, $gid, $disk_usage, $htaccess)";
mysql_query($insert,$conexao);
echo "\n";
echo "Usuário $username cadastrado com sucesso!!! \n";
}
?>
<?
// Variáveis de acesso ao MySQL
$host = "localhost";
$user = "root";
$senha = "senha";
$name_db = "postfix";
//Arquivo com o backup do antiga tabela "virtual_users"
$file_bak = "/root/tmp/backup_mail.cf";
//=============
//INICIO
//=============
$conexao = mysql_connect($host,$user,$senha); mysql_select_db("$name_db", $conexao);
// Corta o arquivo
$f=file("$file_bak");
for($i=0;$i<count($f);$i++) {
list($id, $username, $password, $uid, $gid, $home, $maildir, $date, $time, $domain, $name, $active, $disk_usage, $quota, $htaccess)=explode(", ", $f[$i]);
$insert = "INSERT INTO mailbox (username, password, name, home, maildir, quota, domain, create_date, active, uid, gid, disk_usage, htaccess) VALUES ($username, $password, $name, $home, $maildir, $quota, $domain, $date, $active, $uid, $gid, $disk_usage, $htaccess)";
mysql_query($insert,$conexao);
echo "\n";
echo "Usuário $username cadastrado com sucesso!!! \n";
}
?>
Edite as seguintes variáveis conforme a sua configuração:
$host = "localhost";
$user = "root";
$senha = "senha";
$name_db = "postfix";
$user = "root";
$senha = "senha";
$name_db = "postfix";
Cruze os dedos e execute o script :-)
# chmod +x add_mysql.php
# ./add_mysql.php
Teste se foi tudo ok...
# mysql -D postfix -u root -psenha -e "select * from mailbox;"
Se ocorreu tudo certo, vai aparecer um monte de coisa na tela. Agora, temos de terminar o serviço. Para a migração ser perfeita, temos que corrigir mais 3 campos da tabela, são eles:
- QUOTA
- UID
- GID
Os valores do campos UID e GUI devem ser o mesmo do usuário MAILDROP.
Conecte-se no MySQL e execute:
# mysql -D postfix -u root -psenha
mysql> select quota from mailbox where username='marco.maximo@dominio1.com.br';
+------------+ | quota | +------------+ | 30000000 | +------------+
Alterando a COTA:
mysql> update mailbox set quota=concat(quota, 'S');
mysql> select quota from mailbox where username='marco.maximo@dominio1.com.br';
+-------------+ | quota | +-------------+ | 30000000S | +-------------+
mysql> select uid,gid from mailbox where username='marco.maximo@dominio1.com.br';
+------+------+ | uid | gid | +------+------+ | 502 | 503 | +------+------+
Alterando o UID e GID:
mysql> update mailbox set uid=108,gid=108 where uid=502 and gid=503;
mysql> select uid,gid from mailbox where username='marco.maximo@dominio1.com.br';
+------+------+ | uid | gid | +------+------+ | 108 | 108 | +------+------+
Beleza, banco migrado com sucesso. Espero :-)