Beispiel #1
0
def handle_mail(state: State, arguments: str) -> Reply:
    if arguments[:5].upper() != "FROM:":
        return handle_wrong_arguments()
    try:
        path, rest = parse_reverse_path(arguments[5:])
    except ValueError as exc:
        return handle_wrong_arguments(str(exc))
    if not is_valid_smtp_arguments(rest):
        return handle_wrong_arguments()
    if not state.greeted:
        return handle_no_greeting()
    if not state.mail_allowed:
        return handle_bad_command_sequence()
    state.clear()
    state.reverse_path = path
    return SMTPStatus.OK, "Sender OK"
Beispiel #2
0
 def test_invalid_domain(self) -> None:
     with pytest.raises(ValueError):
         parse_reverse_path("<foo@*>")
Beispiel #3
0
 def test_empty_path(self) -> None:
     path, rest = parse_reverse_path("<>")
     assert path == ""
     assert rest == ""
Beispiel #4
0
 def test_missing_at(self) -> None:
     with pytest.raises(ValueError):
         parse_reverse_path("<invalid>")
Beispiel #5
0
 def test_invalid_local_part(self) -> None:
     with pytest.raises(ValueError):
         parse_reverse_path("<@@example.com>")
Beispiel #6
0
 def test_invalid(self) -> None:
     with pytest.raises(ValueError):
         parse_reverse_path("INVALID")
Beispiel #7
0
 def test_quoted_string(self) -> None:
     path, rest = parse_reverse_path('<"foo \\" bar"@example.com>')
     assert path == '"foo \\" bar"@example.com'
     assert rest == ""
Beispiel #8
0
 def test_mailbox_with_rest(self) -> None:
     path, rest = parse_reverse_path("<*****@*****.**>REST")
     assert path == "*****@*****.**"
     assert rest == "REST"
Beispiel #9
0
 def test_mailbox(self) -> None:
     path, rest = parse_reverse_path("<*****@*****.**>")
     assert path == "*****@*****.**"
     assert rest == ""
Beispiel #10
0
 def test_empty_path_with_rest(self) -> None:
     path, rest = parse_reverse_path("<>REST")
     assert path == ""
     assert rest == "REST"