py3-validate-email/FAQ.md

72 lines
3.1 KiB
Markdown

# FAQ:
## The module provides false positives:
The function of this module, and specifically of the SMTP check, relies
on the assumption that the mail server declared responsible for an email
domain will immediately reject any nonexistent address.
Some SMTP servers (Yahoo's servers for example) are only rejecting
nonexistent emails after the end of `DATA` command has been provided in
the conversation with the server. This module only goes until the
`RCPT TO` and says it's valid if it doesn't get rejected there, since
the `DATA` part of the email is the email body itself.
Other SMTP servers accept emails even for nonexistent recipient
addresses and forward them to a different server which will create a
bounce message in a second step. This is the case for many email domains
hosted at Microsoft.
In both cases, there's nothing we can do about it, as the mail server
we talk to seemingly accepts the email address.
## Everything gets rejected:
Check if you have port 25 access from your IP to the accepting server's
IP. Even if you do, the server might use RBL's (spamhaus.org lists, for
example), and your IP might get rejected because of being listed in one
of the used lists by the email server. Your best bet is to use this
module on another server that delivers emails, thus eliminating the
chance of being blacklisted.
## I can't check thousands of emails!
This module is a tool; every tool can become a weapon if not used
properly. In my case, I use this module to check email address validity
at registration time, so not thousands at once. Doing so might make you
(your IP) end up in one of the aforementioned blocklists, as providers
will detect you as a possible spammer. In short, I would advise against
your use case.
## My email doesn't check out!
Run this code with the module installed (use your parameters within),
and see the output:
```python
python -c 'import logging, sys; logging.basicConfig(stream=sys.stderr, level=logging.DEBUG); from validate_email import validate_email; print(validate_email(\'your.email@address.com\', smtp_debug=True))'
```
If you still don't understand why your code doesn't work as expected by
looking at the the logs, then (and only then) add an issue explaining
your problem with a REPRODUCIBLE example, and the output of your test
run.
## How can I pass my email account's credentials? How can I use port 465 or 587 when my provider blocks port 25?
The credentials you got from your email provider, as well as the
instruction to use port 465 or 587, refer to *your provider's* server
for *outgoing* emails.
This module, however, directly talks to the *recipient's* server for
*incoming* emails, so neither your credentials nor the switch to port
465 or 587 is of any use here.
If your internet connection is within an IP pool (often the case for
private use) or it doesn't have a proper reverse DNS entry, the servers
for many email domains (depending on their configuration) will reject
connections from you. This can *not* be solved by using your provider's
mail server. Instead, you have to use the library on a machine with an
internet connection with static IP address and a proper reverse DNS
entry.