diff --git a/aiosmtpd/docs/NEWS.rst b/aiosmtpd/docs/NEWS.rst
index b69ec8c..c53b1e6 100644
--- a/aiosmtpd/docs/NEWS.rst
+++ b/aiosmtpd/docs/NEWS.rst
@@ -11,6 +11,8 @@
   ignored.  **API BREAK** If you have a handler that implements
   ``handle_NOOP()``, it previously took zero arguments but now requires a
   single argument.  (Closes #107)
+* The command line options ``--version`` / ``-v`` has been added to print the
+  package's current version number.  (Closes #111)
 * General improvements in the ``Controller`` class.  (Closes #104)
 * When aiosmtpd handles a ``STARTTLS`` it must arrange for the original
   transport to be closed when the wrapped transport is closed.  This fixes a
diff --git a/aiosmtpd/main.py b/aiosmtpd/main.py
index 40fca4c..6e0c338 100644
--- a/aiosmtpd/main.py
+++ b/aiosmtpd/main.py
@@ -4,7 +4,7 @@ import signal
 import asyncio
 import logging
 
-from aiosmtpd.smtp import DATA_SIZE_DEFAULT, SMTP
+from aiosmtpd.smtp import DATA_SIZE_DEFAULT, SMTP, __version__
 from argparse import ArgumentParser
 from functools import partial
 from importlib import import_module
@@ -28,6 +28,9 @@ def parseargs(args=None):
     parser = ArgumentParser(
         prog=PROGRAM,
         description='An RFC 5321 SMTP server with extensions.')
+    parser.add_argument(
+        '-v', '--version', action='version',
+        version='%(prog)s {}'.format(__version__))
     parser.add_argument(
         '-n', '--nosetuid',
         dest='setuid', default=True, action='store_false',

Add CLI support for `--version`
Subject says it all.
diff --git a/aiosmtpd/tests/test_main.py b/aiosmtpd/tests/test_main.py
index 0eb7357..85518f1 100644
--- a/aiosmtpd/tests/test_main.py
+++ b/aiosmtpd/tests/test_main.py
@@ -6,7 +6,7 @@ import unittest
 
 from aiosmtpd.handlers import Debugging
 from aiosmtpd.main import main, parseargs
-from aiosmtpd.smtp import SMTP
+from aiosmtpd.smtp import SMTP, __version__
 from contextlib import ExitStack
 from functools import partial
 from io import StringIO
@@ -309,3 +309,23 @@ class TestParseArgs(unittest.TestCase):
             self.assertEqual(cm.exception.code, 2)
         usage_lines = stderr.getvalue().splitlines()
         self.assertEqual(usage_lines[-1][-24:], 'Invalid port number: foo')
+
+    def test_version(self):
+        stdout = StringIO()
+        with ExitStack() as resources:
+            resources.enter_context(patch('sys.stdout', stdout))
+            resources.enter_context(patch('aiosmtpd.main.PROGRAM', 'smtpd'))
+            cm = resources.enter_context(self.assertRaises(SystemExit))
+            parseargs(('--version',))
+            self.assertEqual(cm.exception.code, 0)
+        self.assertEqual(stdout.getvalue(), 'smtpd {}\n'.format(__version__))
+
+    def test_v(self):
+        stdout = StringIO()
+        with ExitStack() as resources:
+            resources.enter_context(patch('sys.stdout', stdout))
+            resources.enter_context(patch('aiosmtpd.main.PROGRAM', 'smtpd'))
+            cm = resources.enter_context(self.assertRaises(SystemExit))
+            parseargs(('-v',))
+            self.assertEqual(cm.exception.code, 0)
+        self.assertEqual(stdout.getvalue(), 'smtpd {}\n'.format(__version__))

pip install -e .[dev]
parse_log_pytest
pytest
pytest
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/aio-libs/aiosmtpd.git@c030ae82759f82d1accb6872ce1702d6b655045d#egg=aiosmtpd
atpublic==5.1
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
pytest @ file:///croot/pytest_1738938843180/work
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work

name: aiosmtpd
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - atpublic==5.1
prefix: /opt/conda/envs/aiosmtpd

aiosmtpd/tests/test_main.py::TestParseArgs::test_v aiosmtpd/tests/test_main.py::TestParseArgs::test_version
aiosmtpd/tests/test_main.py::TestMain::test_debug_0 aiosmtpd/tests/test_main.py::TestMain::test_debug_1 aiosmtpd/tests/test_main.py::TestMain::test_debug_2 aiosmtpd/tests/test_main.py::TestMain::test_debug_3 aiosmtpd/tests/test_main.py::TestMain::test_n aiosmtpd/tests/test_main.py::TestMain::test_nosetuid aiosmtpd/tests/test_main.py::TestMain::test_setuid aiosmtpd/tests/test_main.py::TestMain::test_setuid_no_pwd_module aiosmtpd/tests/test_main.py::TestMain::test_setuid_permission_error aiosmtpd/tests/test_main.py::TestLoop::test_loop aiosmtpd/tests/test_main.py::TestLoop::test_loop_keyboard_interrupt aiosmtpd/tests/test_main.py::TestLoop::test_s aiosmtpd/tests/test_main.py::TestLoop::test_size aiosmtpd/tests/test_main.py::TestLoop::test_smtputf8 aiosmtpd/tests/test_main.py::TestLoop::test_u aiosmtpd/tests/test_main.py::TestParseArgs::test_bad_port_number aiosmtpd/tests/test_main.py::TestParseArgs::test_default_host_port aiosmtpd/tests/test_main.py::TestParseArgs::test_handler_from_cli aiosmtpd/tests/test_main.py::TestParseArgs::test_handler_from_cli_exception aiosmtpd/tests/test_main.py::TestParseArgs::test_handler_no_from_cli aiosmtpd/tests/test_main.py::TestParseArgs::test_handler_no_from_cli_exception aiosmtpd/tests/test_main.py::TestParseArgs::test_host_no_host aiosmtpd/tests/test_main.py::TestParseArgs::test_host_no_port aiosmtpd/tests/test_main.py::TestParseArgs::test_ipv6_host_port aiosmtpd/tests/test_main.py::TestParseArgs::test_l aiosmtpd/tests/test_main.py::TestParseArgs::test_listen
aiosmtpd/main.py aiosmtpd/docs/NEWS.rst
aiosmtpd/main.py aiosmtpd/docs/NEWS.rst