Plesk sigue teniendo algunos defectos , uno de ellos es que a veces se pierde la integridad referencial en algunas tablas como las tablas mail y accounts, que provoca el fallo de las cuentas de correo. Este fallo puede ser :
- The error that the other server returned was: 550 550 sorry, no mailbox here by that name. (#5.7.17)
- The error that the other server returned was: 451 451 qq internal bug (#4.3.0)
- O bien que al acceder a las propiedades de la cuenta de correo o intentar eliminar la cuenta, obtengamos este error en Plesk :
ERROR: PleskFatalException
Error: Can't create Account object: Account: unable to select: no such row in the table
0: common_func.php3:146
psaerror(string 'Error: Can't create Account object: Account: unable to select: no such row in the table')
1: client.domain.mail.mailname.php:86
plesk__client__domain__mail__mailname->accessItemOverview(string 'GET', NULL null)
2: client.domain.mail.mailname.php:160
__plesk__client__domain__mail__mailname->accessItem(string 'GET', NULL null)
3: UIPointer.php:596
UIPointer->access(string 'GET')
4: plesk.php:38
Pongamos el supuesto que en mi servidor tengo dos dominios uno que se llama hostingaldescubierto.com y otro senin.org y que la cuenta que falla con el error de antes es contacto@senin.org.
Vamos a lanzar esta consulta en la base de datos para localizar los registros huérfanos en la taba de mail con accounts.
select domains.name, mail.mail_name, accounts.id, accounts.password from domains, mail left join accounts on mail.account_id = accounts.id where domains.id = mail.dom_id and accounts.id IS null;
+--------------------------+-------------+------+----------+
| name | mail_name | id | password |
+--------------------------+-------------+------+----------+
| hostingaldescubierto.com | basura | NULL | NULL |
| senin.org | contacto | NULL | NULL |
+--------------------------+-------------+------+----------+
2 rows in set (0.01 sec)
Ahora podemos hacer dos cosas o bien borrar la cuenta de correo de la tabla mail o bien insertar una entrada en la tabla accounts. El único problema que puede haber si borramos la entrada en la tabla mail, es que si volvemos a crear la cuenta de correo podría ser que plesk eliminase el buzón con el contenido y lo crease de nuevo, pero no estoy totalmente seguro de esto o si ocurriría en todas las versiones. Yo opto por insertar los registros que falten.
Podríamos proceder generando los valores a insertar en la tabla accounts, y generando unas passwords aleatorias :
select mail.account_id, 'plain', SUBSTRING(MD5(RAND()) FROM 1 FOR
from domains, mail left join accounts on mail.account_id = accounts.id where domains.id = mail.dom_id and accounts.id IS null;
Nos devuelve :
+------------+------+-------------------------------------+
| account_id | text | SUBSTRING(MD5(RAND()) FROM 1 FOR
|
+------------+------+-------------------------------------+
| 1550 | text | 764dd7d1 |
| 2310 | text | cdc15fc4 |
+------------+------+-------------------------------------+
Con lo que montamos la sentencia INSERT y quedaría así:
INSERT INTO accounts select mail.account_id, 'plain', SUBSTRING(MD5(RAND()) FROM 1 FOR
from domains, mail left join accounts on mail.account_id = accounts.id where domains.id = mail.dom_id and accounts.id IS null;
Query OK, 2 rows affected (0.04 sec)
Records: 2 Duplicates: 0 Warnings: 0
y ahora verificamos que haya quedado corregido con la primera consulta:
select domains.name, mail.mail_name, accounts.id, accounts.password from domains, mail left join accounts on mail.account_id = accounts.id where domains.id = mail.dom_id and accounts.id IS null;
Empty set (0.01 sec)
Y así tenemos corregido el problema con tan solo copiar y pegar.