This could be because e.login is NULL, when comparing NULL valuse as in your case as NOT IN it allways returns false (See documentation: operator NOT LIKE which applies to NOT IN too).
You can check this by using COALESCE() which:
Returns the first non-NULL value in the list, or NULL if there are no
non-NULL values.
So in your case:
SELECT e.*
FROM emails AS e
WHERE e.error <> 1
AND COALESCE(e.login,'') NOT IN (select email_login from accounts)
If this does not work try depending on how exact should be compared either the LIKE operator or the trimmed values to avoid differences because of leading or trailing spaces
With %LIKE%:
SELECT e.*
FROM emails AS e
WHERE e.error <> 1
AND NOT EXISTS (SELECT email_login
FROM accounts
WHERE email_login LIKE CONCAT('%', e.login ,'%'))
Notice that the % matches any number of characters, including zero characters
To match the exact login:
SELECT e.*
FROM emails AS e
WHERE e.error <> 1
AND NOT EXISTS (SELECT email_login
FROM accounts
WHERE UPPER(TRIM(email_login)) = UPPER(TRIM(e.login)))