diff --git a/ci/testctl b/ci/testctl index 79db85e1..d6ec4f13 100755 --- a/ci/testctl +++ b/ci/testctl @@ -1,474 +1,482 @@ #!/bin/bash base_dir="$(dirname $(realpath "$0"))" pushd "${base_dir}" pushd .. set -e set -x PASSPORT_PRIVATE_KEY="-----BEGIN PRIVATE KEY----- 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 bakhie7hJBP7BoOup+dD5NQPlXBQ434= -----END PRIVATE KEY-----" PASSPORT_PUBLIC_KEY="-----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEApmHkae115z3vMF9IjiUa XrJH1Ljifxqs+XbDCFhQenz2iOf/bZDBMqfrwhBe3hVywa13kIuhf1TZlcJ/nRhE IZIbg6BF6/GeHN998Cx/IjhBeFkG7f1hdxEXY5ibd7yq8vAfzizZpnCu4+LM/NvI ei9mU+hj3GxrDbpMQTHCDDqX5aNEix8uFU4XaOm9UOJw9ivz19cqcnxWqJ49znxw XUlS5k4Hewbwf2s2BWFhz+CDWPHMpWViLQ17qj5QRklNn39sUymP1kXKP3Y76zvW zNVniPvFt+hHixxEa7tUEaTdtk4FgkNnWy0bFa7DIPC8ukjHvHHg10LeQiygDduI xbdVJwYK/qitU68ZAbbufldlj2FoVLwSyP9qpxUIdRoljCop1kDu6xQiAq0VHEAV LtgMpZhtD/6D4z644QJ8atx4Ljp/HEtTngaTh+/vLc9AnhHclX0/JmlbP1VkWWxG 9FIxS0TVPolRBs8948kLioTif9lrltJicxd6T0OuA5fny8l6hdSlzaD3pnr5pkYw mVn5FgBAFnd/skX6DsRs+eb2lNahkvNZZ15z9UeU2Rl6J9uBx0vbkcB7eiSCPhRM IKq/CtkyEgz8ce4kG18fJHDFDASRvGjaBu91lV5h7NLmhFLFzMvb7XoHrv/yD6TV E5W47J/DrfrevJkzS1GV++MCAwEAAQ== -----END PUBLIC KEY-----" KOLAB_GIT_REF=dev/mollekopf KOLAB_GIT_REMOTE=https://git.kolab.org/source/kolab GIT_REF_ROUNDCUBEMAIL=dev/kolab-1.5 GIT_REMOTE_ROUNDCUBEMAIL=https://git.kolab.org/source/roundcubemail.git GIT_REF_ROUNDCUBEMAIL_PLUGINS=master GIT_REMOTE_ROUNDCUBEMAIL_PLUGINS=https://git.kolab.org/diffusion/RPK/roundcubemail-plugins-kolab.git GIT_REF_CHWALA=dev/mollekopf GIT_REMOTE_CHWALA=https://git.kolab.org/diffusion/C/chwala.git GIT_REF_SYNCROTON=master GIT_REMOTE_SYNCROTON=https://git.kolab.org/diffusion/S/syncroton.git GIT_REF_AUTOCONF=master GIT_REMOTE_AUTOCONF=https://git.kolab.org/diffusion/AC/autoconf.git GIT_REF_IRONY=master GIT_REMOTE_IRONY=https://git.kolab.org/source/iRony.git GIT_REF_FREEBUSY=master GIT_REMOTE_FREEBUSY=https://git.kolab.org/diffusion/F/freebusy.git IMAP_GIT_REF=dev/mollekopf IMAP_GIT_REMOTE=https://git.kolab.org/source/cyrus-imapd PODMAN="podman" # Teardown the currently running environment kolab__teardown() { $PODMAN pod rm --force tests $PODMAN pod rm --force dev } # Build all containers required for testing kolab__build() { $PODMAN build docker/base/ -f almalinux9 -t apheleia/almalinux9 $PODMAN build docker/swoole/ -t apheleia/swoole $PODMAN build --ulimit nofile=65535:65535 docker/webapp -t kolab-webapp $PODMAN build docker/imap -t kolab-imap $PODMAN build docker/mariadb -t mariadb $PODMAN build docker/redis -t redis $PODMAN build docker/proxy -t proxy $PODMAN build --ulimit nofile=65535:65535 docker/tests -t kolab-tests $PODMAN build --ulimit nofile=65535:65535 docker/roundcube -t roundcube } # Setup the test environment kolab__setup() { kolab__teardown echo "Build" kolab__build echo "Setup" POD=tests # Create the pod first $PODMAN pod create --name $POD podman__run_mariadb podman__run_redis podman__healthcheck mariadb redis podman__run_webapp config.demo podman__healthcheck webapp podman__run_imap podman__healthcheck imap # Ensure all commands are processed echo "Flushing work queue" $PODMAN exec -ti webapp ./artisan queue:work --stop-when-empty podman__run_minio podman__healthcheck minio # Validate the test environment kolab__validate } # "testsuite" # "quicktest" # "tests/Feature/Jobs/WalletCheckTest.php" kolab__test() { $PODMAN run -ti --pod tests --name kolab-tests --replace \ --env-file=ci/env \ -v ./src:/src/kolabsrc.orig:ro \ -e APP_SERVICES_DOMAINS="localhost" \ -e PASSPORT_PRIVATE_KEY="$PASSPORT_PRIVATE_KEY" \ -e PASSPORT_PUBLIC_KEY="$PASSPORT_PUBLIC_KEY" \ kolab-tests:latest /init.sh $@ } kolab__proxytest() { $PODMAN run -ti --pod tests --name proxy-tests --replace \ -v ./docker/certs/:/etc/certs/:ro \ --env-file=ci/env \ -e SSL_CERTIFICATE=/etc/certs/imap.hosted.com.cert \ -e SSL_CERTIFICATE_KEY=/etc/certs/imap.hosted.com.key \ proxy:latest /init.sh validate } kolab__lint() { kolab__test lint } # Setup the test environment and run a complete testsuite kolab__testrun() { echo "Setup" kolab__setup echo "Test" kolab__test testsuite } # Setup the test environment and run all testsuites kolab__testrun_complete() { echo "Setup" kolab__setup echo "Test" kolab__test lint kolab__test testsuite kolab__rctest syncroton lint kolab__rctest syncroton testsuite kolab__rctest irony lint # kolab__rctest irony testsuite kolab__rctest roundcubemail-plugins-kolab lint # kolab__rctest roundcubemail-plugins-kolab testsuite } # Get a shell inside the test container to run/debug tests kolab__shell() { kolab__test shell } # Run the roundcube testsuite kolab__rctest() { $PODMAN run -t --pod tests --name roundcube --replace \ -v ./ext:/src.orig:ro \ -e APP_DOMAIN=kolab.test \ -e DES_KEY=kBxUM/53N9p9abusAoT0ZEAxwI2pxFz/ \ -e DB_HOST=127.0.0.1 \ -e DB_RC_DATABASE=roundcube \ -e DB_RC_USERNAME=roundcube \ -e DB_RC_PASSWORD=simple123 \ -e IMAP_HOST=localhost \ -e IMAP_PORT=11143 \ -e IMAP_ADMIN_LOGIN=cyrus-admin \ -e IMAP_ADMIN_PASSWORD=simple123 \ -e IMAP_DEBUG=false \ -e SQL_DEBUG=false \ -e ACTIVESYNC_DEBUG=false \ -e RUN_MIGRATIONS=true \ -e MAIL_HOST=localhost \ -e MAIL_PORT=10587 \ -e FILEAPI_WOPI_OFFICE=https://kolab.local \ -e CALENDAR_CALDAV_SERVER=http://imap:11080/dav \ -e KOLAB_ADDRESSBOOK_CARDDAV_SERVER=http://imap:11080/dav \ roundcube:latest ./init.sh $@ } # Get a shell inside the roundcube test container to run/debug tests kolab__rcshell() { $PODMAN run -ti --pod tests --name roundcube --replace \ -v ./ext:/src.orig:ro \ -e APP_DOMAIN=kolab.test \ -e DES_KEY=kBxUM/53N9p9abusAoT0ZEAxwI2pxFz/ \ -e DB_HOST=127.0.0.1 \ -e DB_RC_DATABASE=roundcube \ -e DB_RC_USERNAME=roundcube \ -e DB_RC_PASSWORD=simple123 \ -e IMAP_HOST=localhost \ -e IMAP_PORT=11143 \ -e IMAP_ADMIN_LOGIN=cyrus-admin \ -e IMAP_ADMIN_PASSWORD=simple123 \ -e MAIL_HOST=localhost \ -e MAIL_PORT=10587 \ -e FILEAPI_WOPI_OFFICE=https://kolab.local \ -e CALENDAR_CALDAV_SERVER=http://localhost:11080/dav \ -e KOLAB_ADDRESSBOOK_CARDDAV_SERVER=http://localhost:11080/dav \ roundcube:latest ./init.sh shell } kolab__validate() { $PODMAN exec imap testsaslauthd -u cyrus-admin -p simple123 $PODMAN exec imap testsaslauthd -u "john@kolab.org" -p simple123 # Ensure the inbox is created FOUND=false for i in {1..60}; do if $PODMAN exec imap bash -c 'echo "lm" | cyradm --auth PLAIN -u cyrus-admin -w simple123 --port 11143 localhost | grep "user/john@kolab.org"'; then echo "Found mailbox"; FOUND=true break else echo "Waiting for mailbox"; sleep 1; fi done if ! $FOUND; then echo "Failed to find the inbox for john@kolab.org" exit 1 fi } podman__healthcheck() { for CONTAINER in $@; do echo "Waiting for ${CONTAINER} become healthy " while [ $(podman healthcheck run ${CONTAINER}) ]; do echo -n "."; sleep 5; done done } podman__run_proxy() { $PODMAN run -dt --pod $POD --name proxy --replace \ -v ./docker/certs:/etc/certs:ro \ -e APP_WEBSITE_DOMAIN="kolab.local" \ -e SSL_CERTIFICATE="/etc/certs/imap.hosted.com.cert" \ -e SSL_CERTIFICATE_KEY="/etc/certs/imap.hosted.com.key" \ -e WEBAPP_BACKEND="http://localhost:8000" \ -e MEET_BACKEND="https://localhost:12443" \ -e ROUNDCUBE_BACKEND="http://localhost:8080" \ -e DAV_BACKEND="http://localhost:11080/dav" \ -e COLLABORA_BACKEND="http://localhost:9980" \ kolab-proxy:latest } podman__run_roundcube() { $PODMAN run -dt --pod $POD --name roundcube --replace \ -v ./ext:/src.orig:ro \ -e APP_DOMAIN=kolab.test \ -e DES_KEY=kBxUM/53N9p9abusAoT0ZEAxwI2pxFz/ \ -e DB_HOST=127.0.0.1 \ -e DB_RC_DATABASE=roundcube \ -e DB_RC_USERNAME=roundcube \ -e DB_RC_PASSWORD=simple123 \ -e IMAP_HOST=localhost \ -e IMAP_PORT=11143 \ -e IMAP_ADMIN_LOGIN=cyrus-admin \ -e IMAP_ADMIN_PASSWORD=simple123 \ -e MAIL_HOST=localhost \ -e MAIL_PORT=10587 \ -e IMAP_DEBUG=true \ -e FILEAPI_WOPI_OFFICE=https://kolab.local \ -e CALENDAR_CALDAV_SERVER=http://imap:11080/dav \ -e KOLAB_ADDRESSBOOK_CARDDAV_SERVER=http://imap:11080/dav \ roundcube:latest } podman__run_mariadb() { $PODMAN run -dt --pod $POD --name mariadb --replace \ --mount=type=tmpfs,tmpfs-size=512M,destination=/var/lib/mysql,U=true \ -e MYSQL_ROOT_PASSWORD=simple123 \ -e TZ="+02:00" \ -e DB_HKCCP_DATABASE=kolabdev \ -e DB_HKCCP_USERNAME=kolabdev \ -e DB_HKCCP_PASSWORD=simple123 \ -e DB_KOLAB_DATABASE=kolab \ -e DB_KOLAB_USERNAME=kolab \ -e DB_KOLAB_PASSWORD=simple123 \ -e DB_RC_DATABASE=roundcube \ -e DB_RC_USERNAME=roundcube \ -e DB_RC_PASSWORD=simple123 \ --health-cmd "mysqladmin -u root ping && test -e /tmp/initialized" \ mariadb:latest } podman__run_redis() { $PODMAN run -dt --pod $POD --name redis --replace \ --mount=type=tmpfs,tmpfs-size=128M,destination=/var/lib/redis,U=true \ --health-cmd "redis-cli ping || exit 1" \ redis:latest } podman__run_minio() { $PODMAN run -dt --pod $POD --name minio --replace \ --mount=type=tmpfs,tmpfs-size=128M,destination=/data,U=true \ -e MINIO_ROOT_USER=minio \ -e MINIO_ROOT_PASSWORD=simple123 \ --health-cmd "mc ready local || exit 1" \ --entrypoint sh \ quay.io/minio/minio:latest -c 'mkdir -p /data/kolab && minio server /data --console-address ":9001"' } podman__run_webapp() { # We run with a fixed config.demo overlay and override the environment with ci/env $PODMAN run -dt --pod $POD --name webapp --replace \ --env-file=ci/env \ -v ./src:/src/kolabsrc.orig:ro \ -v ./$1/src:/src/overlay:ro \ -e NOENVFILE=true \ -e APP_SERVICES_ALLOWED_DOMAINS="webapp,localhost,services.kolab.local" \ -e KOLAB_ROLE=combined \ -e PASSPORT_PRIVATE_KEY="$PASSPORT_PRIVATE_KEY" \ -e PASSPORT_PUBLIC_KEY="$PASSPORT_PUBLIC_KEY" \ --health-cmd "./artisan octane:status || exit 1" \ kolab-webapp:latest } podman__run_imap() { $PODMAN run -dt --pod $POD --name imap --replace \ --mount=type=tmpfs,tmpfs-size=128M,tmpfs-mode=777,destination=/var/spool/imap,U=true,notmpcopyup \ --mount=type=tmpfs,tmpfs-size=128M,tmpfs-mode=777,destination=/var/lib/imap,U=true,notmpcopyup \ -e APP_SERVICES_DOMAIN="localhost" \ -e SERVICES_PORT=8000 \ -e IMAP_ADMIN_LOGIN=cyrus-admin \ -e IMAP_ADMIN_PASSWORD=simple123 \ --health-cmd "test -e /run/saslauthd/mux && kill -0 \$(cat /var/run/master.pid)" \ kolab-imap:latest } podman__run_meet() { $PODMAN run -dt --pod $POD --name meet --replace \ -v ./meet/server:/src/meet:ro \ -v ./docker/certs/meet.kolab.local.cert:/etc/pki/tls/certs/meet.kolab.local.cert \ -v ./docker/certs/meet.kolab.local.key:/etc/pki/tls/private/meet.kolab.local.key \ -e WEBRTC_LISTEN_IP=127.0.0.1 \ -e WEBRTC_ANNOUNCED_ADDRESS=127.0.0.1 \ -e PUBLIC_DOMAIN=kolab.local \ -e LISTENING_HOST=127.0.0.1 \ -e LISTENING_PORT=12443 \ -e DEBUG="*" \ -e TURN_SERVER=none \ -e AUTH_TOKEN=simple123 \ -e WEBHOOK_TOKEN=simple123 \ -e WEBHOOK_URL=kolab.local/api/webhooks/meet \ -e SSL_CERT=/etc/pki/tls/certs/meet.kolab.local.cert \ -e SSL_KEY=/etc/pki/tls/private/meet.kolab.local.key \ kolab-meet:latest } kolab__deploy() { POD=dev # Create the pod first $PODMAN pod create \ --replace \ --add-host=kolab.local:127.0.0.1 \ --publish "443:6443" \ --publish "465:6465" \ --publish "587:6587" \ --publish "143:6143" \ --publish "993:6993" \ --publish "44444:44444/udp" \ --publish "44444:44444/tcp" \ --name $POD podman__run_mariadb podman__run_redis podman__healthcheck mariadb redis podman__run_webapp config.prod podman__healthcheck webapp podman__run_imap podman__healthcheck imap # Ensure all commands are processed echo "Flushing work queue" $PODMAN exec -ti webapp ./artisan queue:work --stop-when-empty $PODMAN exec webapp ./artisan user:password "admin@kolab.local" "simple123" podman__run_minio podman__healthcheck minio podman__run_meet podman__healthcheck meet podman__run_roundcube podman__run_proxy } +kolab__generate_mail() { + $PODMAN run --pod=dev -t --rm kolab-utils:latest ./generatemail.py --maxAttachmentSize=3 --type=mail --count 100 --username admin@kolab.local --password simple123 --host localhost --port 11143 INBOX +} + +kolab__syncroton_sync() { + $PODMAN run -t --network=host --add-host=kolab.local:127.0.0.1 --rm kolab-utils:latest ./activesynccli.py --host kolab.local --user admin@kolab.local --password simple123 sync 38b950ebd62cd9a66929c89615d0fc04 +} + kolab__help() { cat </dev/null 2>&1; then "kolab__$cmdname" "${@:1}" else echo "Function $cmdname not recognized" >&2 kolab__help exit 1 fi diff --git a/docker/utils/rootfs/opt/app-root/src/generatemail.py b/docker/utils/rootfs/opt/app-root/src/generatemail.py index 0b2822d3..b80b9927 100755 --- a/docker/utils/rootfs/opt/app-root/src/generatemail.py +++ b/docker/utils/rootfs/opt/app-root/src/generatemail.py @@ -1,356 +1,362 @@ #!/bin/env python3 """ Generate a bunch of dummy messages in a folder. ./generate.py --clear --type=contact --count 1000 --username admin@kolab-vanilla.alma8.local --password W3lcom32@ph3lia --host localhost --port 9993 Contacts """ from datetime import datetime, timedelta import pytz import random import argparse import glob import os import imaplib mailtemplate = ''' Return-Path: Received: from imapb010.mykolab.com ([unix socket]) by imapb010.mykolab.com (Cyrus 2.5.10-49-g2e214b4-Kolab-2.5.10-8.1.el7.kolab_14) with LMTPA; Wed, 09 Aug 2017 18:37:01 +0200 X-Sieve: CMU Sieve 2.4 Received: from int-mx002.mykolab.com (unknown [10.9.13.2]) by imapb010.mykolab.com (Postfix) with ESMTPS id 0A93910A25047 for ; Wed, 9 Aug 2017 18:37:01 +0200 (CEST) Received: from int-subm002.mykolab.com (unknown [10.9.37.2]) by int-mx002.mykolab.com (Postfix) with ESMTPS id EC06AF6E for ; Wed, 9 Aug 2017 18:37:00 +0200 (CEST) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_291b8e96564265636432c6d494e02322" Date: {date} From: "Mollekopf, Christian" To: christian@example.ch Subject: {subject} Message-ID: {messageid} --=_291b8e96564265636432c6d494e02322 Content-Type: multipart/alternative; boundary="=_ceff0fd19756f45ed1295ee2069ff8e0" --=_ceff0fd19756f45ed1295ee2069ff8e0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII sdlkjsdjf --=_ceff0fd19756f45ed1295ee2069ff8e0 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=UTF-8

