gen-smtp / gen_smtp

The extensible Erlang SMTP client and server library.
Other
684 stars 265 forks source link

Non meaningful error when password is incorrect #96

Open stevedomin opened 8 years ago

stevedomin commented 8 years ago

While attempting to send through my Sendgrid account I got stuck on this error for ages. Basically my password had some special characters and I guess I needed to do some escaping, unfortunately the error reported wasn't helpful at all.

I'm wondering if these anything we can do to show a more meaningful error to the user. I'm more than happy to contribute, but I'll need some guidance.

I had to uncomment some logging to figure out the issue (see logs below).

(This is elixir, not erlang, sorry about that)

iex(1)> :gen_smtp_client.send_blocking({"from", ["to"], "Subject: testing\r\nFrom: Andrew Thompson \r\nTo: Some Dude \r\n\r\nThis is the email body"}, [relay: "smtp.sendgrid.net", username: "username", password: "passwordwithspecialcharacter", auth: :always, tls: :always])
connected to smtp.sendgrid.net; banner was  SG ESMTP service ready at x.sendgrid.net

Extensions are [{<<"8BITMIME">>,true},
                {<<"PIPELINING">>,true},
                {<<"SIZE">>,<<"31457280">>},
                {<<"STARTTLS">>,true},
                {<<"AUTH">>,<<"PLAIN LOGIN">>},
                {<<"AUTH=PLAIN">>,<<"LOGIN">>}]
Extensions are [{<<"8BITMIME">>,true},
                {<<"PIPELINING">>,true},
                {<<"SIZE">>,<<"31457280">>},
                {<<"STARTTLS">>,true},
                {<<"AUTH">>,<<"PLAIN LOGIN">>},
                {<<"AUTH=PLAIN">>,<<"LOGIN">>}]
username prompt
password prompt
password rejected: 535 Authentication failed: Bad username / password
** (ArgumentError) argument error
               :erlang.++("username", [0 | "passwordwithspecialcharacter"])
    (gen_smtp) src/gen_smtp_client.erl:400: :gen_smtp_client.do_AUTH_each/4
    (gen_smtp) src/gen_smtp_client.erl:322: :gen_smtp_client.try_AUTH/3
    (gen_smtp) src/gen_smtp_client.erl:203: :gen_smtp_client.do_smtp_session/3
    (gen_smtp) src/gen_smtp_client.erl:142: :gen_smtp_client.try_smtp_sessions/4
Vagabond commented 8 years ago

Can you say what the special character is?

You could try something like this:

AuthString = base64:encode(io_lib:format("\0~s\0~s", [Username, Password])),
Vagabond commented 8 years ago

To replace this line:

https://github.com/Vagabond/gen_smtp/blob/master/src/gen_smtp_client.erl#L404

I mean

stevedomin commented 8 years ago

I'm getting the following error:

** (ArithmeticError) bad argument in arithmetic expression
      (stdlib) base64.erl:81: :base64.encode_l/1
      (stdlib) base64.erl:67: :base64.encode/1
    (gen_smtp) src/gen_smtp_client.erl:400: :gen_smtp_client.do_AUTH_each/4
    (gen_smtp) src/gen_smtp_client.erl:322: :gen_smtp_client.try_AUTH/3
    (gen_smtp) src/gen_smtp_client.erl:203: :gen_smtp_client.do_smtp_session/3
    (gen_smtp) src/gen_smtp_client.erl:142: :gen_smtp_client.try_smtp_sessions/4

The password was generated by 1Password so it contains /, % and )

Vagabond commented 8 years ago

Sorry, I should have tested it. Try this:

AuthString = base64:encode(list_to_binary(io_lib:format("\0~s\0~s", [Username, Password]))),
stevedomin commented 8 years ago

It's now rejecting the password twice and then I get an error tuple:

password rejected: 535 Authentication failed: Bad username / password
password rejected: 535 Authentication failed: Bad username / password
{:error, :retries_exceeded,
 {:network_failure, "smtp.sendgrid.net", {:error, :closed}}}
Vagabond commented 8 years ago

Is it possible to give me a credential on your account for testing?

stevedomin commented 8 years ago

You can create a free account at https://sendgrid.com/, comes with 12k emails free.

That's probably the simplest, otherwise happy to figure out a way to give you credentials (pgp?)

Vagabond commented 8 years ago

I will give it a try.

Vagabond commented 8 years ago

Ugh, they want to validate my 'company' and a bunch of other nonsense, which I don't really have.

stevedomin commented 8 years ago

Ah crap, do you have a pgp key (or a keybase.io account)?

Vagabond commented 8 years ago
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2

