¿NOT IN? eso está algo volado, mira esto.
Primero, debes saber que un select de cierta manera es un bucle ya que trae todos los registros de una consulta, hace lectura secuencial para armar la visualización final.
Segundo, si lo que quieres es ingresar el mail desde "hm" a "indice" lo debes hacer de esta forma:
Dices que vas a ingresar el que estás ingresando, entonces, si hm tiene el código o llave única para hacer la consulta, debes hacer un select con "where", por si no lo sabes es muy, pero muy importante esta palabra, apuntala, que no se te olvide, porque te acompañará por siempre.
Ahora, si no quieres que el correo se repita, bueno, vamos a tener que bajar el "performance" de la base de datos haciendo una triple instrucción como lo dice "polx - peru", donde vendría a ser de la forma:
insert into indice (nombre, mail) select nombre, mail from hm where hm.id = XXXX and mail not in (select mail from indice)
Eso creo que te agrega calidad en tu programa, pero le quita rendimiento a la BD, imaginen esto en una BD de al menos 500000 registros.