๐Ÿ“ง CLI to deduplicate mails from mail boxes.

Overview

Mail Deduplicate

Command-line tool to deduplicate mails from a set of boxes.

Stable release: Last release Python versions

Development: Unittests status Documentation Status Coverage Status

https://raw.githubusercontent.com/kdeldycke/mail-deduplicate/develop/docs/cli-coloured-header.png

Features

  • Duplicate detection based on cherry-picked and normalized mail headers.
  • Source and deduplicate mails from multiple sources.
  • Reads and writes to mbox, maildir, babyl, mh and mmdf formats.
  • Multiple duplicate selection strategies based on size, content, timestamp, file path or random choice.
  • Copy, move or delete the resulting set of mails after the deduplication.
  • Dry-run mode.
  • Protection against false-positives by checking for size and content differences.

Screenshots

https://raw.githubusercontent.com/kdeldycke/mail-deduplicate/develop/docs/cli-colored-help.png
https://raw.githubusercontent.com/kdeldycke/mail-deduplicate/develop/docs/cli-coloured-run.png

Installation

This package is available on PyPi, so you can install the latest stable release and its dependencies with a simple pip call:

$ pip install mail-deduplicate

Documentation

Docs are hosted on Read the Docs.

Comments
  • [WIP, HELP NEEDED] Fix many issues

    [WIP, HELP NEEDED] Fix many issues

    Hi,

    This started as a fix for #19 , but has grown somewhat.

    So far I have:

    • Fixed memory consumption issues (#8, #19, and probably #3) by storing only mail file names (not whole Message objects) while detecting possible duplicate mails. The Messsage objects are loaded from disk while processing clusters of mail files that have the same hash.
    • Fixed the cmp issue described in #34
    • Attempted to fix several issues with encodings #32 . I have rudimentary fixes forcing decoding of the message lines, but there are still issues. Any help is welcome.
    • Added a progress bar in place of printing a '.' every 100 messages

    Cheers, Kevin

    โœจ enhancement ๐Ÿ› bug 
    opened by kdm9 19
  • Unclear how to install

    Unclear how to install

    Since transitioning from a simple script to a package, it's not at all clear how to use this any more. README.rst is missing any installation instructions, and the usage text begins:

    Usage: __init__.py [OPTIONS] [MAILDIR [MAILDIR ...]]
    

    which is obviously wrong.

    ๐Ÿ“š documentation 
    opened by aspiers 17
  • No deletion: all mail differences within limits

    No deletion: all mail differences within limits

    I am using

    mdedup -C -1 -S -1 -s delete-smaller maildirname

    But I still get "Check that mail differences are within the limits." messages, and nothing is deleted. All duplicates are either ignored or skipped.

    โ”‚ Mails      โ”‚   Metric โ”‚
    โ•žโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ก
    โ”‚ Found      โ”‚      227 โ”‚
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
    โ”‚ Rejected   โ”‚        0 โ”‚
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
    โ”‚ Kept       โ”‚      227 โ”‚
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
    โ”‚ Unique     โ”‚        7 โ”‚
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
    โ”‚ Duplicates โ”‚      220 โ”‚
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
    โ”‚ Deleted    โ”‚        0 โ”‚
    โ•˜โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•งโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•›
    โ•’โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•คโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ••
    โ”‚ Duplicate sets                       โ”‚   Metric โ”‚
    โ•žโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ก
    โ”‚ Total                                โ”‚      117 โ”‚
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
    โ”‚ Ignored                              โ”‚        7 โ”‚
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
    โ”‚ Skipped                              โ”‚      110 โ”‚
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
    โ”‚ Rejected (bad encoding)              โ”‚        0 โ”‚
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
    โ”‚ Rejected (too dissimilar in size)    โ”‚        0 โ”‚
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
    โ”‚ Rejected (too dissimilar in content) โ”‚        0 โ”‚
    โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
    โ”‚ Deduplicated                         โ”‚        0 โ”‚
    

    What might be wrong?

    Is there a way to rename the files rather than delete duplicates?

    Thanks for help.

    Vikas

    ๐Ÿ› bug 
    opened by vikasrawal 15
  • No graceful handling of crashes/further Unicode issues

    No graceful handling of crashes/further Unicode issues

    Hi,

    I've had a number of unhandled exceptions related to all the Unicode issues (#32, #33, #35). I accidentally originally installed the Python 2 version of maildir-deduplicate, and it is better on the Python 3 version, but several of my mails still manage to cause unhandled exceptions.

    These seem to predominantly be mails which have been wrongly encoded - which should have been marked and encoded as UTF, but haven't been. Python does seem to recognize something is off and shift those characters to 0xFFFD, the Unicode Replacement Character, but nevertheless fails with UnicodeEncodeError: 'ascii' codec can't encode character '\ufffd' in position 13: ordinal not in range(128).

    I understand that maildir-deduplicate can't magically know in what particular way a fucked up mail was fucked up and treat the wrong data correctly. That mail was encoded wrongly and that's my problem, not maildir-deduplicate's.

    What's annoying me is the lack of handling on the exception. There are over 4000 mails in that maildir, the vast majority of which are perfectly RFC-compliant, and I can't parse that folder because a handful of mails are screwed and maildir-deduplicate doesn't properly handle it.

    I don't expect the software to magically fix broken input. But if I have 1 broken e-mail out of a thousand, I do expect it to just skip the broken one and do the other 999.

    Unicode-errors are the most common ones, but it's not limited to that: I've also had one run fail on me because of a missing header in a collection:

      File "/usr/local/lib/python3.4/dist-packages/maildir_deduplicate/deduplicate.py", line 355, in get_lines_from_message_body
        header_text, sep, body = message.as_string().partition("\n\n")
      File "/usr/lib/python3.4/email/message.py", line 159, in as_string
        g.flatten(self, unixfrom=unixfrom)
      File "/usr/lib/python3.4/email/generator.py", line 112, in flatten
        self._write(msg)
      File "/usr/lib/python3.4/email/generator.py", line 178, in _write
        self._dispatch(msg)
      File "/usr/lib/python3.4/email/generator.py", line 211, in _dispatch
        meth(msg)
      File "/usr/lib/python3.4/email/generator.py", line 269, in _handle_multipart
        g.flatten(part, unixfrom=False, linesep=self._NL)
      File "/usr/lib/python3.4/email/generator.py", line 112, in flatten
        self._write(msg)
      File "/usr/lib/python3.4/email/generator.py", line 178, in _write
        self._dispatch(msg)
      File "/usr/lib/python3.4/email/generator.py", line 211, in _dispatch
        meth(msg)
      File "/usr/lib/python3.4/email/generator.py", line 269, in _handle_multipart
        g.flatten(part, unixfrom=False, linesep=self._NL)
      File "/usr/lib/python3.4/email/generator.py", line 112, in flatten
        self._write(msg)
      File "/usr/lib/python3.4/email/generator.py", line 186, in _write
        msg.replace_header('content-transfer-encoding', munge_cte[0])
      File "/usr/lib/python3.4/email/message.py", line 559, in replace_header
        raise KeyError(_name)
    KeyError: 'content-transfer-encoding'
    

    The fact that you're using exceptions at all is good. But not handling exceptions is bad, and not handling exceptions in a program designed for batch processing is just wrong.

    I will try to hack something up for my local installation and I will submit a patch if I succeed, but this is ultimately a question of design mentality: You are currently placing the burden of dealing with problematic input on the user. You're essentially saying "this program will work fine...if you made sure those 10000 mails you want to scan are all RFC-compliant in advance!".

    I do believe it would greatly increase the usefulness of this tool if you expected it to fail on some messages and dealt with that gracefully, instead of just crashing back into the terminal in the middle of processing.

    Thank you for your efforts. I haven't actually gotten this tool to work yet, but thanks to your work, I at least have a shot at dealing with these mails. I do appreciate the time you're investing.

    ๐Ÿ› bug 
    opened by EvilRenegade 13
  • Implement *-discarded actions

    Implement *-discarded actions

    Preliminary checks

    Describe the bug

    When running mdedup -a delete-discarded -s select-one ./.MyMailDirFolder I get the follwoing result:

    NotImplementedError: delete-discarded action not implemented yet.

    To reproduce

    Steps to reproduce the behavior:

    1. The full mdedup -a delete-discarded -s select-one ./.MyMailDirFolder CLI invocation you used.

      $ mdedup -a delete-discarded -s select-one ./.MyMailDirFolder
      
    2. The data set leading to the bug. Try to produce here the minimal subset of mails leading to the bug, and add copies of those mails (eventually censored). This effort will help maintainers add this particular edge-case to the set of unittests to prevent future regressions. You can reduce down the issue to a particular deduplicate subset by using the --hash-only parameter.

    Expected behavior

    Duplicated emails being deleted

    Is this an expected behaviour?

    โœจ enhancement 
    opened by vladox 12
  • 'module' object has no attribute 'init'

    'module' object has no attribute 'init'

    # pip3 install --user maildir-deduplicate
    [...]
    Successfully installed boltons-18.0.0 click-6.7 click-log-0.2.1 maildir-deduplicate-2.1.0 progressbar2-3.37.1 python-utils-2.3.0 tabulate-0.8.2
    
    # ~/.local/bin/mdedup --help
    Traceback (most recent call last):
      File "/root/.local/bin/mdedup", line 7, in <module>
        from maildir_deduplicate.cli import cli
      File "/root/.local/lib64/python3.4/site-packages/maildir_deduplicate/cli.py", line 51, in <module>
        @click_log.init(logger)
    AttributeError: 'module' object has no attribute 'init'
    
    # python3 --version
    Python 3.4.6
    # pip3 --version
    pip 9.0.1 from /usr/lib64/python3.4/site-packages (python 3.4)
    

    This is on a funtoo system. Used --user so that dependencies wouldn't collide with package manager.

    ๐Ÿ› bug 
    opened by dgasaway 12
  • AttributeError: Message instance has no attribute 'get_all'

    AttributeError: Message instance has no attribute 'get_all'

    Not having much luck getting this to work:

    Traceback (most recent call last):
      File "/tmp/python/bin/mdedup", line 9, in <module>
        load_entry_point('maildir-deduplicate==1.0.1.dev0', 'console_scripts', 'mdedup')()
      File "/tmp/python/local/lib/python2.7/site-packages/click/core.py", line 700, in __call__
        return self.main(*args, **kwargs)
      File "/tmp/python/local/lib/python2.7/site-packages/click/core.py", line 680, in main
        rv = self.invoke(ctx)
      File "/tmp/python/local/lib/python2.7/site-packages/click/core.py", line 1027, in invoke
        return _process_result(sub_ctx.command.invoke(sub_ctx))
      File "/tmp/python/local/lib/python2.7/site-packages/click/core.py", line 873, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "/tmp/python/local/lib/python2.7/site-packages/click/core.py", line 508, in invoke
        return callback(*args, **kwargs)
      File "/tmp/python/local/lib/python2.7/site-packages/click/decorators.py", line 16, in new_func
        return f(get_current_context(), *args, **kwargs)
      File "/tmp/maildir-deduplicate/maildir_deduplicate/cli.py", line 137, in deduplicate
        dedup.add_maildir(maildir)
      File "/tmp/maildir-deduplicate/maildir_deduplicate/deduplicate.py", line 72, in add_maildir
        mail_file, message, self.use_message_id)
      File "/tmp/maildir-deduplicate/maildir_deduplicate/deduplicate.py", line 95, in compute_hash
        canonical_headers_text = cls.canonical_headers(mail_file, message)
      File "/tmp/maildir-deduplicate/maildir_deduplicate/deduplicate.py", line 115, in canonical_headers
        for value in mail.get_all(header):
    AttributeError: Message instance has no attribute 'get_all'
    
    ๐Ÿ› bug 
    opened by brianmay 11
  • Encoding issue

    Encoding issue

    Hi @kdeldycke

    Since the changes we made yesterday I have been able to analyse a bigger set of my maildir. It appears that we missed a few encoding issues. The attached seems to fix them, but checking this on another test-set (specifically a non-English maildir) would be wise.

    Cheers, K

    โœจ enhancement 
    opened by kdm9 10
  • UnicodeDecodeError

    UnicodeDecodeError

    I tried to use mdedup on my maildir with 8276 and got the following error:

    Traceback (most recent call last):
      File "/home/user/bin/mdedup", line 11, in <module>
        sys.exit(cli())
      File "/home/user/.local/lib/python2.7/site-packages/click/core.py", line 716, in __call__
        return self.main(*args, **kwargs)
      File "/home/user/.local/lib/python2.7/site-packages/click/core.py", line 696, in main
        rv = self.invoke(ctx)
      File "/home/user/.local/lib/python2.7/site-packages/click/core.py", line 1060, in invoke
        return _process_result(sub_ctx.command.invoke(sub_ctx))
      File "/home/user/.local/lib/python2.7/site-packages/click/core.py", line 889, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "/home/user/.local/lib/python2.7/site-packages/click/core.py", line 534, in invoke
        return callback(*args, **kwargs)
      File "/home/user/.local/lib/python2.7/site-packages/click/decorators.py", line 17, in new_func
        return f(get_current_context(), *args, **kwargs)
      File "/home/user/.local/lib/python2.7/site-packages/maildir_deduplicate/cli.py", line 139, in deduplicate
        dedup.add_maildir(maildir)
      File "/home/user/.local/lib/python2.7/site-packages/maildir_deduplicate/deduplicate.py", line 80, in add_maildir
        mail_file, message, self.use_message_id)
      File "/home/user/.local/lib/python2.7/site-packages/maildir_deduplicate/deduplicate.py", line 103, in compute_hash
        canonical_headers_text = cls.canonical_headers(mail_file, message)
      File "/home/user/.local/lib/python2.7/site-packages/maildir_deduplicate/deduplicate.py", line 125, in canonical_headers
        canonical_value = cls.canonical_header_value(header, value)
      File "/home/user/.local/lib/python2.7/site-packages/maildir_deduplicate/deduplicate.py", line 148, in canonical_header_value
        value = re.sub('\s+', ' ', value).strip()
      File "/usr/lib/python2.7/re.py", line 155, in sub
        return _compile(pattern, flags).sub(repl, string, count)
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xdc in position 4: ordinal not in range(128)
    

    Unfortunately I can't identify the message, which causes this error. mdedup -v doesn't show more information. How can I find the problematic message?

    ๐Ÿ› bug 
    opened by scus1 10
  • Crash TypeError: 'NoneType' object has no attribute '__getitem__'

    Crash TypeError: 'NoneType' object has no attribute '__getitem__'

    I am getting a reproducible error:

    I use this command python init.py -o /path-to-my-dir/getmaildir/

    This is the whole output (yes, there are a lot of mails in that dir)

    Processing 460581 mails in /mnt/rraid/COMPRESSED/Backup/Mails/getmaildir .........................Traceback (most recent call last):
      File "__init__.py", line 572, in <module>
        main()
      File "__init__.py", line 516, in main
        duplicates_run(opts, maildir_paths)
      File "__init__.py", line 534, in duplicates_run
        mail_count += collate_folder_by_hash(mails_by_hash, maildir, opts.message_id)
      File "__init__.py", line 287, in collate_folder_by_hash
        mail_hash, header_text = compute_hash_key(mail_file, message, use_message_id)
      File "__init__.py", line 271, in compute_hash_key
        canonical_headers_text = get_canonical_headers(mail_file, message)
      File "__init__.py", line 182, in get_canonical_headers
        canonical_value = get_canonical_header_value(header, value)
      File "__init__.py", line 241, in get_canonical_header_value
        utc_timestamp = email.utils.mktime_tz(parsed)
      File "/usr/lib/python2.7/email/_parseaddr.py", line 154, in mktime_tz
        if data[9] is None:
    TypeError: 'NoneType' object has no attribute '__getitem__'
    

    any ideas?

    (update: the error message)

    ๐Ÿ› bug 
    opened by masgo 10
  • Add Python 3.6 support

    Add Python 3.6 support

    The way I understand it, mail-deduplicate now requires python 3.7 or later. Bionic is on 3.6. Given that it is an LTS release of Ubuntu would it be possible to support python 3.6 as well?

    ๐Ÿ™ help wanted ๐ŸŽ feature request 
    opened by leggewie 9
  • Bump click-extra from 3.5.0 to 3.6.0

    Bump click-extra from 3.5.0 to 3.6.0

    Bumps click-extra from 3.5.0 to 3.6.0.

    Release notes

    Sourced from click-extra's releases.

    v3.6.0

    ๐Ÿ Available on PyPi

    Changelog

    Sourced from click-extra's changelog.

    {gh}3.6.0 (2022-12-28) <compare/v3.5.0...v3.6.0>

    • Add new constants to group platforms by family.
    • Add heuristics to recognize new platforms: IBM AIX, Cygwin, FreeBSD, GNU/Hurd, NetBSD, OpenBSD, Oracle Solaris, SunOS, Windows Subsystem for Linux v1 and v2.
    • Document version option usage.
    • Split version code to its own file and tests.
    • Run tests on Python 3.12-dev.
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    ๐Ÿ“ฆ dependencies 
    opened by dependabot[bot] 1
  • Bump coverage from 7.0.0 to 7.0.1

    Bump coverage from 7.0.0 to 7.0.1

    Bumps coverage from 7.0.0 to 7.0.1.

    Changelog

    Sourced from coverage's changelog.

    Version 7.0.1 โ€” 2022-12-23

    • When checking if a file mapping resolved to a file that exists, we weren't considering files in .whl files. This is now fixed, closing issue 1511_.

    • File pattern rules were too strict, forbidding plus signs and curly braces in directory and file names. This is now fixed, closing issue 1513_.

    • Unusual Unicode or control characters in source files could prevent reporting. This is now fixed, closing issue 1512_.

    • The PyPy wheel now installs on PyPy 3.7, 3.8, and 3.9, closing issue 1510_.

    .. _issue 1510: nedbat/coveragepy#1510 .. _issue 1511: nedbat/coveragepy#1511 .. _issue 1512: nedbat/coveragepy#1512 .. _issue 1513: nedbat/coveragepy#1513

    .. _changes_7-0-0:

    Commits
    • c5cda3a docs: releases take a little bit longer now
    • 9d4226e docs: latest sample HTML report
    • 8c77758 docs: prep for 7.0.1
    • da1b282 fix: also look into .whl files for source
    • d327a70 fix: more information when mapping rules aren't working right.
    • 35e249f fix: certain strange characters caused reporting to fail. #1512
    • 152cdc7 fix: don't forbid plus signs in file names. #1513
    • 31513b4 chore: make upgrade
    • 873b059 test: don't run tests on Windows PyPy-3.9
    • 5c5caa2 build: PyPy wheel now installs on 3.7, 3.8, and 3.9. #1510
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    ๐Ÿ“ฆ dependencies 
    opened by dependabot[bot] 1
  • Release v7.1.1

    Release v7.1.1

    Description

    This PR is ready to be merged. The merge event will trigger[^1] the:

    1. creation of a v7.1.1 tag on main branch
    2. build if project based on Poetry, then release to PyPi
    3. publication of a GitHub release

    [^1]: as defined by release.yaml.

    How-to release v7.1.1

    1. click Re-run all jobs from the workflow run, to refresh the release date to today
    2. wait for the re-run to complete and check the result in diff view
    3. click Ready for review button below, to get this PR out of Draft mode
    4. click Rebase and merge button below (โ€ผ๏ธ do not ~Squash and merge~: the auto-tagging job needs the 2 distinct commits in this PR)

    Workflow metadata

    Auto-generated on run #3636851148 by prepare-release job from changelog.yaml workflow.

    ๐Ÿ†™ changelog 
    opened by github-actions[bot] 0
  • Bump minor version to v7.2.0

    Bump minor version to v7.2.0

    Description

    Ready to be merged into main branch, at the discretion of the maintainers, to bump the minor part of the version number.

    To bump version to v7.2.0

    1. click Ready for review button below, to get this PR out of Draft mode
    2. click Rebase and merge button below

    Workflow metadata

    Auto-generated on run #3636851148 by version-increments job from changelog.yaml workflow.

    ๐Ÿ†™ changelog 
    opened by github-actions[bot] 0
  • Bump major version to v8.0.0

    Bump major version to v8.0.0

    Description

    Ready to be merged into main branch, at the discretion of the maintainers, to bump the major part of the version number.

    To bump version to v8.0.0

    1. click Ready for review button below, to get this PR out of Draft mode
    2. click Rebase and merge button below

    Workflow metadata

    Auto-generated on run #3636851148 by version-increments job from changelog.yaml workflow.

    ๐Ÿ†™ changelog 
    opened by github-actions[bot] 0