mQENBFSz/scBCADF0IVZU2w9Qqh6Mi1T/K1a6v8P4Qx4mhi6hx3yJizJzH7b3HlT
CEBYSqoeO/X1PxMV1xBjO4m5XhyUq0/MpvJtxwjRNItsWKF68TXVyqkhSUiDFCfS
EUMdIwLt26+uKzfeiYkNOAfj9hc+NQNNqliJO2GBOmB71I0JuUZRdkzUytb/zF8z
HJolOiSBTtZGAKLYZ7Cfv/w+pR0UcgDlyOxNGfrH6GgisI4h+IQc/qkPLnZ8U78O
zrEQkEbM5glh4uy0I/pElMK45+N/T5FTd1CfwT6YCWcxe0wvS2Aa3AgBl9Fj4o1+
HxKaYp3eK2SJroUCePlHR40R8eKtLIGyp51FABEBAAG0I0FuZHJldyBUaG9tcHNv
biA8YW5kcmV3QGhlbGl1bS5jb20+iQE3BBMBCAAhBQJUs/7HAhsDBQsJCAcCBhUI
CQoLAgQWAgMBAh4BAheAAAoJEOTH0xXfJTlwG2sIAJp8p0jwtN9tvDLUPrqTkUaQ
FufUrfZjoQ79f+PlxqOn0m0cW6NaxyngO7HBz5HzV1X3w+yvwJX7M0yUGssEplRC
vXq5rrv4kPBYQT3zVJCQwS106b3lJag8H5xXwoN8vlS0fEnIDS+c25prqk508fds
XP41urejpGVRVIlF4KFHHs4+CYw7vDnfxs3YCfCmwKTbFKPSuv4Y3/W8idoa83U7
6YBYT7ykqzfZdNIM8mq4GzdW4HJ1q0TKLZw3juZ7LCL+l3dPnRx4tmaBDKaybjHC
+2ry63PFtSfDibBkELrYnOZt0W+9eBipEzHL5CSxkgvQRAicygkwL0QdI+lekJW5
AQ0EVLP+xwEIAM1v5kMFuzhCK6e5wfXG/EIWZ/ZkKvl13vYNYR05VMlf3XzZxAZO
jy4OIH5lxObBTViH7Zvnvkr3rnnwbvGyOUjux2PqIe72dXXDrnSM6pe7snkPsJpE
83NJddr85bKrsdjCY0TmhtD9SjHROthL2MEA76ZNC/NwZZ7qS7Q3+kFKpv0RUQDL
Q6ILF8QYOY7F9lyKVhRr5qfbYfeAgEiXZ+o5L6hABetMf3q/ZyvXsbNA4v55NY34
PQm/XNZ0Bx4iPz0bOadWxvGovVl2rCIWuXoWVIDCKEkHOYjnDaJuT+eZ6Ni3UTwA
OeHU3Qx8HmkmcviNiLH5piUpDLzdxiCO63cAEQEAAYkBHwQYAQgACQUCVLP+xwIb
DAAKCRDkx9MV3yU5cAL/B/0Z59xsclJdYt3+09cuZ0y0qRaxPcGQRrRRvu3jhB8V
kq3CqfpJ2Kb5V1qHc/V8d20Bx4xLidx1S5XTYErRFbKeYzCUThLpTNEZvmbbvtyP
pnLiGcnaaii+pZ+f8lxL7Mz3T8pJCjsY/cmi0PDwEwwtOaNFrXJSJPZJ6MzuFzte
HkWkdlHlsweOfZiZlh7Li8V+oUwVCkYM57ZB1bb4pzDmhDcBiaMYofK4FweHdhyy
GGsTdxJFJmsWrEDEp9ckOcR0NR61TNhPwb9JncJZwCtr+isR6F71sN1vg7VP7LyQ
Evu8JiiLkeHc0NZnIZO+9nXHJEURjkcTxAu/NDjuZoFT
=budR
-----END PGP PUBLIC KEY BLOCK-----
stevedomin commented 8 years ago

account.zip

Vagabond commented 8 years ago

Ok, so I got the credentials, but I can't authenticate to their SMTP server with the credentials using their example here:

https://support.sendgrid.com/hc/en-us/articles/200182038-Testing-your-connectivity-to-Sendgrid-s-SMTP-relay-using-Telnet

I get the same Bad username / password error

Vagabond commented 8 years ago

Ok, my sendgrid account got activated (I have no idea why).

If I use the username for the account. not the email address, I can authenticate and send via sendgrid.

stevedomin commented 8 years ago

Ok, this was indeed the issue in my case (I created some testing credentials with a password without special characters, so I thought this was the issue).

Do you think we could make the error message that gen_stmp gives better? In the current form you need to manually uncomment logging statement directly in the code to figure out what's happening.

Vagabond commented 8 years ago

Yeah, that is a legitimate concern.

I tried to reproduce your original error with the 'argument' error, but I could not, we should fix that too.

keichan34 commented 8 years ago
** (ArgumentError) argument error
               :erlang.++("username", [0 | "passwordwithspecialcharacter"])

I was able to reproduce this using a binary (default for Elixir) instead of a char list for Username and Password arguments.

mworrell commented 5 years ago

@keichan34 looking at the current code I suspect your issue has been resolved.

@stevedomin Is this still a problem?

mworrell commented 5 years ago

In general: we could add a flag to enable the logging of all client/server communication for a specific request.