How it fits together
Most email-to-Jira tools ask for a mailbox: a password, an OAuth grant to your inbox, or an address they host. Bastion Helix takes the opposite route. You keep your mail where it is, and your own mail routing forwards each message to a private address that belongs to one email channel. The app never logs in anywhere, never holds a mailbox and never sends email.
Cloudflare Email Routing is the simplest way to do the forwarding if your domain's DNS is already on Cloudflare: it is free, it receives mail for any address on your domain, and a few lines of Email Worker code hand each message on.
What you need
- A domain whose DNS is on Cloudflare, with Email Routing available on it.
- Bastion Helix installed in Jira, and project administrator rights on the project the mail should land in.
- About fifteen minutes.
Turning on Email Routing changes the domain's MX records. If the domain already receives mail somewhere else — Google Workspace or Microsoft 365, say — use a subdomain such as help.example.com, or use your mail provider's forwarding with Postmark or SendGrid instead (see the last section).
Step 1 — Create the channel in Jira
- In Jira, open the project and its Bastion Helix page from the project sidebar.
- Find Email handling and choose New channel.
- Give it a name (for example Support), and choose what new mail becomes — the issue type.
- Optionally fill in Only accept mail from (for example
acme.com, *.acme.com) and Never accept mail from. Leave the first blank to accept anyone. - Save. The channel shows a private address. Copy it.
Treat the private address like a password: anyone who has it can post mail into the project. It is shown only to the project's administrators, and New address replaces it instantly if it ever leaks.
Step 2 — Turn on Email Routing
- In Cloudflare, open your domain, then Email → Email Routing.
- If it is off, turn it on and let Cloudflare add the DNS records it asks for.
Step 3 — Create the Email Worker
- In Email Routing, open Email Workers → Create.
- Name it, for example bastion-helix-support.
- Replace its code with the script below, paste your channel address between the quotes, and Deploy.
// Cloudflare Email Worker — forwards every mail to Bastion Helix.
const ADDRESS = 'PASTE YOUR CHANNEL ADDRESS HERE';
export default {
async email(message) {
const raw = await new Response(message.raw).text();
const res = await fetch(ADDRESS, {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({ raw }),
});
if (res.status >= 500) message.setReject('Jira could not take this message right now. Please send it again later.');
else if (!res.ok) message.setReject('This address does not accept mail.');
},
};
The channel's setup screen shows this same script with your address already filled in, so you can copy it from there instead. The two setReject lines matter: if Jira can't take a message, the worker refuses it, and the sender's mail server returns it to them with that note. Nothing disappears silently.
Step 4 — Route an address to the worker
- Open Routing rules → Create address.
- Enter the address people will write to, for example
support@. - Action: Send to a Worker. Destination: the worker you just deployed. Save.
Step 5 — Send a test and read the mail log
Send an email to the new address from an account the channel accepts. Within a few seconds an issue appears in the project: the subject becomes the summary, the body becomes the description, and the sender is matched to a Jira user when one has that email address.
Reply to that email and the reply lands as a comment on the same issue, with the quoted history stripped. A reply is matched to its issue by the email's own reply headers, or by an issue key such as KAN-10 in the subject. Attach a file and it arrives as an attachment.
Then open the channel's Mail log. Every message that reached the channel is listed, including the ones it ignored, with the reason.
What gets ignored, and why
| Message | What happens |
|---|---|
| Out-of-office and other automatic replies | Ignored and logged |
| Bounces and mailing-list mail | Ignored and logged |
| A sender not on the allow-list, or on the block list | Not accepted, and logged |
| Too many messages from one sender | Held back by the per-sender limit, and logged |
| A sender failing SPF/DKIM, when that check is on | Not accepted, and logged |
| The same message delivered twice | Counted once |
If nothing arrives
- No line in the mail log: the message never reached the channel. Check the routing rule points at the worker, and that the worker's
ADDRESSmatches the channel's current address exactly. - A line saying the sender was refused: the allow-list or block list stopped it. Adjust the channel's sender lists.
- The sender got the message back: the worker refused it because Jira couldn't take it right then, or the address was wrong. The bounce carries the worker's note.
Using Postmark, SendGrid or Mailgun instead
Anything that can make an HTTPS POST can deliver mail to a channel. The channel's setup screen has instructions for each:
- Postmark — paste the channel address as the inbound stream's Webhook URL. Attachments included.
- SendGrid — add it as an Inbound Parse destination and tick POST the raw, full MIME message, or files are left out.
- Mailgun — a route that forwards to the address. Mailgun sends files as form uploads the app can't read, so text arrives and the log notes the missing files.
Bastion Helix for Jira isn’t on the Marketplace yet. All seven modules are built and running in our own test Jira site. Try the live demos, or leave your email below to hear the day early access opens.