Releases(v7.1.0)
Owner
Kevin Deldycke
VP, Engineering Manager, Founding Engineer - Billing, Payments & IAM.
Kevin Deldycke
A Pythonic interface for Google Mail

GMail for Python A Pythonic interface to Google's GMail, with all the tools you'll need. Search, read and send multipart emails, archive, mark as read

Charlie Guo 1.7k Dec 29, 2022
A python mailserver meant for friends who value privacy and a hard to use interface....

python-mail A python mailserver meant for friends who value privacy and a hard to use interface.... Basic info This mailserver was just a random proje

Hashm 2 Jan 19, 2022
Suplantar mails de empresas como google, facebook, github, etc...

Suplantar mails de empresas como google, facebook, github, etc...

piter 3 Feb 05, 2022
ๅˆฉ็”จ้˜ฟ้‡Œ็š„ไบ‘ๅ‡ฝๆ•ฐๅ‘้€็”ตๅญ้‚ฎไปถ

alifc_email ไธป่ฆ็‰นๆ€ง ๅˆฉ็”จ้˜ฟ้‡Œ็š„ไบ‘ๅ‡ฝๆ•ฐๅ‘้€็”ตๅญ้‚ฎไปถ ไฝฟ็”จๅœบๆ™ฏ hwไธญ็š„้’“้ฑผ้‚ฎไปถๅ‘้€๏ผŒไธ€ไบ›้‚ฎๆœไผš่งฃๆžๅ‡บ้‚ฎไปถ็š„ๆฅๆบip๏ผˆๆญคๆฅๆบipๅนถไธๆ˜ฏ้‚ฎๆœ็š„ip๏ผŒ่€Œๆ˜ฏไปŽๅฎขๆˆท็ซฏๅ‘้€้‚ฎไปถๆ—ถ๏ผŒ้‚ฎๆœ่‡ชๅŠจๅธฆไธŠ็š„ๅฎขๆˆท็ซฏip๏ผ‰๏ผŒๅฏนไบŽ่ฟ™ไบ›ๆฅๆบipๅฏ่ƒฝไผšๅšไธ€ไบ›้ฃŽๆŽงใ€‚ ๆœฌ้กน็›ฎๅˆฉ็”จไบ‘ๅ‡ฝๆ•ฐๅ‡บๅฃip่พƒๅคšๆฅ็ป•่ฟ‡่ฟ™ไบ›้ฃŽๆŽง ไฝฟ็”จๆ–นๆณ• ้ฆ–

