Skip to content

Commit 340b0b0

Browse files
committed
new option: --output-filename
1 parent 632d5d4 commit 340b0b0

5 files changed

Lines changed: 30 additions & 16 deletions

File tree

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ Usage
1616

1717
Supported options:
1818

19-
* `-b, --bind [ADDRESS]` IP addresses to listen on, defaults to 127.0.0.1
20-
* `-p, --port [PORT]` SMTP port to listen on
19+
* `-o`, `--output-filename [FILENAME]` mbox file for output, default: stdout
20+
* `-b`, `--bind [ADDRESS]` IP addresses to listen on, default: 127.0.0.1
21+
* `-p`, `--port [PORT]` SMTP port to listen on

fakesmtpd/args.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import argparse
22
from smtplib import SMTP_PORT
3-
from typing import List, Any
3+
from typing import Any
44

55

6-
def parse_args(argv: List[str]) -> Any:
6+
def parse_args() -> Any:
77
parser = argparse.ArgumentParser(
88
description="SMTP server for testing mail functionality")
9+
parser.add_argument(
10+
"--output-filename", "-o", nargs="?", default="-",
11+
help="output mbox file, default stdout")
912
parser.add_argument(
1013
"--bind", "-b", nargs="?", default="127.0.0.1",
1114
help="IP address range to listen to")

fakesmtpd/mbox.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
1+
import sys
2+
13
from fakesmtpd.state import State
24

35

4-
def print_mbox_mail(stream, state: State) -> None:
6+
def print_mbox_mail(filename: str, state: State) -> None:
57
"""Print a mail in RFC 4155 default mbox format."""
8+
if filename == "-":
9+
write_mbox_mail(sys.stdout, state)
10+
else:
11+
with open(filename, "a") as f:
12+
write_mbox_mail(f, state)
13+
14+
15+
def write_mbox_mail(stream, state) -> None:
616
stream.write(f"From {state.reverse_path} {state.date.ctime()}\n")
717
for receiver in state.forward_path:
818
stream.write(f"X-FakeSMTPd-Receiver: {receiver}\n")

fakesmtpd/server.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,24 @@
1414

1515
def main() -> None:
1616
logging.basicConfig(level=logging.INFO)
17-
args = parse_args(sys.argv)
17+
args = parse_args()
18+
printer = partial(print_mbox_mail, args.output_filename)
1819
try:
19-
run_server(args.bind, args.port)
20+
run_server(args.bind, args.port, partial(handle_connection, printer))
2021
except PermissionError as exc:
2122
print(str(exc), file=sys.stderr)
2223
sys.exit(1)
2324

2425

25-
def run_server(host: Optional[str], port: int) -> None:
26+
def run_server(host: Optional[str], port: int, handler) -> None:
2627
loop = asyncio.get_event_loop()
2728
loop.add_signal_handler(signal.SIGINT, loop.stop)
2829
loop.add_signal_handler(signal.SIGTERM, loop.stop)
29-
s = asyncio.start_server(handle_connection, host=host, port=port)
30+
s = asyncio.start_server(handler, host=host, port=port)
3031
loop.run_until_complete(s)
3132
loop.run_forever()
3233

3334

34-
async def handle_connection(reader: StreamReader, writer: StreamWriter) \
35-
-> None:
36-
print_it = partial(print_mbox_mail, sys.stdout)
37-
await ConnectionHandler(reader, writer, print_it).handle()
35+
async def handle_connection(
36+
printer, reader: StreamReader, writer: StreamWriter) -> None:
37+
await ConnectionHandler(reader, writer, printer).handle()

fakesmtpd_test/mbox.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
from io import StringIO
55
from unittest import TestCase
66

7-
from fakesmtpd.mbox import print_mbox_mail
7+
from fakesmtpd.mbox import write_mbox_mail
88
from fakesmtpd.state import State
99

1010

11-
class PrintMboxMailTest(TestCase):
11+
class WriteMboxMailTest(TestCase):
1212

1313
def test_print(self):
1414
out = StringIO()
@@ -17,7 +17,7 @@ def test_print(self):
1717
state.reverse_path = "sender@example.com"
1818
state.forward_path = ["receiver1@example.com", "receiver2@example.com"]
1919
state.mail_data = "Subject: Foo\r\n\r\nText\r\n"
20-
print_mbox_mail(out, state)
20+
write_mbox_mail(out, state)
2121
assert_equal("From sender@example.com Sun Jun 4 14:34:15 2017\n"
2222
"X-FakeSMTPd-Receiver: receiver1@example.com\n"
2323
"X-FakeSMTPd-Receiver: receiver2@example.com\n"

0 commit comments

Comments
 (0)