| <!DOCTYPE html><html><head><meta charset="utf-8"><title>Apache Pony Mail (Incubating)</title> |
| <link rel="stylesheet" type="text/css" href="/css/default.css"/> |
| <link rel="stylesheet" type="text/css" href="/css/fa/fa.css"/> |
| <link rel="apple-touch-icon" sizes="57x57" href="/icons/apple-icon-57x57.png"> |
| <link rel="apple-touch-icon" sizes="60x60" href="/icons/apple-icon-60x60.png"> |
| <link rel="apple-touch-icon" sizes="72x72" href="/icons/apple-icon-72x72.png"> |
| <link rel="apple-touch-icon" sizes="76x76" href="/icons/apple-icon-76x76.png"> |
| <link rel="apple-touch-icon" sizes="114x114" href="/icons/apple-icon-114x114.png"> |
| <link rel="apple-touch-icon" sizes="120x120" href="/icons/apple-icon-120x120.png"> |
| <link rel="apple-touch-icon" sizes="144x144" href="/icons/apple-icon-144x144.png"> |
| <link rel="apple-touch-icon" sizes="152x152" href="/icons/apple-icon-152x152.png"> |
| <link rel="apple-touch-icon" sizes="180x180" href="/icons/apple-icon-180x180.png"> |
| <link rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"> |
| <link rel="icon" type="image/png" sizes="32x32" href="/icons/favicon-32x32.png"> |
| <link rel="icon" type="image/png" sizes="96x96" href="/icons/favicon-96x96.png"> |
| <link rel="icon" type="image/png" sizes="16x16" href="/icons/favicon-16x16.png"> |
| <link rel="manifest" href="/icons/manifest.json"> |
| <meta name="msapplication-TileColor" content="#ffffff"> |
| <meta name="msapplication-TileImage" content="/icons/ms-icon-144x144.png"> |
| <meta name="theme-color" content="#ffffff"> |
| </head><body> |
| <div id="titlebar"> |
| <a href="/contribute.html"><img align='left' style="width: 130px; height: 125px; position: relative; left: -6px; top: -6px; border: 0;" src="/images/devme.png" alt="Fork/Hack on Pony Mail"></a> |
| <a href='/'><img src="/images/ponymail.svg" style="width: 110px; margin-left: -10px; margin-right: 20px; height: auto;" align="left"/></a> |
| <h1><a id="title" href="/" style="color: #FFF !important;">Apache Pony Mail™ (Incubating)</a></h1> |
| <div id="menubar"> |
| <ul> |
| <li><a href="/docs.html"><i class="fa fa-book"></i><span>Documentation</span></a></li> |
| <li><a href="/source.html"><i class="fa fa-git-square"></i><span>Source</span></a></li> |
| <li><a href="/downloads.html"><i class="fa fa-cloud-download"></i><span>Download</span></a></li> |
| <li><a href="/support.html"><i class="fa fa-question-circle"></i><span>Get support</span></a></li> |
| <li><a href="/contribute.html"><i class="fa fa-share-alt"></i><span>Contribute</span></a></li> |
| <li><a href="/about.html"><i class="fa fa-users"></i><span>About</span></a></li> |
| </ul> |
| </div> |
| </div> |
| <h1 id='downloadapacheponymailincubating'>Download Apache Pony Mail (Incubating)<a href='#downloadapacheponymailincubating' style='color: rgba(0,0,0,0);'>¶</a></h1> |
| <p>Be sure to <a href="https://www.apache.org/info/verification">verify your downloads</a> using the folowing <a href="https://downloads.apache.org/incubator/ponymail/KEYS">KEYS</a>.</p> |
| <p>The latest release of Pony Mail is 0.11, released on 2019-04-20. You can fetch it here:</p> |
| <p><a href="https://www.apache.org/dyn/closer.lua/incubator/ponymail/apache-pony-mail-0.11-incubating.tar.gz">Download Apache Pony Mail (Incubating) 0.11 from a mirror</a> |
| Verify: |
| <a href="https://downloads.apache.org/incubator/ponymail/apache-pony-mail-0.11-incubating.tar.gz.asc">asc</a> |
| <a href="https://downloads.apache.org/incubator/ponymail/apache-pony-mail-0.11-incubating.tar.gz.sha256">sha256</a></p> |
| <h2 id='changesin011'>Changes in 0.11:<a href='#changesin011' style='color: rgba(0,0,0,0);'>¶</a></h2> |
| <ul> |
| <li>Bug: Tidy up list names on seeding pages to avoid breakage</li> |
| <li>Enh: Enforce UTF-8 in content headers (#479)</li> |
| <li>Bug: elastic.lua#scroll forces sort to use _doc (#478)</li> |
| <li>Bug: cannot download more than 10K mails to a mbox file (#475)</li> |
| <li>Bug: no need to sort after scroll (#477)</li> |
| <li>Enh: Ensure non-printable chars are not lost in source and mbox output (#476)</li> |
| <li>Enh: display buttons even if no mails are found in a month (#470)</li> |
| <li>Bug: Javascript URLs must always use URL_BASE (#469)</li> |
| <li>Bug: setup.py uses ES library version to decide what features the database supports (#464)</li> |
| <li>Various tidyups suggested by Pylint</li> |
| <li>Bug: archiver.py can never detect content-type: flowed (#461)</li> |
| <li>Bug: import-mbox.py: imap code should not reset ES instance (#460)</li> |
| <li>Bug: tmpname used before it has been set up in import-mbox (#458)</li> |
| <li>Bug: variable 'mid' used before assignment in archiver.py (#459)</li> |
| <li>Enh: remove duplicated code in tools scripts by using elastic.py module (#456)</li> |
| <li>Enh: separate module to read config file </li> |
| <li>Bug: push-failures.py expects to find non-existent 'id' key in json file (#454)</li> |
| <li>Bug: ES 5.x does not support word-cloud (stats.lua) (#345)</li> |
| <li>Add version info to elastic module</li> |
| <li>Bug: setup.py fails with ES2 - fielddata (#453)</li> |
| <li>Bug: setup.py --default should not prompt for urlPrefix (#452)</li> |
| <li>Bug: copy-list.py does not work (#450)</li> |
| <li>Bug: unnecessary test (will always succeed) in copy-list.py (#451)</li> |
| <li>Bug: archiver ignores failures if dumponfail is not defined (#449)</li> |
| <li>Enh: make MboxoFactory optional (#442)</li> |
| <li>Bug: duplication of data in response from thread.lua (#440)</li> |
| <li>Bug: Indentation in mail content (leading white-space) not shown (#432)</li> |
| <li>Bug: does not make sense to allow empty domain name in LID (#434)</li> |
| <li>Bug: Inconsistent LID validation (#356)</li> |
| <li>Enh: option to reduce stats.lua output (#438)</li> |
| <li>Bug: Threading should take References header into account (#444)</li> |
| </ul> |
| <h2 id='changesin010'>CHANGES in 0.10:<a href='#changesin010' style='color: rgba(0,0,0,0);'>¶</a></h2> |
| <ul> |
| <li>Bug: Use correct dependency order to fix OAuth login problem (#431)</li> |
| <li>Bug: HTTPS connections may fail with ES 6.x libraries (#425)</li> |
| <li>Enh: Support ES 6.x library (#424)</li> |
| <li>Enh: Optionally dump JSON documents to disk if push to ES fails (#423).</li> |
| <li>Bug: GUI can hide reply text when analysing quoted text (#421)</li> |
| <li>mbox.lua output filename does not match ISO standard (#420)</li> |
| <li>Added empty line quotes to JS compaction feature</li> |
| <li>Changed default theme to 'compact'</li> |
| <li>Added --dbprefix for setup.py for proxied ES databases</li> |
| <li>Added fielddata values to email subjects to fix word clouds on ES>=5.x</li> |
| <li>Bug: MboxoReader needs to return all data for a read() call (#415)</li> |
| <li>Bug: import-mbox should not check database during a dry run (#413)</li> |
| <li>Archiver loses some message information (#402)</li> |
| <li>Mail parsing can change source spacing (#410)</li> |
| <li>Bug: use actual envelope header if present (#412)</li> |
| <li>Bug: stats.lua should use UTC for calculating year and month (#409)</li> |
| <li>Bug: atom.lua - should generate date in UTC, not local time (#408)</li> |
| <li>Bug: shorten links does not work with cluster ids (#406)</li> |
| <li>Drop lid from 'cluster' hash - it's already in the id (#400)</li> |
| <li>Enh: 'cluster' generator ids are not sufficiently unique (#398)</li> |
| <li>archiver/importer adds a Message-Id to mails if they don't have one (#403)</li> |
| <li>Fixed an issue with ID generation where an email body does not exist</li> |
| <li>Fixed an issue where favorites could contain null entries due to missing GC (#392)</li> |
| <li>Added sample configs for Pony Mail (#374)</li> |
| <li>Renamed ll.py to list-lists.py (#378)</li> |
| <li>ID generators have now been split into a separate library (generators.py)</li> |
| <li>more comprehensive ID generation mechanisms</li> |
| <li>private messages are now included in downloads if the user has access to them (#169, #108)</li> |
| <li>mbox export now generates valid From_ line (#190)</li> |
| <li>mbox export now escapes 'From ' lines in body text (#188)</li> |
| <li>stats.lua ignores negated words when building the word cloud (#277)</li> |
| <li>combine pminfo.lua aggregations for efficiency (#273)</li> |
| <li>various typos fixed and other tidyup</li> |
| <li>quicker to fetch only aggregation results where the hits are not needed (#271)</li> |
| <li>archiver and import-mbox create different mbox_source entries - drop spurious importer field (#266)</li> |
| <li>make it easier to test the archiver - --dry option (#264)</li> |
| <li>import-mbox dry run should exercise as much as possible of the code (#258)</li> |
| <li>archiver and import-mbox handle invalid encodings differently (#261)</li> |
| <li>archiver unconditionally ignores encoding errors (#260)</li> |
| <li>archiver does not allow for attachment which is not multipart (#257)</li> |
| <li>archiver drops empty attachments (#256)</li> |
| <li>archiver drops attachment with utf-8 encoded name (#255)</li> |
| <li>import-mbox.py and archiver.py create different source texts (#251)</li> |
| <li>import-mbox.py messages need the thread number (#248)</li> |
| <li>import-mbox.py does not identify which messages failed (#246)</li> |
| <li>edit-list.py does not process --obfuscate if it is used alone (#238)</li> |
| <li>edit-list.py does not honour --test with --desc (#237)</li> |
| <li>elastic.lua checkReturn() does not properly check return code (#236)</li> |
| <li>import-mbox.py keeps rechecking if the index exists (#233)</li> |
| <li>import-mbox.py allows invalid lid (#230)</li> |
| <li>import-mbox.py --project qualifier regex errors (#229)</li> |
| <li>properties missing from mappings in setup.py (#228)</li> |
| <li>setup.py does not create mbox mapping property 'cc' (#226)</li> |
| <li>setup.py does not create notifications/account mappings (#225)</li> |
| <li>archiver fails when adding entries to the notifications table (#223)</li> |
| <li>elastic.lua index function should not auto-generate ids (#222)</li> |
| <li>coffee script generation order seems to vary between OSes (#215)</li> |
| <li>display treats >From as quoted text (#213)</li> |
| <li>import-mbox.py should be able to import individual files (#210)</li> |
| <li>import-mbox.py should not start more threads than there are files (#209)</li> |
| <li>No point creating an 'Other lists:' drop-down if it will only contain a single entry (#208)</li> |
| <li>combine.sh uses GNU-only sed extension -s (--separate); it's not needed (#187)</li> |
| <li>setup.py can overwrite existing config files (#185)</li> |
| <li>setup.py does not handle connection failure well (#184)</li> |
| <li>Other lists drop-down should be sorted by name (#183)</li> |
| <li>does not handle missing or empty subjects well (#182)</li> |
| <li>import-mbox.py does not report if List-Id is missing (#174)</li> |
| <li>mailinglists index should be created by setup.py or made truly optional (#164)</li> |
| <li>elastic.lua checkReturn should throw errors in the callers context (#150)</li> |
| <li>elastic.lua does not always check http return status (#145)</li> |
| <li>use of global variables in handle() methods (#141)</li> |
| <li>lib/elastic.lua: various bugs (#139)</li> |
| <li>user.getUser() overwrites login global variable; defines unused variable 'usr' (#138)</li> |
| <li>import-mbox.py does not handle protocol choice well (#135)</li> |
| <li>setup.py does not handle empty response to port number well (#133)</li> |
| <li>broken mail thread; attempted recovery causes unhandled error (#124)</li> |
| <li>https://lists.apache.org/list.html?dev@eagle.apache.org fails (#121)</li> |
| <li>get by message-id does not work (#88)</li> |
| <li>stored date uses locale-dependent conversion and is ambiguous (#86)</li> |
| <li>search strings not properly quoted. (#76)</li> |
| <li>pminfo.lua creates top100 sender information but it's not used (#282)</li> |
| <li>stats.lua could use single aggregate query to get first and last years (#276)</li> |
| <li>stats.lua can fail when creating top10 senders (#283)</li> |
| <li>ponymail.js/formatDate may show the wrong timezone (#285)</li> |
| <li>archiver.py fails when attachment name is not ASCII (#287)</li> |
| <li>emails with no body content are ignored (#109)</li> |
| <li>does not handle text/enriched mails (#289)</li> |
| <li>ll.py retrieves results but does not use them (#291)</li> |
| <li>lib/aaa.lua various bugs (#140)</li> |
| <li>lua modules should define local functions only (#294)</li> |
| <li>inconsistent rights checking (#267)</li> |
| <li>thread.lua fails to fetch rights when fetching private child of public parent (#296)</li> |
| <li>typo in all example aaa modules: xemail != exmail (#299)</li> |
| <li>lib/aaa.lua overwrites local customisations on updates (#292)</li> |
| <li>rights checking should be localised (#293)</li> |
| <li>pminfo.lua does some unnecessary work (#220)</li> |
| <li>stats.lua uses inconsistent email canonicalisation code (#300)</li> |
| <li>stats.lua - inconsistent output between slow_count = true/false (#301)</li> |
| <li>confusion of storageAvailable and localStorage in ponymail.js (#194)</li> |
| <li>unnecessary double-checking of window.sessionStorage in ponymail.js (#193)</li> |
| <li>lua scripts not using cross.contentType() compatibility function (#218)</li> |
| <li>code assumes that subject is always present in an e-mail (#149)</li> |
| <li>elastic.lua:getHeaders uses different sort field (#146)</li> |
| <li>redundant matching of same string (#117)</li> |
| <li>ponymail.js uses unsupported preferences.lua parameter (#165)</li> |
| <li>preferences.lua never fetches descriptions (#163)</li> |
| <li>api.html does not document all the stats.lua parameters (#115)</li> |
| <li>allow preferences to use non-default mail port (#303)</li> |
| <li>preferences.lua should not return list data if it was not requested (#305)</li> |
| <li>preferences.lua should not update the user account if the mail is not sent OK (#306)</li> |
| <li>alts.js does not check for errors when calling preferences.lua (#304)</li> |
| <li>An unauthorised private mail should be treated like a non-existent mail (#295)</li> |
| <li>Move common anonymizing code to utils (#308)</li> |
| <li>Move extractCanonEmail to utils</li> |
| <li>preferences does not properly remove nulls from account.credentials.altemail (#309)</li> |
| <li>manage e-mails can create multiple identical alternate addresses (#307)</li> |
| <li>elastic.get does not return if a document is not found but some callers overlook this (#137)</li> |
| <li>pcall() idiom to protect against elastic.lua exceptions is flawed (#162)</li> |
| <li>unhelpful error reporting for invalid Permalinks/Source links (#123)</li> |
| <li>import-mbox.py fails to unescape >From lines (#212)</li> |
| <li>Updated Google+ API for logins</li> |
| <li>Fixed a redirect bug with oauth</li> |
| <li>Removed support for Mozilla Persona</li> |
| <li>elastic.scroll does not return nil sid when there are no more results (#315)</li> |
| <li>stats.lua should return firstMonth and lastMonth (#120)</li> |
| <li>many python scripts insist on Python 3.4 (#312)</li> |
| <li>config.hidePrivate should be dropped (#272)</li> |
| <li>limit filter is deprecated in ES 2.0; dropped in ES 5.0 (#318)</li> |
| <li>domain parameter is not used externally (#319)</li> |
| <li>pminfo.lua fetches and saves epoch but never uses it #320</li> |
| <li>pminfo.lua - no need to use scroll unless doc count > 10000 (#321)</li> |
| <li>pminfo.lua - scroll/scan ignores sort order (#322)</li> |
| <li>flat view mode does not show first line of body (#198)</li> |
| <li>Fetch URLBase once in Javascript</li> |
| <li>absolute URLs must be prefixed with URLBase in JS files (#327)</li> |
| <li>cannot use absolute URLs in HTML pages (#328)</li> |
| <li>setup.py now prompts for shard and replica counts when creating the index (#313)</li> |
| <li>'hot topics' feature should use terms, not significant_terms (#329)</li> |
| <li>stats.lua - slow_count option is unnecessary (#323)</li> |
| <li>stats.lua updates senders array unnecessarily in statsOnly (quick) mode (#330)</li> |
| <li>stats.lua returns email time instead of os time in unixtime field (#331)</li> |
| <li>stats.lua - cache causes inconsistent output when quick is used (#118)</li> |
| <li>does not show mixed private/public lists unless logged in (#70)</li> |
| <li>inconsistent error reporting for invalid mailing lists (#112)</li> |
| <li>Always use Javascript conditional blocks (#333)</li> |
| <li>links in stats pane don't set up the correct date range (#106)</li> |
| <li>code should delete scroll id after use (#336)</li> |
| <li>ll.py - Make --count work with --pretty; show private message counts</li> |
| <li>DRY: move leapYear and end of month calculations to utils</li> |
| <li>indicate which months are outside the archive span for a list (#340)</li> |
| <li>default to medium ID generator (#343)</li> |
| <li>scroll/scan is not supported in ES 5.x (#344)</li> |
| <li>GUI does not report maxResult truncation correctly (#335)</li> |
| <li>ponymail.js creates/displays dates with no timezone - confusing (#286)</li> |
| <li>Make it clearer when you're not logged in. (#195)</li> |
| <li>list name not normalised when imported (#253)</li> |
| <li>GUI ignores date span in list.html URI if query is blank (#346)</li> |
| <li>search phrase dropped from list.html URI if date span is yyyy-mm (#347)</li> |
| <li>stats.lua first/last dates don't always agree with visible mails (#350)</li> |
| <li>Use constant for max list count instead of 500000 (#352)</li> |
| <li>Tighten wildcard searches to only search in the same domain level (#348)</li> |
| <li>useless conditional when fetching id parameter (#353)</li> |
| <li>ES 5.0 no longer supports the write consistency option for index(); archiver fails (#351)</li> |
| <li>Cookie should use httpOnly and Secure (#355)</li> |
| <li>Allow insecure cookie (config item intended for local testing only) (#355)</li> |
| <li>crash in import-mbox when list-id is missing and --lid is not provided (#358)</li> |
| <li>archiver traverses multi-part message parts twice (#359)</li> |
| <li>Add unsubscribe button (#362)</li> |
| <li>Bug: invalid style setting: overflow:hide => overflow:hidden (#364)</li> |
| <li>Bug: wordcloud.js logs to the console (#363)</li> |
| <li>Bug: source.lua does not specify the charset (#367)</li> |
| <li>Bug: archiver stores attachment binary data types with embedded newlines (#262)</li> |
| <li>Bug: may corrupt 8bit message source if it is not encoded in UTF-8 (#366)</li> |
| <li>Enh: make debug info optional (#369)</li> |
| <li>import-mbox.py: mailbox defaults to Create if file is not found (#370)</li> |
| <li>Bug: import --dedup does not cater for messages sent to multiple lists (#373)</li> |
| <li>Confusing parameter name (--rename) in copy-list.py (#207)</li> |
| <li>Fix base64 decoding of certain files (#384)</li> |
| </ul> |
| <div style="display: inline-block; background: #BBB; margin: -10px; padding: 10px;"> |
| <h4><a id="disclaimer"></a>Disclaimer</h4> |
| <div style="width: 65%; float: left;"> |
| <p style="line-height: 12pt;"> |
| Apache Pony Mail (Incubating) is an effort undergoing incubation at |
| The Apache Software Foundation (ASF), sponsored by the <a href="https://incubator.apache.org"> |
| Apache Incubator</a>. Incubation is required of all newly accepted projects |
| until a further review indicates that the infrastructure, |
| communications, and decision making process have stabilized in a |
| manner consistent with other successful ASF projects. While |
| incubation status is not necessarily a reflection of the |
| completeness or stability of the code, it does indicate that the |
| project has yet to be fully endorsed by the ASF. |
| </p> |
| </div> |
| <div style="width: 20%; float: left; padding-top: 16px; margin-left: -8px;"> |
| <a href="https://incubator.apache.org"><img src="https://incubator.apache.org/images/incubator_feather_egg_logo_sm.png"/></a> |
| </div> |
| <div style="width: 15%; float: left; line-height: 15px; padding-left: 22px;"> |
| <a class="item" target="_blank" href="https://incubator.apache.org/">Apache Incubator</a><br/> |
| <a class="item" target="_blank" href="https://www.apache.org/">About the ASF<span></span></a><br/> |
| <a class="item" target="_blank" href="https://www.apache.org/foundation/policies/conduct.html">Code of Conduct<span></span></a><br/> |
| <a class="item" target="_blank" href="https://www.apache.org/foundation/thanks.html">Thanks<span></span></a><br/> |
| <a class="item" target="_blank" href="https://www.apache.org/foundation/sponsorship.html">Become a Sponsor<span></span></a><br/> |
| <a class="item" target="_blank" href="https://www.apache.org/security/">Security<span></span></a><br/> |
| <a class="item" target="_blank" href="https://www.apache.org/licenses/LICENSE-2.0">License<span></span></a><br/> |
| </div> |
| </div> |
| </body></html> |