19 Dec 01, 2022
Esio_dev 3 Oct 15, 2021
Use Django admin to manage drip campaign emails using querysets on Django's User model.

Django Drip Drip campaigns are pre-written sets of emails sent to customers or prospects over time. Django Drips lets you use the admin to manage drip

Zapier 630 Nov 16, 2022
Certificate generating and mailing system

skylab-certificate-system Through the this system, you can generate personalized certificates for people with name-surname-mail information in an exce

OฤŸuzhan Ercan 9 Sep 27, 2022
An API to send emails through python3's smtplib module.

An API to send emails through python3's smtplib module. Just configure your SMTP server credentials and you are ready to send a lot of emails through API, designed to be used as a newsletter service.

Adnan Ahmad 15 Nov 24, 2022
Automated email sending application.

autoMail Automated email sending application. This application sends email to a user when added to database. Email message contains the temperature of

Bhat Owais 1 Feb 12, 2022
Collection of emails sent from the Hungarian gov and Viktor Orbรกn to the citizens of Hungary

Public list of Hungary and Viktor Orbรกn's emails since March 2021 Collection of emails sent from the Hungarian government and Viktor Orbรกn to the citi

Miguel Sozinho Ramalho 1 Mar 28, 2022
A light-weight, modular, message representation and mail delivery framework for Python.

