def handle(self, *args, **options): # type: (*Any, **str) -> None if six.PY3: print(py3_warning) return rcpt_to = os.environ.get("ORIGINAL_RECIPIENT", options['recipient']) if rcpt_to is not None: if is_missed_message_address(rcpt_to): try: mark_missed_message_address_as_used(rcpt_to) except ZulipEmailForwardError: print( "5.1.1 Bad destination mailbox address: Bad or expired missed message address." ) exit( posix.EX_NOUSER ) # type: ignore # There are no stubs for posix in python 3 else: try: extract_and_validate(rcpt_to) except ZulipEmailForwardError: print( "5.1.1 Bad destination mailbox address: Please use the address specified " "in your Streams page.") exit( posix.EX_NOUSER ) # type: ignore # There are no stubs for posix in python 3 # Read in the message, at most 25MiB. This is the limit enforced by # Gmail, which we use here as a decent metric. message = sys.stdin.read(25 * 1024 * 1024) if len(sys.stdin.read(1)) != 0: # We're not at EOF, reject large mail. print("5.3.4 Message too big for system: Max size is 25MiB") exit( posix.EX_DATAERR ) # type: ignore # There are no stubs for posix in python 3 queue_json_publish("email_mirror", { "message": message, "rcpt_to": rcpt_to }, lambda x: None) else: # We're probably running from cron, try to batch-process mail if (not settings.EMAIL_GATEWAY_BOT or not settings.EMAIL_GATEWAY_LOGIN or not settings.EMAIL_GATEWAY_PASSWORD or not settings.EMAIL_GATEWAY_IMAP_SERVER or not settings.EMAIL_GATEWAY_IMAP_PORT or not settings.EMAIL_GATEWAY_IMAP_FOLDER): print( "Please configure the Email Mirror Gateway in /etc/zulip/, " "or specify $ORIGINAL_RECIPIENT if piping a single mail.") exit(1) reactor.callLater(0, main) reactor.run()
def handle(self, *args, **options): # type: (*Any, **str) -> None if six.PY3: print(py3_warning) return rcpt_to = os.environ.get("ORIGINAL_RECIPIENT", options['recipient']) if rcpt_to is not None: if is_missed_message_address(rcpt_to): try: mark_missed_message_address_as_used(rcpt_to) except ZulipEmailForwardError: print("5.1.1 Bad destination mailbox address: Bad or expired missed message address.") exit(posix.EX_NOUSER) # type: ignore # There are no stubs for posix in python 3 else: try: extract_and_validate(rcpt_to) except ZulipEmailForwardError: print("5.1.1 Bad destination mailbox address: Please use the address specified " "in your Streams page.") exit(posix.EX_NOUSER) # type: ignore # There are no stubs for posix in python 3 # Read in the message, at most 25MiB. This is the limit enforced by # Gmail, which we use here as a decent metric. message = sys.stdin.read(25*1024*1024) if len(sys.stdin.read(1)) != 0: # We're not at EOF, reject large mail. print("5.3.4 Message too big for system: Max size is 25MiB") exit(posix.EX_DATAERR) # type: ignore # There are no stubs for posix in python 3 queue_json_publish( "email_mirror", { "message": message, "rcpt_to": rcpt_to }, lambda x: None ) else: # We're probably running from cron, try to batch-process mail if (not settings.EMAIL_GATEWAY_BOT or not settings.EMAIL_GATEWAY_LOGIN or not settings.EMAIL_GATEWAY_PASSWORD or not settings.EMAIL_GATEWAY_IMAP_SERVER or not settings.EMAIL_GATEWAY_IMAP_PORT or not settings.EMAIL_GATEWAY_IMAP_FOLDER): print("Please configure the Email Mirror Gateway in /etc/zulip/, " "or specify $ORIGINAL_RECIPIENT if piping a single mail.") exit(1) reactor.callLater(0, main) reactor.run()
def consume(self, event: Mapping[str, Any]) -> None: rcpt_to = event['rcpt_to'] if not is_missed_message_address(rcpt_to): # Missed message addresses are one-time use, so we don't need # to worry about emails to them resulting in message spam. recipient_realm = extract_and_validate(rcpt_to)[0].realm try: rate_limit_mirror_by_realm(recipient_realm) except RateLimited: msg = email.message_from_string(event["message"]) logger.warning("MirrorWorker: Rejecting an email from: %s " "to realm: %s - rate limited." % (msg['From'], recipient_realm.name)) return mirror_email(email.message_from_string(event["message"]), rcpt_to=rcpt_to, pre_checked=True)