Title: TeamPage 6.2.46

TeamPage 6.2.46 is focused on fixes and improvements in several areas, including the email digest, email ingestion, document management features, and tracking of document indexing status for TeamPage's advanced search capabilities. The release also improves performance of queries that power reporting and navigation across TeamPage project management objects including projects, milestones, and task lists. SDK improvements focus on changes related to sending and receiving email. Please read on for the full list of changes.

Download TeamPage 6.2.46

Bug Fixes

Email Ingestion

• Fixed a bug introduced in TeamPage 6.2.45 that prevented the built-in "Inline Images" mail filter from properly embedding attached images in the content of entries created from ingested email messages. (Server94255)

• Fixed a bug that could, in certain rare cases, cause TeamPage to create a new entry from a received email message in a space marked "Inactive". (Server94633)

• Fixed a bug that could prevent entries created from email messages from getting a suitable default title if the message didn't have a subject. (Server94091)

• Fixed an issue with TeamPage's "bounce" messages to ensure that possibly sensitive details will never be included in the message. This includes both details of any errors that may have occurred, as well as the published address of the TeamPage server. (Server94656 / Server94902)

• Fixed a bug that could prevent the "Brief" option for email headers -- either the setting or the entry property set when creating or editing certain types of entries -- from working properly in certain cases. (Server94310)

Email Digest

• Fixed a bug that prevented custom configured email digests from being deleted from the "Unsubscribe from Email Digests" page. When a user clicked the "Unsubscribe" link in the email digest and then clicked on the "Unsubscribe from All Email Digests", they would only be unsubscribed from digests scheduled by server administrators. The "Unsubscribe from All Email Digests" button now correctly removes any custom digests scheduled by the user (or by an administrator on their behalf). (Server94489)

• Fixed an issue that could prevent digest generation from ever completing if a section table widget appeared in an included entry, using a section definition that set the space scoping to "Current Space." (Server94840)

• Fixed a validation issue that could allow an attacker to create a link to an "online" version of the email digest that used an invalid value used for a certain request parameter. There is no known way that this attack could be used to inject arbitrary markup or otherwise compromise the server or the user's browser, but the request parameter in question should be properly validated, and this change fixes that issue. (Internal12834)

Private Drafts

• Fixed a bug that could cause TeamPage to display an unexpected error message if a user attempted to load a private draft in one window or tab that they had already finalized (submitted as an entry) or deleted in another window or tab. Now, the user will see the expected message informing them that the requested private draft couldn't be found. (Server94385)

Files (Attachments and Other Documents)

• Fixed a bug that could prevent certain folders from being deleted via TeamPage's documents UI. This only affected folders not managed in the WebDAV-compatible file repository, such as non-WebDAV space share folders, system folders, and the pub folder. (Server94330)

• Fixed a bug that prevented folders from being moved between locations in the WebDAV-compatible file repository and locations not in the WebDAV-compatible file repository -- e.g., from a space share folder to a system folder. In some cases, the folder and its files would be lost; and in other cases, the move operation would simply not work. These folder move operations all now work properly. (Server94325)

• Fixed a bug that prevented external search engine indices from being properly updated when indexed folders were renamed or moved. (Server94315)

• Fixed several bugs introduced in a recent version of TeamPage that prevented file and folder descriptions from being created or edited. (Server94462)

• Fixed an issue that prevented the file and folder descriptions features from being usable if the currently installed TeamPage license doesn't have "Social Enterprise Web" (SEW). TeamPage does not require the SEW feature to be licensed to create or edit file descriptions.

• Fixed a bug that caused pages displaying details about a single file (attachment or shared file) or folder to omit the expected title, attribution, date, and other details if there was a description entry for the file or folder. (Server94470)

• Fixed a bug that prevented the current file description stored in a file repository (along with other metadata) from appearing in the expected position at the top of a File Description or Folder Description entry's content. (Server94560)


• Fixed an issue with the data that TeamPage sends for calendar invitations that are all day events (spanning either a single full day or multiple full days). Previously, not all calendar software would be able to interpret the event invitations as spanning full days, and may instead have displayed them as spanning specific ranges of hours. (Proteus16496)


• Fixed a bug that could prevent certain queries, such as a "Recently Updated" section, from working properly when used in combination with certain search expressions. (Server94962)

