{"id":13815255,"url":"https://github.com/robertklep/quotefixformac","last_synced_at":"2026-03-01T13:03:27.629Z","repository":{"id":11552589,"uuid":"14038396","full_name":"robertklep/quotefixformac","owner":"robertklep","description":"QuoteFix for Apple Mail —","archived":false,"fork":false,"pushed_at":"2022-05-19T11:43:30.000Z","size":3566,"stargazers_count":192,"open_issues_count":34,"forks_count":15,"subscribers_count":35,"default_branch":"master","last_synced_at":"2025-10-09T20:16:07.444Z","etag":null,"topics":["apple","mac","mail","plugin","python"],"latest_commit_sha":null,"homepage":"https://github.com/robertklep/quotefixformac/releases/latest","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/robertklep.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-11-01T07:59:15.000Z","updated_at":"2025-10-03T22:20:34.000Z","dependencies_parsed_at":"2022-09-23T23:51:28.167Z","dependency_job_id":null,"html_url":"https://github.com/robertklep/quotefixformac","commit_stats":null,"previous_names":[],"tags_count":139,"template":false,"template_full_name":null,"purl":"pkg:github/robertklep/quotefixformac","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertklep%2Fquotefixformac","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertklep%2Fquotefixformac/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertklep%2Fquotefixformac/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertklep%2Fquotefixformac/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertklep","download_url":"https://codeload.github.com/robertklep/quotefixformac/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertklep%2Fquotefixformac/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29969700,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-01T12:56:10.327Z","status":"ssl_error","status_checked_at":"2026-03-01T12:55:24.744Z","response_time":124,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apple","mac","mail","plugin","python"],"created_at":"2024-08-04T04:03:13.178Z","updated_at":"2026-03-01T13:03:27.612Z","avatar_url":"https://github.com/robertklep.png","language":"Python","funding_links":["https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=4UF2KB2BTW6AC"],"categories":["Python"],"sub_categories":[],"readme":"# QuoteFix for Mac \u003ca href=\"https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=4UF2KB2BTW6AC\"\u003e\u003cimg style=\"vertical-align:middle; opacity:0.3\" src=\"https://www.paypalobjects.com/en_GB/i/btn/btn_donate_SM.gif\"\u003e\u003c/a\u003e\n\n## _Important notice_\n\nI decided to not accept requests for new features for the time being, primarily due to lack of time. Any feature requests will be closed (but tagged so if things quiet down, I can reopen them).\n\nHowever, do keep submitting bug reports. I'll try and fix them as fast as I can.\n\n## Latest releases\n\nThe latest release can always be found [here](https://github.com/robertklep/quotefixformac/releases/).\n\n* [v2.10.0-alpha.1](https://github.com/robertklep/quotefixformac/releases/tag/v2.10.0-alpha.1): Mojave support\n* [v2.9.0](https://github.com/robertklep/quotefixformac/releases/tag/v2.9.0): Official 2.9.0 release\n* [v2.9.0-alpha.1](https://github.com/robertklep/quotefixformac/releases/tag/v2.9.0-alpha.1): High Sierra support\n* [v2.8.0](https://github.com/robertklep/quotefixformac/releases/tag/v2.8.0): Official 2.8.0 release\n* [v2.8.0-alpha.6](https://github.com/robertklep/quotefixformac/releases/tag/v2.8.0-alpha.6): Sierra 10.12.4 support\n* [v2.8.0-alpha.5](https://github.com/robertklep/quotefixformac/releases/tag/v2.8.0-alpha.5): bugfixes\n* [v2.8.0-alpha.4](https://github.com/robertklep/quotefixformac/releases/tag/v2.8.0-alpha.4): bugfixes\n* [v2.8.0-alpha.3](https://github.com/robertklep/quotefixformac/releases/tag/v2.8.0-alpha.3): Sierra 10.12.2 (beta) support (also works for 10.12.2 final)\n* [v2.8.0-alpha.2](https://github.com/robertklep/quotefixformac/releases/tag/v2.8.0-alpha.2): Sierra 10.12.1 (beta) support\n* [v2.8.0-alpha.1](https://github.com/robertklep/quotefixformac/releases/tag/v2.8.0-alpha.1): Sierra support\n* [v2.7.4](https://github.com/robertklep/quotefixformac/releases/tag/v2.7.4): support for 10.11.4\n* [v2.7.3](https://github.com/robertklep/quotefixformac/releases/tag/v2.7.3): somewhat fixes #57\n* [v2.7.2](https://github.com/robertklep/quotefixformac/releases/tag/v2.7.2): support for 10.11.2\n* [v2.7.1](https://github.com/robertklep/quotefixformac/releases/tag/v2.7.1): minor update to enable logging of template errors\n* [v2.7.0](https://github.com/robertklep/quotefixformac/releases/tag/v2.7.0): official 10.11 (El Capitan) support\n* [v2.6.0](https://github.com/robertklep/quotefixformac/releases/tag/v2.6.0): official 10.10 support, plus rewrites of several parts of the plug-in\n* [v2.5.7](https://github.com/robertklep/quotefixformac/releases/tag/v2.5.7): fixes #21\n* [v2.5.6](https://github.com/robertklep/quotefixformac/releases/tag/v2.5.6): 10.9.4 support\n* [v2.5.5](https://github.com/robertklep/quotefixformac/releases/tag/v2.5.5): bugfixes\n* [v2.5.4](https://github.com/robertklep/quotefixformac/releases/tag/v2.5.4): 10.9.3 support\n* [v2.5.3](https://github.com/robertklep/quotefixformac/releases/tag/v2.5.3): 10.9.2 support\n* [v2.5.2](https://github.com/robertklep/quotefixformac/releases/tag/v2.5.2): fixed bug in date formatting\n* [v2.5.1](https://github.com/robertklep/quotefixformac/releases/tag/v2.5.1): 10.9.1 support\n\n## FAQ\n\nSee [the wiki](https://github.com/robertklep/quotefixformac/wiki/FAQ---Frequently-Asked-Questions).\n\n## What is it?\n\nQuoteFix is a plug-in for Mail.app which fixes some issues with replying to\ne-mail:\n\n* it tries to remove the signature from the original message;\n* it removes certain unnecessary empty lines;\n* it positions the cursor below the original message, instead of above it (in other words, bottom-posting instead of top-posting);\n* it can (optionally) prune nested quotes from a specific level and above;\n\nIt also provides customized attributions for replies and forwards.\n\n## Installation\n\nBefore installing the plug-in, you'll need to make sure that Mail.app's\nplug-in support is turned on. For this, execute the following two commands\nin Terminal.app:\n```\ndefaults write ~/Library/Containers/com.apple.mail/Data/Library/Preferences/com.apple.mail.plist EnableBundles -bool true\ndefaults write ~/Library/Containers/com.apple.mail/Data/Library/Preferences/com.apple.mail.plist BundleCompatibilityVersion 4\n```\n\nNext, perform the following steps:\n\n* Download the plugin if you haven't done so already\n* Navigate in Finder to `~/Library/Mail/` (where `~` means: your home directory)\n* If a `Bundles` folder doesn't yet exist, create an empty one\n* Extract the downloaded ZIP file and copy `QuoteFix.mailbundle` into the Bundles folder\n* Lastly, quit Mail.app if it's running, and start it up again.\n\nIn case you run into any problems, or want to uninstall QuoteFix, just\nremove QuoteFix.mailbundle from the bundle-folder and restart Mail.app.\n\n## Usage\n\nAfter installation, QuoteFix is enabled. It will perform its magic\nautomatically when you reply to, or forward, messages.\n\nThe behaviour of the plug-in is customizable via its preferences. QuoteFix\nhas it's own preference pane in the preferences window of Mail.app. Most\npreferences speak for themselves, or have a useful tooltip which pops up\nwhen you hover the cursor above it.\n\nIf you temporarily want to turn off QuoteFix, but don't want to uninstall\nit, check off the *QuoteFix is enabled* checkbox. As of version 2.3.1,\n(de)activating QuoteFix can be done from a menu item in the Mail menu. You\ncould use [the standard way of assigning a keyboard shortcut to a menu item\nin Mac OS X](http://lifehacker.com/343328/create-a-keyboard-shortcut-for-any-menu-action-in-any-program) to enable or disable QuoteFix with a keyboard shortcut.\n\n## Customized Attributions\n\nQuoteFix also provides the ability to define your own attribution lines\n(the first line of a reply/forward, usually looking something like\n`On SOME DATE, at SOME TIME, SOMEONE wrote:`).\n\nCustomized attributions work by way of templates: you define a template in\nthe preferences, and parts of the template will – at the time of replying\nor forwarding – be replaced by values reflecting parts of the message you\nare replying to or forwarding.\n\nTemplating works by replacing template variables with values. A template\nvariable looks like this: `${VARIABLE}`. It will be replaced with a value\ndepending on what `VARIABLE` contains.\n\nA (non-exhaustive) list of variables you can use:\n\n\u003ctable border=0\u003e\n    \u003ctr\u003e\n        \u003ctd valign=\"top\"\u003e\u003ccode\u003e${message.from}\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\n            Name and e-mail address of sender of message:\u003cbr/\u003e\n            \u003ci\u003eYour Friend \u0026lt;yourfriend@example.com\u0026gt;\u003c/i\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd valign=\"top\"\u003e\u003ccode\u003e${message.from.name}\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\n            Name of sender of message:\u003cbr/\u003e\n            \u003ci\u003eYour Friend\u003c/i\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd valign=\"top\"\u003e\u003ccode\u003e${message.from.email}\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\n            E-mail address of sender of message:\u003cbr/\u003e\n            \u003ci\u003eyourfriend@example.com\u003c/i\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd valign=\"top\"\u003e\u003ccode\u003e${message.to}\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\n            Your e-mail address (this is the address that was used for\n            the message to reach you). This is more like the\n            \u003ccode\u003eDelivered-To\u003c/code\u003e header than the \u003ccode\u003eTo\u003c/code\u003e\n            header (for that, see \u003ccode\u003e${message.recipients}\u003c/code\u003e)\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd valign=\"top\"\u003e\u003ccode\u003e${message.recipients}\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\n            A list of all the recipients of the message, as mentioned in\n            both the \u003ccode\u003eTo\u003c/code\u003e and \u003ccode\u003eCc\u003c/code\u003e headers.\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd valign=\"top\"\u003e\u003ccode\u003e${message.recipients.to}\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\n            A list of the recipients of the message mentioned in\n            the \u003ccode\u003eTo\u003c/code\u003e header.\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd valign=\"top\"\u003e\u003ccode\u003e${message.recipients.cc}\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\n            A list of the recipients of the message mentioned in\n            the \u003ccode\u003eCc\u003c/code\u003e header.\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd valign=\"top\"\u003e\u003ccode\u003e${message.subject}\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eThe subject of the message.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd valign=\"top\"\u003e\n            \u003ccode\u003e${message.sent}\u003c/code\u003e\u003cbr/\u003e\n            \u003ccode\u003e${message.received}\u003c/code\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            Sent/received timestamps. If you want more finegrained\n            control over formatting timestamps, these variables split\n            into separate fields: \u003ccode\u003eyear\u003c/code\u003e, \u003ccode\u003emonth\u003c/code\u003e,\n            \u003ccode\u003eday\u003c/code\u003e, \u003ccode\u003ehour\u003c/code\u003e, \u003ccode\u003ehour12\u003c/code\u003e,\n            \u003ccode\u003eampm\u003c/code\u003e, \u003ccode\u003eminute\u003c/code\u003e, \u003ccode\u003esecond\u003c/code\u003e,\n            \u003ccode\u003eweeknumber\u003c/code\u003e, \u003ccode\u003emonthshort\u003c/code\u003e,\n            \u003ccode\u003emonthlong\u003c/code\u003e, \u003ccode\u003edayshort\u003c/code\u003e,\n            \u003ccode\u003edaylong\u003c/code\u003e, \u003ccode\u003edate\u003c/code\u003e, \u003ccode\u003etime\u003c/code\u003e.\u003cbr/\u003e\n            Use these like so: \u003ccode\u003e${message.sent.year}\u003c/code\u003e.\n            \u003cp\u003e\u003ca href=\"#advanced-datetime-formatting\"\u003eSee below for more advanced date/time formatting\n                options.\u003c/a\u003e\u003c/p\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\nIf you want even more freedom in formatting attribution lines, there's an\nexperimental feature (which can be enabled in the *Advanced* preferences)\nwhich enables conditional statements, string/date formatting, and much\nmore. This is based on a modified version of the [pyratemp](http://www.simple-is-better.org/template/pyratemp.html) templating\nlibrary for Python written by Roland Koebler.\n\nA small example of what's possible:\n```\nFrom: ${message.from}\n{% if message.recipients.to %}\n To: ${message.recipients.to.join(\"; \", \"name\")}\n{% end %}\n{% if message.recipients.cc %}\n Cc: ${message.recipients.cc.join(\"; \", \"name\")}\n{% end %}\nSubject: ${message.subject.lower()}\nSent-Date: ${message.sent.strftime(\"%d-%m-%Y\")}\n```\n\nYou can also enable HTML-formatting for your custom attributions. For this\nto work, the (outgoing) message format should be *Rich Text*. You can have\nQuoteFix automatically convert a message to Rich Text if your attribution\nshould be interpreted in HTML. Otherwise, QuoteFix will issue a warning.\n\nIf you want to mimic the attribution generated by Outlook, try this (with\nHTML-formatting enabled):\n```\n\u003cb\u003eFrom:\u003c/b\u003e ${message.from}\n\u003cb\u003eDate:\u003c/b\u003e ${message.received}\n\u003cb\u003eTo:\u003c/b\u003e ${message.to}\n\u003cb\u003eSubject:\u003c/b\u003e ${message.subject}\n```\nWhen you're editing your customized attribution, QuoteFix will generate an\napproximate preview as tooltip of the text field you're entering the\nattribution in.\n\n## Advanced date/time formatting\n\nIf you want even more finegrained control over the formatting of dates and\ntimes, you can enable *\"advanced templating\"* in the Advanced preferences,\nafter which date/time variables like `message.sent` and `message.received`\nwill have `.format()` and `.strftime()` methods with which you can format the\noutput of the objects.\n\nFunctionally, these two methods perform the same operation – namely\nformatting date/time objects – the difference is in the formatting strings\nused:\n\n*  `.strftime()` uses the common Unix function with the same name for\n   formatting. [Look here for more information](http://docs.python.org/library/time.html#time.strftime).\n*  `.format()` uses the Unicode date format patterns. [Look here for more\n   information](http://unicode.org/reports/tr35/tr35-10.html#Date_Format_Patterns).\n\nAn example:\n```\n${message.sent.format(\"EEE MMM dd yyyy HH:mm:ss\")}\n```\nThis will output: `Sun Nov 06 2011 10:19:34`\n\nSimilarly, with `.strftime()`:\n```\n${message.sent.strftime(\"%a %b %d %Y %H:%M:%S\")}\n```\n\nHowever: the output will be generated in the current locale, which means\nthat it will be formatted according to your local language settings.\n\nTo change this, both methods accept a second argument: a locale\nidentifier. You can use it to convert the output to a certain locale,\ninstead of the default locale (which can be changed in the *System\nPreferences* of Mac OS X: *Language \u0026 Text \u003e Formats*).\n\nThe same example as above, but with a different locale:\n```\n${message.sent.format(\"EEE MMM dd yyyy HH:mm:ss\", 'fr_FR')}\n```\nThe output: `dim. nov. 06 2011 10:19:34`\n\nIf you want the default format, just in a different locale, use the\n`.locale()` method:\n```\n${message.sent.locale('fr_FR')}\n```\n\n## Enabling/disabling the plug-in\n\nQuoteFix has various ways of turning off its behaviour, short of\nuninstalling it:\n\n* You can turn QuoteFix off from its preferences; this will disable the plug-in until you enable it again;\n* You can quickly turn the plug-in on/off from the Mail menu. If you want, you can even assign a keyboard shortcut to this menu item from System Preferences;\n* You can toggle the enable (or disable) status of QuoteFix for a single message by pressing down `Option` whilst initiating a Reply/Forward action. That is:\n    * When QuoteFix is **disabled**, pressing `Option` will *enable* QuoteFix for that particular message only;\n    * Likewise: when QuoteFix is **enabled**, pressing `Option` will *disable* QuoteFix for that particular message only;\n\n## Building the plug-in\n\nIf you want to build the plug-in yourself, ideally you need to use a non-system Python interpreter (although not *strictly* necessary if you want to use the plug-in on your system only).\n\nI use Python 2.7.5 as installed by [Homebrew](http://brew.sh/). I also use [virtualenv](https://pypi.python.org/pypi/virtualenv/) to create a clean environment in which to build the plug-in.\n\nMake sure the following requirements are installed:\n```\npip install pyobjc # might take some time\npip install py2app\n```\n\nNext, clone the repository:\n```\ngit clone https://github.com/robertklep/quotefixformac.git\n```\n\nAnd build the plug-in:\n```\ncd quotefixformac\npython setup.py py2app\n```\n\nThis will build the plug-in, which can be located in `dist/`.\n\n## Licence \u0026 copyright\n\nThis plugin is written by Robert Klep and is provided \"as-is\", without any\nwarranties whatsoever.\n\nQuoteFix source, downloads and support is hosted by GitHub at\nhttps://github.com/robertklep/quotefixformac\n\nQuoteFix uses the Sparkle framework from Andy Matuschak to provide software\nupdates, which comes with the following permission notice:\n\n\u003e  Copyright (c) 2006 Andy Matuschak Permission is hereby granted, free of\n\u003e  charge, to any person obtaining a copy of this software and associated\n\u003e  documentation files (the \"Software\"), to deal in the Software without\n\u003e  restriction, including without limitation the rights to use, copy,\n\u003e  modify, merge, publish, distribute, sublicense, and/or sell copies of\n\u003e  the Software, and to permit persons to whom the Software is furnished to\n\u003e  do so, subject to the following conditions: The above copyright notice\n\u003e  and this permission notice shall be included in all copies or\n\u003e  substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\",\n\u003e  WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT\n\u003e  LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\n\u003e  PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n\u003e  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n\u003e  AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n\u003e  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\u003e  SOFTWARE.\n\nSee also [http://sparkle.andymatuschak.org/](http://sparkle.andymatuschak.org/).\n\n# Like Quotefix?\n\nConsider making a donation: \u003ca href=\"https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=4UF2KB2BTW6AC\"\u003e\u003cimg style=\"vertical-align:middle\" src=\"https://www.paypalobjects.com/en_GB/i/btn/btn_donate_SM.gif\"\u003e\u003c/a\u003e\n\nETH: 0x93eaE7ad708EF996bdd2d03d42D10dB278E29172\t\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobertklep%2Fquotefixformac","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frobertklep%2Fquotefixformac","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobertklep%2Fquotefixformac/lists"}