Marrow Mailer A highly efficient and modular mail delivery framework for Python 2.6+ and 3.2+, formerly called TurboMail. ยฉ 2006-2019, Alice Bevan-McG

Marrow Open Source Collective 255 Dec 28, 2022
Using this repository you can send mails to multiple recipients.Was created in support of Ukraine, to turn society`s attention to war.

mails-in-support-of-UA Using this repository you can send mails to multiple recipients.Was created in support of Ukraine, to turn society`s attention

Oleksii Budzinskiy 2 Mar 04, 2022
Fastapi mail system sending mails(individual, bulk) attachments(individual, bulk)

Fastapi-mail The fastapi-mail simple lightweight mail system, sending emails and attachments(individual && bulk) ๐Ÿ”จ Installation $ pip install fastap

Sabuhi 399 Dec 29, 2022
This python script will generate passwords for your emails, With certain lengths, And saves them into plain text files.

How to use. Change the Default length of genereated password in default.length.txt Type the email for your account. Type the website that the email an

2 Dec 26, 2021
SMTP checker to check Mail Access via SMTP

SMTP checker to check Mail Access via SMTP with easy usage ! Medusa has been written and tested with Python 3.8. It should run on any OS as long as Python and all dependencies are installed.

h3x0 23 Dec 05, 2022
A functional demo of the O365 Module to send an email on an authenticated, tokenized account.

O365_email A functional demo of the O365 Module to send an email on an authenticated, tokenized account. Prep Create an app in Azure Developer's porta

2 Oct 14, 2022
Email-bomber - Email bomber unlike other email bombers u don't need your gmail email id to use this

Email-bomber - Email bomber unlike other email bombers u don't need your gmail email id to use this

rfeferfefe 82 Dec 17, 2022
A package for sending email from your Pyramid application

pyramid_mailer pyramid_mailer is a package for sending email from your Pyramid application. It is compatible with Python 2.7, 3.4, 3.5, 3.6, and 3.7 a

Pylons Project 50 Sep 17, 2022
faceFarm is an active yahoo email detection script that functions to take over the facebook account using email.

faceFarm โ€“ The simple Email Detector. Email Valid Detector for Facebook (Yahoo) faceFarm is an active yahoo email detection script that functions to t

Fadjrir Herlambang 2 Jan 18, 2022
It s a useful project for developers ... It checks available and unavailable emails

EmailChecker It s a useful project for developers ... It checks available and unavailable emails Installation : pip install EmailChecker Domains are

Sidra ELEzz 19 Jan 01, 2023