• Fixed a bug which in some rare cases could prevent TeamPage from storing a reference from one entry to another when the target entry's ID was typed in the body of the entry. This would affect, e.g., which entries were listed in the "Related Articles" tab in a single entry view. (Server95118)

Setup and Administration

• Fixed a bug that prevented creation of new spaces if there were no active spaces in the current journal. (JPBO25247)


Query Performance

• Improved the performance of the queries that power TeamPage's core Project Management features, such as project, milestone and task lists, and project and milestone activity feeds. (Proteus16379 / Proteus16380 / Proteus16385)

• Optimized the way that TeamPage retrieves auxiliary data after an initial page load. This includes sparklines and completion status mini-graphs displayed in various contexts for projects and milestones (e.g., Tasks > Projects). (Proteus16367)

Email Ingestion

• Updated the version of JavaMail that TeamPage uses to 1.6.2. This includes various improvements over the previous version, including a fix for a bug that could, in certain unusual cases, prevent TeamPage from being able to properly interpret and ingest email messages whose MIME encapsulations happen to exhibit certain structural properties. (Server94546)

• Modified the way that TeamPage processes incoming email messages that have only a text-only version, and no HTML version. In particular, server administrators can now select whether and how to clean up the text-only message body by modifying the "Text-Only Email Text-to-HTML Conversion" in the Transformer Setup dialog (server settings > Server Files > Other Files > Customizable Configuration > Transformer Configuration). By default, no cleanup is applied, and the body of the message remains plain text. If a custom Transformer is selected, the content of the newly created entry will apply that to convert it from text to HTML before any other modifications are applied. An administrator may create a compound transformer that includes either the built-in "Text-Only to HTML with Blockquotes" or "Text-Only to HTML" transformer to apply a simple conversion, or they can create other transformers to use in a compound transformer of their choice if a different sort of conversion is required. (Server94859)

Email Digest and Email Articles

• Last-minute HTML cleanup applied during digest generation, which is intended to prevent any accidentally broken or garbage markup from ruining the layout of the digest message body, has been completely rewritten, and works much faster, improving both the quality of the cleanup and digest generation speed. (Server94781)

• Reduced the amount of memory required for digest generation and email articles operations, and improved the way that TeamPage handles problems that occur during digest generation. (Server94770 / Server94778 / Server94792)

• Improved the appearance of section and section table widgets in digests and emailed articles. Sections and section tables are also now capped to a smaller number of results when appearing in the digest, since the digest is intended as a summary of recent activity, and interested users can click through to see a complete section or section table. Sections and section tables now also properly take into account whether the user has requested to include links into TeamPage in the emailed content. (Server94769 / Server94848)

• Improved the appearance of extended entry metadata that appears in digests and emailed articles. Previously, the markup used in these cases might improperly include markup, such as links to context-specific tools, which didn't belong in an email message. The metadata that appears in digests now uses digest-specific markup, and for emailed articles, properly takes into account whether the user has requested to include links into TeamPage in the emailed content. (Server93878)

• Improved the way that TeamPage generates the HTML versions of digests, email notifications and other outgoing email messages to avoid having to apply post-processing steps to fix references to included images and other resources. (Server94806 / Server94850 / Server94813 / Server94860)

• Email digests now properly observe a maximum timeout for generating a digest. Although this should not happen, if a digest is taking too long to be generated, TeamPage will now stop trying instead of continuing indefinitely. (Server94771)

Outgoing Email (General)

• Improved the consistency of checks for whether outgoing email is enabled. (Server94911)

External Search Engine Integration (Advanced Search)

• Optimized the way TeamPage tracks information required to keep the data in an external search engine in sync with all the latest modifications of documents (entries, attachments, etc.). This includes the case of having to "crawl" all documents to perform "Reset" (feed all documents) and "Verify" (compare indexing status with search engine index) operations. (Server94553 / Server94542 / Server94565)

