{"id":"6a313c598cee56d0d71bb21c","title":"2026 06 16 Build 699","path":"how-to/committee/release-notes/2026-06-16-build-699","contentMarkdown":"# 16-Jun-2026 — junk mail, read/unread, recipient visibility & Contact Us routing [#278](https://github.com/nbarrett/ngx-ramblers/issues/278)\n\n## [build 699](https://github.com/nbarrett/ngx-ramblers/actions/runs/27615770048) — [commit e0ca7aa](https://github.com/nbarrett/ngx-ramblers/commit/e0ca7aaa3dc8861169d82a38b116cd2a334f2f4e)\n\n_____\n\nExtends the committee Email inbox with junk-mail triage, read/unread\ncontrol, clearer addressing, and fixes Contact Us so submissions to a role\nbacked by a connected inbox arrive at the role's own address. Part of the\nGmail inbox work in [#278](https://github.com/nbarrett/ngx-ramblers/issues/278).\n\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/dae07897-89e4-41ae-bd89-be969dc1b22e.jpeg)\n\n\n## What's new\n\n\n- You can now see who each message was addressed to (the committee role\naddress), not just the sender.\n- Subjects keep their original capitalisation.\n- A new Junk view lets you triage spam: move it back to the inbox or delete\nit, mirrored to the underlying Gmail account.\n- Mark conversations read or unread, and act on several at once from a new\nbulk-actions menu.\n- The unread badge tooltip names which role mailboxes have unread mail.\n- Contact Us submissions to a role backed by a connected inbox now arrive\naddressed to the role and grouped under it, instead of arriving as the\nraw Gmail address.\n\n## At a glance\n\n| Area | Before | Now |\n| --- | --- | --- |\n| Addressing | Sender name only | From and To shown, including the role address it came in to |\n| Subject | Lower-cased | Original capitalisation kept |\n| Spam | Not visible | Junk view with \"Not junk\" and Delete, mirrored to Gmail |\n| Read state | Read on open only | Mark read/unread, in bulk |\n| Contact Us to a connected-inbox role | Delivered to the raw Gmail address | Delivered to the role's own address, grouped under the role |\n\n## Where to find it\n\n- Admin -> Email inbox: addressing, subjects, the Junk view, the\nbulk-actions menu, and read/unread.\n- The unread badge in the top navigation bar: the tooltip.\n- System Settings -> Committee -> a role's Contact Us / Inbound Forwarding:\nthe routing fix.\n\n\n\n## How it behaves\n\n- Recipient visibility: each conversation shows From (sender) and To (the\nrole address it came in to); the list shows a \"to role@...\" line; every\nmessage shows explicit From and To. Outbound replies are labelled \"Sent\nfrom this group\" with the sending address shown.\n- Subjects: stored with their original case; the lower-cased form is kept\nonly for grouping replies into one conversation.\n- Junk: every poll also scans Gmail's Spam. Junk is kept out of the normal\nviews and listed under a \"Junk mail\" option. \"Not junk\" removes the Spam\nlabel and adds Inbox in Gmail, then files the conversation under the right\nrole; \"Delete\" moves it to Gmail Trash. Junk never raises notifications or\ncounts as unread.\n- Read/unread: the toolbar's bulk menu (shown when you tick conversations)\noffers Mark as read, Mark as unread, and Delete, with \"Not junk\" added in\nthe Junk view. The change is mirrored to Gmail's Unread label and works on\none or many conversations.\n- Notification badge: the tooltip names the role addresses with unread mail\nand their counts.\n- Contact Us routing: when a role's Inbound Forwarding points at a connected\nGmail inbox, Contact Us submissions are delivered to the role's own domain\naddress (for example social@yourdomain.org.uk), which the forwarding then\ndelivers to the mailbox, so the message arrives addressed to the role and\ngroups under it. Previously a role with no explicit Contact Us target fell\nback to its forwarding destination and arrived as the raw Gmail address.\n\n## Why the Junk view is restricted\n\nThe Junk view and its actions are limited to member administrators, because\ntriaging spam and changing Gmail labels for a shared mailbox is an\nadministrative task. Committee members continue to see only the role mail\nthey have access to.\n\n## How to try it out\n\n1. Open Admin -> Email inbox. Subjects keep their case and each conversation\nshows who it was addressed to.\n2. Tick one or more conversations and use the bulk-actions menu to mark them\nread or unread, or delete them.\n3. Choose \"Junk mail\" from the view selector to triage spam, then use \"Not\njunk\" or Delete.\n4. Send a Contact Us to a role backed by a connected inbox and confirm it\narrives addressed to the role's own address and groups under that role.\n\n## Technical changes\n\n- Client: inbox.component (recipient and subject display, Junk view,\nbulk-actions dropdown with icons, mark read/unread); inbox.service (folder\nparameter, moveThreadToInbox, markThreadUnread); inbox.model\n(InboxThreadFolder, thread subject and folder, InboxUnreadRole);\ninbox-notification.service and the badge (labelled breakdown observable,\nngx-bootstrap tooltip); committee-member (the Contact Us auto-default to\nthe role address now also runs when Inbound Forwarding changes, not only\non init).\n- Server: the inbox-thread model gains subject and folder; message import is\nfolder-aware and stores the original subject; the Gmail reader gains spam\nlisting, un-spam (remove SPAM, add INBOX) and trash; the poller scans Spam\neach cycle and files junk without notifying; routes add folder filtering,\nan administrator-only junk listing, move-to-inbox, mark-unread, and\nGmail-mirrored delete; the Contact Us resolver defaults an unset Contact Us\ntarget to the role address when the role forwards to a connected inbox.\n- Migration 20260616000001 backfills the original subject onto existing\nthreads.\n- Requires a server restart; the subject backfill runs on startup. Client\nchanges hot-reload.","contentHtml":"<h1>16-Jun-2026 — junk mail, read/unread, recipient visibility &amp; Contact Us routing <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/278\">#278</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/27615770048\">build 699</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/e0ca7aaa3dc8861169d82a38b116cd2a334f2f4e\">commit e0ca7aa</a></h2>\n<hr>\n<p>Extends the committee Email inbox with junk-mail triage, read/unread\ncontrol, clearer addressing, and fixes Contact Us so submissions to a role\nbacked by a connected inbox arrive at the role&#39;s own address. Part of the\nGmail inbox work in <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/278\">#278</a>.</p>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/dae07897-89e4-41ae-bd89-be969dc1b22e.jpeg\" alt=\"\"></p>\n<h2>What&#39;s new</h2>\n<ul>\n<li>You can now see who each message was addressed to (the committee role\naddress), not just the sender.</li>\n<li>Subjects keep their original capitalisation.</li>\n<li>A new Junk view lets you triage spam: move it back to the inbox or delete\nit, mirrored to the underlying Gmail account.</li>\n<li>Mark conversations read or unread, and act on several at once from a new\nbulk-actions menu.</li>\n<li>The unread badge tooltip names which role mailboxes have unread mail.</li>\n<li>Contact Us submissions to a role backed by a connected inbox now arrive\naddressed to the role and grouped under it, instead of arriving as the\nraw Gmail address.</li>\n</ul>\n<h2>At a glance</h2>\n<table>\n<thead>\n<tr>\n<th>Area</th>\n<th>Before</th>\n<th>Now</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Addressing</td>\n<td>Sender name only</td>\n<td>From and To shown, including the role address it came in to</td>\n</tr>\n<tr>\n<td>Subject</td>\n<td>Lower-cased</td>\n<td>Original capitalisation kept</td>\n</tr>\n<tr>\n<td>Spam</td>\n<td>Not visible</td>\n<td>Junk view with &quot;Not junk&quot; and Delete, mirrored to Gmail</td>\n</tr>\n<tr>\n<td>Read state</td>\n<td>Read on open only</td>\n<td>Mark read/unread, in bulk</td>\n</tr>\n<tr>\n<td>Contact Us to a connected-inbox role</td>\n<td>Delivered to the raw Gmail address</td>\n<td>Delivered to the role&#39;s own address, grouped under the role</td>\n</tr>\n</tbody></table>\n<h2>Where to find it</h2>\n<ul>\n<li>Admin -&gt; Email inbox: addressing, subjects, the Junk view, the\nbulk-actions menu, and read/unread.</li>\n<li>The unread badge in the top navigation bar: the tooltip.</li>\n<li>System Settings -&gt; Committee -&gt; a role&#39;s Contact Us / Inbound Forwarding:\nthe routing fix.</li>\n</ul>\n<h2>How it behaves</h2>\n<ul>\n<li>Recipient visibility: each conversation shows From (sender) and To (the\nrole address it came in to); the list shows a &quot;to role@...&quot; line; every\nmessage shows explicit From and To. Outbound replies are labelled &quot;Sent\nfrom this group&quot; with the sending address shown.</li>\n<li>Subjects: stored with their original case; the lower-cased form is kept\nonly for grouping replies into one conversation.</li>\n<li>Junk: every poll also scans Gmail&#39;s Spam. Junk is kept out of the normal\nviews and listed under a &quot;Junk mail&quot; option. &quot;Not junk&quot; removes the Spam\nlabel and adds Inbox in Gmail, then files the conversation under the right\nrole; &quot;Delete&quot; moves it to Gmail Trash. Junk never raises notifications or\ncounts as unread.</li>\n<li>Read/unread: the toolbar&#39;s bulk menu (shown when you tick conversations)\noffers Mark as read, Mark as unread, and Delete, with &quot;Not junk&quot; added in\nthe Junk view. The change is mirrored to Gmail&#39;s Unread label and works on\none or many conversations.</li>\n<li>Notification badge: the tooltip names the role addresses with unread mail\nand their counts.</li>\n<li>Contact Us routing: when a role&#39;s Inbound Forwarding points at a connected\nGmail inbox, Contact Us submissions are delivered to the role&#39;s own domain\naddress (for example <a href=\"mailto:social@yourdomain.org.uk\">social@yourdomain.org.uk</a>), which the forwarding then\ndelivers to the mailbox, so the message arrives addressed to the role and\ngroups under it. Previously a role with no explicit Contact Us target fell\nback to its forwarding destination and arrived as the raw Gmail address.</li>\n</ul>\n<h2>Why the Junk view is restricted</h2>\n<p>The Junk view and its actions are limited to member administrators, because\ntriaging spam and changing Gmail labels for a shared mailbox is an\nadministrative task. Committee members continue to see only the role mail\nthey have access to.</p>\n<h2>How to try it out</h2>\n<ol>\n<li>Open Admin -&gt; Email inbox. Subjects keep their case and each conversation\nshows who it was addressed to.</li>\n<li>Tick one or more conversations and use the bulk-actions menu to mark them\nread or unread, or delete them.</li>\n<li>Choose &quot;Junk mail&quot; from the view selector to triage spam, then use &quot;Not\njunk&quot; or Delete.</li>\n<li>Send a Contact Us to a role backed by a connected inbox and confirm it\narrives addressed to the role&#39;s own address and groups under that role.</li>\n</ol>\n<h2>Technical changes</h2>\n<ul>\n<li>Client: inbox.component (recipient and subject display, Junk view,\nbulk-actions dropdown with icons, mark read/unread); inbox.service (folder\nparameter, moveThreadToInbox, markThreadUnread); inbox.model\n(InboxThreadFolder, thread subject and folder, InboxUnreadRole);\ninbox-notification.service and the badge (labelled breakdown observable,\nngx-bootstrap tooltip); committee-member (the Contact Us auto-default to\nthe role address now also runs when Inbound Forwarding changes, not only\non init).</li>\n<li>Server: the inbox-thread model gains subject and folder; message import is\nfolder-aware and stores the original subject; the Gmail reader gains spam\nlisting, un-spam (remove SPAM, add INBOX) and trash; the poller scans Spam\neach cycle and files junk without notifying; routes add folder filtering,\nan administrator-only junk listing, move-to-inbox, mark-unread, and\nGmail-mirrored delete; the Contact Us resolver defaults an unset Contact Us\ntarget to the role address when the role forwards to a connected inbox.</li>\n<li>Migration 20260616000001 backfills the original subject onto existing\nthreads.</li>\n<li>Requires a server restart; the subject backfill runs on startup. Client\nchanges hot-reload.</li>\n</ul>\n"}