diff --git a/bin/export-ksp-post b/bin/export-ksp-post
new file mode 100755
index 0000000000000000000000000000000000000000..79ca869daecb47800daaa4b91284b8ac597fbd64
--- /dev/null
+++ b/bin/export-ksp-post
@@ -0,0 +1,58 @@
+#!/usr/bin/env python3
+# Exportování kontaktů na organizátory ve formátu pro KSPácký post-mail-gen
+
+import argparse
+from dataclasses import dataclass
+from sqlalchemy import or_
+from sqlalchemy.orm import joinedload
+import sys
+
+import mo.csv
+import mo.db as db
+from mo.util import die, init_standalone
+
+parser = argparse.ArgumentParser(description='Exportuje kontakty pro post-mail-gen z KSP')
+parser.add_argument('--role', type=str, metavar='ROLE', nargs='*', help='organizátoři s jednou ze zadaných rolí (formát jako v DB)')
+parser.add_argument('--cat', type=str, metavar='CAT', nargs='*', help='omezit role na jednu z daných kategorií')
+
+args = parser.parse_args()
+
+init_standalone()
+sess = db.get_session()
+
+query = (sess.query(db.User)
+         .filter_by(is_org=True))
+
+if args.role:
+    roles = [db.RoleType.coerce(x) for x in args.role]
+    subq = sess.query(db.UserRole.user_id).filter(db.UserRole.role.in_(roles))
+    if args.cat:
+        subq = subq.filter(or_(db.UserRole.category.in_(args.cat), db.UserRole.category == None))
+    query = query.filter(db.User.user_id.in_(subq))
+
+orgs = query.all()
+
+
+@dataclass
+class Row:
+    uid: str
+    src: str
+    email: str
+    first_name: str
+    last_name: str
+    papers: str
+
+
+output = []
+for u in sorted(orgs, key=lambda u: u.sort_key()):
+    row = Row(
+        uid=u.user_id,
+        src='osmo',
+        email=u.email,
+        first_name=u.first_name,
+        last_name=u.last_name,
+        papers='mail',
+    )
+    output.append(row)
+
+mo.csv.write(sys.stdout, mo.csv.FileFormat.tsv, Row, output)