sdlkjsdjf

--=_ceff0fd19756f45ed1295ee2069ff8e0-- --=_291b8e96564265636432c6d494e02322 Content-Transfer-Encoding: base64 Content-Type: text/plain; name=xorg.conf Content-Disposition: attachment; filename=xorg.conf; size=211 U2VjdGlvbiAiRGV2aWNlIgogICAgSWRlbnRpZmllciAgICAgIkRldmljZTAiCiAgICBEcml2ZXIg {attachment}ICAgIEJvYXJkTmFtZSAgICAgICJOVlMgNDIwME0iCiAgICBPcHRpb24gIk5vTG9nbyIgInRydWUi CiAgICBPcHRpb24gIlVzZUVESUQiICJ0cnVlIgpFbmRTZWN0aW9uCg== --=_291b8e96564265636432c6d494e02322-- '''.strip() eventtemplate = ''' MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_a56b92bc39b8cc011c0c98c3dcac708a" From: admin@kolab-premium.centos7.local To: admin@kolab-premium.centos7.local Date: Thu, 07 May 2020 07:28:51 +0000 X-Kolab-Type: application/x-vnd.kolab.event X-Kolab-Mime-Version: 3.0 Subject: {uid} User-Agent: Kolab 16/Roundcube 1.4.2 --=_a56b92bc39b8cc011c0c98c3dcac708a Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=ISO-8859-1 This is a Kolab Groupware object. To view this object you will need an emai= l client that understands the Kolab Groupware format. For a list of such em= ail clients please visit http://www.kolab.org/ --=_a56b92bc39b8cc011c0c98c3dcac708a Content-Transfer-Encoding: 8bit Content-Type: application/calendar+xml; charset=UTF-8; name=kolab.xml Content-Disposition: attachment; filename=kolab.xml; size=2724 Roundcube-libkolab-1.1 Libkolabxml-1.2.0 2.0 3.1.0 {uid} 2020-05-07T07:28:51Z 2020-05-07T07:28:51Z 0 PUBLIC /kolab.org/Europe/Zurich {dtstart} /kolab.org/Europe/Zurich {dtend} {summary} Testdescription Testlocation mailto:%3Cadmin%40kolab-premium.centos7.local%3E NEEDS-ACTION REQ-PARTICIPANT true mailto:%3Ctest1%40kolab-premium.centos7.local%3E text/x-ruby safe_yaml cid:safe_yaml.1588836531.13830 --=_a56b92bc39b8cc011c0c98c3dcac708a Content-ID: Content-Transfer-Encoding: base64 Content-Type: text/x-ruby; name=safe_yaml Content-Disposition: attachment; filename=safe_yaml; size=540 IyEvdXNyL2Jpbi9ydWJ5CiMKIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBSdWJ5R2Vtcy4K {attachment}dAppZiBzdHIKICBzdHIgPSBzdHIuYlsvXEFfKC4qKV9cei8sIDFdCiAgaWYgc3RyIGFuZCBHZW06 ICJzYWZlX3lhbWwiLCB2ZXJzaW9uKQplbmQK --=_a56b92bc39b8cc011c0c98c3dcac708a-- '''.strip() contacttemplate = ''' MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_a56b92bc39b8cc011c0c98c3dcac708a" From: admin@kolab-premium.centos7.local To: admin@kolab-premium.centos7.local Date: Thu, 07 May 2020 07:28:51 +0000 X-Kolab-Type: application/x-vnd.kolab.contact X-Kolab-Mime-Version: 3.0 Subject: {uid} User-Agent: Kolab 16/Roundcube 1.4.2 --=_a56b92bc39b8cc011c0c98c3dcac708a Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=ISO-8859-1 This is a Kolab Groupware object. To view this object you will need an emai= l client that understands the Kolab Groupware format. For a list of such em= ail clients please visit http://www.kolab.org/ --=_a56b92bc39b8cc011c0c98c3dcac708a Content-Transfer-Encoding: 8bit Content-Type: application/vcard+xml; charset=UTF-8; name=kolab.xml Content-Disposition: attachment; filename=kolab.xml; size=646 urn:uuid:{uid} 3.1.0 Roundcube-libkolab-1.1 Libkolabxml-1.3.0 20230428T134238Z individual {given} {surname} home {email} --=_a56b92bc39b8cc011c0c98c3dcac708a-- '''.strip() class Generator: def __init__(self, options): self.target_directory = options.target_directory self.host = options.host self.port = options.port self.username = options.username self.password = options.password - self.imap = imaplib.IMAP4_SSL(host=self.host, port=self.port) + self.maxAttachmentSize = options.maxAttachmentSize + if options.ssl: + self.imap = imaplib.IMAP4_SSL(host=self.host, port=self.port) + else: + self.imap = imaplib.IMAP4(host=self.host, port=self.port) self.imap.login(options.username, options.password) def clearmailbox(self): #FIXME restore support for just writing to a directory # for f in glob.glob("{}/../cur/*".format(self.target_directory)): # os.remove(f) self.imap.select(self.target_directory) typ, data = self.imap.search(None, 'ALL') for num in data[0].split(): self.imap.store(num, '+FLAGS', '\\Deleted') self.imap.expunge() def upload(self, i, data): #FIXME restore support for just writing to a directory # fname = "{}/{}.".format(self.target_directory, i) # with open(fname, 'wb') as f: # f.write(data.encode()) ret = self.imap.append(self.target_directory, '', datetime.now(pytz.UTC), data.encode()) if ret[0] != 'OK': raise Exception(ret) def populatemailbox(self, type, count): dtstamp = datetime.utcnow() # Reproducible results random.seed(30) for i in range(1, count + 1): dtstamp = dtstamp - timedelta(seconds=600) if type == "mail": - attachmentMultiplier = 50000 * random.randint(0, 10) # Approx 20 MB + attachmentMultiplier = 13158 * random.randint(0, self.maxAttachmentSize) # 13158 is roughly 1 MB result = mailtemplate.format( messageid="".format(i), subject="Foobar {}".format(i), date=dtstamp.strftime("%a, %d %b %Y %H:%M:%S %z"), attachment='ICAgIEJvYXJkTmFtZSAgICAgICJOVlMgNDIwME0iCiAgICBPcHRpb24gIk5vTG9nbyIgInRydWUi\n' * attachmentMultiplier ) if type == "event": result = eventtemplate.format( uid="B06DBE43D213419A9D705D6B7FAB2CA2-{}".format(i), summary="Foobar {}".format(i), dtstart=dtstamp.strftime("%Y-%m-%dT%H:%M:%S"), dtend=(dtstamp + timedelta(seconds=300)).strftime("%Y-%m-%dT%H:%M:%S"), attachment='dAppZiBzdHIKICBzdHIgPSBzdHIuYlsvXEFfKC4qKV9cei8sIDFdCiAgaWYgc3RyIGFuZCBHZW06\n' * 5000 * random.randint(0, 10) ) if type == "contact": result = contacttemplate.format( uid="B06DBE43D213419A9D705D6B7FAB2CA3-{}".format(i), given="John {}".format(i), surname="Doe {}".format(i), email="doe{}@example.com".format(i), ) print(i) self.upload(i, result) parser = argparse.ArgumentParser(description='Generate some mail.') parser.add_argument('target_directory', help='the target directory') parser.add_argument('--count', help='Number of emails to generate', type=int) parser.add_argument('--type', help='Type to generate', default='mail') parser.add_argument('--clear', help='Type to generate', action='store_true') +parser.add_argument('--ssl', help='Use ssl', action='store_true') parser.add_argument('--host', help='imap host', default='localhost') parser.add_argument('--port', help='imap port', type=int, default=993) +parser.add_argument('--maxAttachmentSize', help='in MB', type=int, default=20) parser.add_argument('--username', help='imap username') parser.add_argument('--password', help='imap password') args = parser.parse_args() gen = Generator(args) if args.clear: gen.clearmailbox() gen.populatemailbox(args.type, args.count)