send_com('AUTH LOGIN\r\n', '334') # Authenticate mail server
print ("Username: " + base64.b64encode(username.encode()).decode())
print ("Password: " + base64.b64encode(password.encode()).decode() + "\n")
send_com(base64.b64encode(username.encode()), '334') # Send username
send_com(base64.b64encode(password.encode()), '235') # Sned password
Похоже, вы неправильно понимаете, как работают методы аутентификации LOGIN.В основном это выглядит так:
> AUTH LOGIN
< 334 base64("Username:")
> base64(your_username)
< 334 base64("Password:")
> base64(your_password)
Таким образом, вы отправляете на сервер не "Username: " + base64(your_password)
, а только пароль в кодировке base64 - с новой строкой в конце, конечно.Это означает, что приведенный выше код должен выглядеть примерно так:
send_com('AUTH LOGIN\r\n', '334') # Authenticate mail server
send_com(base64.b64encode(username.encode()) + "\r\n", '334') # Send username
send_com(base64.b64encode(password.encode()) + "\r\n", '235') # Send password
Две строки, в которые вы отправили имя пользователя и пароль, пропали, но остались остальные строки, где вы снова отправили имя пользователя и пароль - только этов этих случаях также отправляется новая строка.
Это исправлено, она больше не будет застревать в исходном месте.
Он будет жаловаться позже, поскольку вы отправляете MAIL FROM
команды вместо MAIL FROM
с последующим RCPT TO
.И он застрянет на send_com(msg, '')
, так как ваша функция send_com
пытается прочитать с сервера, даже если вы ничего не ожидаете обратно.И код также будет жаловаться, что некоторые коды состояния, возвращаемые с сервера, отличаются от ожидаемых.Но как только это будет исправлено, письмо будет успешно отправлено.