• Added support for performing partial "Reset" and "Verify" operations, as well as batch Update and Remove operations. With assistance from Traction support staff, administrators can now perform these operations one or all classes of documents for one or more specific spaces (e.g., all attachments in a particular space, or all documents in a particular space's share folder). (Server94316 / Server94499)

• TeamPage will now feed metadata of files whose contents are not indexed. This applies to files that are skipped due to configuration settings, or files that are skipped because the search engine is unable to extract and index their contents. This way, users can still find these files by, e.g., the file names, document type, etc. even if their contents are not searchable. (Server52936)


• Improved the way that TeamPage generates HTML for inline references to images and other media. Generating URLs used to embed such references performs slightly better, and embedded references by default are set to be loaded by a user's browser "lazily" -- that is, only when the user scrolls the page so that the image or other media must be loaded. This reduces the number of requests made to a TeamPage server in the presence of many embedded media references, as well as reducing the number of such requests made by users' browsers, and amount of bandwidth required to load pages that contain embedded media. (Server94861 / Proteus16469)

Administration and Setup

• The "Recipients of Server Digests" server control is now always displayed in the server settings > Email page under Digest. Administrators can click the "Edit" button that appears beneath the heading and description if they want to modify this user setting for one or more users in batch. Previously, the setting would appear only if there were fewer than a certain number of user accounts. (Server94882)

For Developers

Edit SDK


The Traction public SDK API now contains an object that can be used to write customizations that make use of the Email Articles capability. To obtain an instance of NewMailOutEntry, clients can use the com.traction.sdk.SdkFactory method:

    public abstract NewMailOutEntry createNewMailOutEntry(Set<? extends TractionId> targets, Project project,
                                                          Context context, boolean logMessage,
                                                          Set<? extends TractionId> omitEntryIdsFromRelated)
        throws AuthenticationException;

The object supports all the same options that are supported in TeamPage's standard Email Articles feature.


com.traction.sdk.edit.NewEntry's saveDraft() method, as well as several methods in com.traction.sdk.edit.PersonalDraftManager, now throw the new PersonalDraftDataModificationException. This type of Exception represents a failure to modify personal draft data, usually caused by an underlying I/O error. If you use these APIs, or other public SDK personal draft APIs, read the Javadoc for other changes to thrown Exceptions, including RuntimeExceptions that can happen in certain circumstances, which are all thoroughly documented.


IncludeManager has been extensively modified. The new IncludeManager.DocumentScope interface along with the method createDocumentScope() supports optional nestable scopes for including resources such as images, scripts and CSS, which makes it easy to create the rendering for separate documents such as the HTML body of an email message, and easy access to the resources included inline/embedded vs. otherwise, via the IncludeManager.IncludedFiles interface. This allows clients to separate the resources being included within a self-contained generated document from those included in (referenced by) the main response document. The DocumentScope is closed when the self-contained document generation is complete.

When including images, clients can also specify the preferred mode -- normal (by URL), inline (usually via data: URI), local (for special cases such as PDF export), or Content ID (for email messages) -- for different types of image resources, or for individual image resources. Included images are parameterized via the IncludeManager.ImageParameters interface, which includes a com.traction.sdk.Icon that encapsulates the image's dimensions and other properties.

Here is an example of how these APIs can be used while generating a self-contained HTML document to be included as the HTML body of an email message:

import com.traction.sdk.*;
import com.traction.sdk.view.*;
import com.traction.sdk.sdl.*;
import com.traction.sdk.mail.*;


        // com.traction.sdk.Context context ...
        IncludeManager include = context.getIncludeManager();

        SdlEvaluator eval = ctx.getSdlFactory().createSdlEvaluator(context, "com.example.my.template#function");
        Scope scope = eval.getScope();
        scope.setVariable("myVariable", ...);

        SmtpMessage message = context.getSdkFactory().createPersonalSmtpMessage(context);

        String htmlContent;
        try (IncludeManager.DocumentScope docScope = include.createDocumentScope()) {
            include.setDefaultIncludeMode(IncludeManager.ResourceType.CSS, IncludeManager.Mode.INLINE);
            include.setDefaultIncludeMode(IncludeManager.ResourceType.JS, IncludeManager.Mode.INLINE);
            include.setDefaultIncludeMode(IncludeManager.ResourceType.IMAGE, IncludeManager.Mode.CONTENT_ID);
            include.setAutomaticallyIncludeInResponseWhenIncludingInBody(Icon.ImageResourceType.CONTENT, true);
            include.setAutomaticallyIncludeInResponseWhenIncludingInBody(Icon.ImageResourceType.FILE_ICON, true);
            include.setAutomaticallyIncludeInResponseWhenIncludingInBody(Icon.ImageResourceType.LABEL_ICON, true);
            include.setAutomaticallyIncludeInResponseWhenIncludingInBody(Icon.ImageResourceType.ACTION_ICON, true);
            include.setAutomaticallyIncludeInResponseWhenIncludingInBody(Icon.ImageResourceType.LOGO, true);
            include.setAutomaticallyIncludeInResponseWhenIncludingInBody(Icon.ImageResourceType.PROFILE_PICTURE, true);
            htmlContent = eval.eval();

Email Ingestion

com.traction.sdk.mail.MailFilter Changes

The APIs available on com.traction.sdk.mail.IncomingMessage have changed. The subject, content and other attributes of the mail message data are now immutable. MailFilter implementations may inspect that original state, but can only modify the state of the com.traction.sdk.edit.NewReceivedMailEntry accessible from IncomingMessage's getNewEntry() method. These changes were necessary to address some internal consistency issues, and to ensure that the edit SDK implementation can remain coherent in the presence of modifications made both by MailFilters, com.traction.sdk.edit.EntryFilters, and any of the com.traction.sdk.Transformers that must be applied as part of TeamPage's normal ingestion pipeline. (Server94227)


com.traction.sdk.file.FileInfo Embedding URLs

The method getEmbeddingURL() has been added to the FileInfo interface to allow implementations to supply special URLs for the purpose of embedding a reference to the resource -- usually an image resource -- for the current context. All built-in implementations know how to correctly select the right sort of URL for the context (based upon the current TokenRendererSet and/or other contextual information), and are optimized to do so without having to perform unnecessary metadata queries whenever possible, which provides a slight performance improvement when many images are embedded in a response.

Outgoing Email

Using Contents of a File for Message Body

com.traction.sdk.mail.Message now supports using a com.traction.sdk.file.FileInfo as the message body. The usual use-case for this would be to create a com.traction.sdk.file.TempFile, populate it with the desired HTML body (which may be quite large), and use that as the message body, e.g.:

import com.traction.sdk.*;
import com.traction.file.*;
import com.traction.sdk.mail.*;
import java.io.IOException;

class Foo {


    void sendMessage(Context context) throws AuthenticationException, MessagingException, IOException {
        Message message = context.getSdkFactory().createPersonalSmtpMessage(context);
        try (TempFile bodyFile = createTransientTempFileForBody(context)) {
            try (PrintWriter out = bodyFile.getUtf8PrintWriter()) {
                // write body to out

    TempFile createTransientTempFileForBody(Context context) throws IOException {
        FileData metadata =
        return context.getSdkFactory().createNewTransientTempFile(context, null, metadata, null);




Clients can now invoke com.traction.sdk.Message's new getReadyToSend() method. If the method succeeds and returns a Message.ReadyToSend object, the client can take this as confirmation that TeamPage was able to open the transport and will be able to send the message, so long as the client creates an otherwise valid message (e.g., with valid recipients and other attributes that are all accepted by the SMTP service). The Message instance can then be sent either by invoking its send() method, as usual, or via the send() method on the ReadyToSend instance. Multiple invocations of the getReadyToSend() method will return the same instance, and only one send operation can be performed. ReadyToSend instances are AutoCloseable; closing the instance will cancel the message if it has not already been sent. This provides a nice way to use ReadyToSend with a try-with-resources block, e.g.,

import com.traction.sdk.*;
import com.traction.sdk.mail.*;


    // com.traction.sdk.Context context ...
    SmtpMessage message = context.getSdkFactory().createPersonalSmtpMessage(context);
    try (Message.ReadyToSend ready = message.getReadyToSend()) {
        message.addRecipient("user@example.com", Message.SupportedRecipientType.TO);
    catch (MessagingException e) {
        // won't be able to send

The new Message method abort() will also cancel the message.

General SDK

Access to com.traction.sdk.UserAgents

Clients can now access any UserAgent object by its configuration name, or for any user-agent identification string, via the following new methods in com.traction.sdk.config.ServerConfiguration:

    public abstract UserAgent getUserAgentFromName(String name);

    public abstract UserAgent getUserAgentFromUserAgentString(String uaString);

Article: Customer5254 (permalink)
Categories: :Doc:changelog, :Doc:r62
Date: August 3, 2020; 2:39:23 PM EDT
Author Name: Dave Shepperton
Author ID: shep