Y porque creas la cuenta antes de validarla?
Simplemente no crees la cuenta hasta que pinchen en el link del correo.
Verifica también si la cuenta ya existe para que un usuario no se haga varias cuentas sin querer a base de F5.
Yo personalmente lo haría así:
-Crear un script "cuentas/registrar.php" que otorgue una cookie al usuario y cree dinámicamente dos nuevos archivos:
1) "temporal/cuenta-123456789.php" cuando se complete correctamente el registro.
Y
2) "automatizacion/borrar_link_cuenta-123456789.php".
-Dentro de "temporal/cuenta-123456789.php" estará el nombre de la cuenta y una función para crear la cuenta. En la función tomaría como parámetro la cookie para que solo el cliente que rellenó el usuario pueda activar la cuenta.(esto es opcional, también puedes darle un código de activación único).
-Al correo del usuario se envía:
Bienvenido a example.com, para finalizar el registro ingrese a
https://example.com/temporal/cuenta-123456789.phpTras visitar el enlace su cuenta será creada. Será redirigido automáticamente al portal de ingreso. Para acceder ingrese con el usuario y la contraseña que facilitó en el registro.
-Desde "temporal/cuenta-123456789.php" arrancas el script "automatizacion/borrar_link_cuenta-123456789.php" este script se ejecuta hasta pasados 10 minutos desde el envio del correo al usuario y borra el archivo "temporal/cuenta-123456789.php" pasado ese tiempo. O si se activó la cuenta también lo borras. En caso de que la cuenta se active mediante el link pero el usuario no haga login en la cuenta, yo borraría la cuenta porque es sospechoso que se active la cuenta pero el usuario no haga login.
Puedes habilitar un "Renviar Correo" donde se vuelva a crear un archivo "temporal/cuenta-1737281928.php" tras completar un captcha.
-Para el nombre de archivo "temporal/cuenta-123456789.php" generas el número 123456789 con un algoritmo de (PRNG) Pseudo Random Number Generator con entropía por hardware. Puedes usar alguna función, librería o puedes crearlo tu mismo con pocas líneas con un contador, un timer, un for y una operación matemática como podría ser una multiplicación al resultado para expandirlo y que un cambio mínimo en el resultado genere un resultado muy diverso. Te recomiendo codificar el resultado en base64 varias veces para evitar ataques de fuerza bruta devido a poco tamaño de url, de forma que te quede algo como:
"temporal/cuenta-Vm0wd2VFMUdiRmRpUm1SWFYwZG9WbGx0ZUV0WFJteDBaRWhrVmxKc2NIcFdNakZIVjBaS2MyTkliRmRpVkZaeVZtMTRTMlJXUm5OaVJsWlhZbFpKZWxaclpEUldNVnBXVFZWV2FHVnFRVGs9.php" en vez de temporal/cuenta-123456789.php" un hash sería más seguro, pero si el PRNG es largo y seguro, no tienes problemas en usar base64.
Habrá varias librerías y frameworks que te hagan todo esto automáticamente.
De todas formas es bastante sencillo y rápido de implementar uno mismo.