1. Polling emails via POP3

Since Discourse only supports polling from one POP3 account, you will have to setup forwarding rules between your accounts to make sure all the emails end up in the account you are polling emails from. Discourse is clever enough to deliver the emails to the appropriate destination.

Let’s say that you are polling emails from the “reply@your.domain” account and you want to setup incoming emails for “help@your.domain” and “dev@your.domain”.

2. Pushing emails via the Discourse API

Then, to push an email to Discourse, you need to pass the raw email content as the “email” parameter when POSTing to “/admin/email/handle_mail”. The endpoint accepts application/json (recommended), multipart/form-data, or application/x-www-urlencoded request bodies (with an appropriate request Content-Type header, naturally).

You’re done

Logging and Errors

All incoming emails are logged and are visible in your admin panel at /admin/email/received. You can filter the list using the From, To and Subject field of the emails.

The rejected list (/admin/email/rejected) is much more useful when it comes to understand things. You can filter the list using the From, To and Subject field of the emails as well as the Error message.

At any time, you can click the Error message and a modal will show up with more details. If it’s a known error, you will find a small description explaining why that email was rejected. Then you will find all the headers of the email, the subject and the first 100 words of the raw version of the body. Finally, you will find the rejection email that was sent back to the user.

reply_user_not_matching_error: a reply came in from a different email address the notification was sent to.

This happens when someone uses more than one email addresses (using email aliases for example) but only reply using one email address. Let’s say that the user registered an account with foo+discourse@bar.com.

auto_generated_email_error: happens when at least one of the following criteria is matched

the ‘precedence’ header is set to: list, junk, bulk or auto_reply

the email is from mailer-daemon, postmaster or noreply

any of the headers contain: auto-submitted, auto-replied, auto-reply or auto-generated (non exhaustive list).

Since there is no standard to identify automatic emails we have to use regular expressions to match the most commonly used words and headers. These errors are usually safe to ignore but if you find a genuine email that was mis-classified, then be sure to report it here.

Here are the other known errors you might encounter:

empty_email_error: the raw mail we received was blank.

user_not_found_error: when staged users is disabled and the sender is not an existing user.

no_body_detected_error: we couldn’t extract a body and there was no attachments.

inactive_user_error: the sender is not active.

silenced_user_error: the sender has been silenced.

bad_destination_address: none of the email addresses in the To, Cc and Bcc fields matched a configured incoming email address.

strangers_not_allowed_error: a user tried to create a new topic in a category they’re not a member of.

insufficient_trust_level_error: a user tried to create a new topic in a category they don’t have the required trust level for.

topic_not_found_error: a reply came in but the related topic has been deleted.

topic_closed_error: a reply came in but the related topic has been closed.

How does the post by email feature play along with the queued posts? I.e. if I have the approve post count or approve unless trust level set to non-zero, will the incoming email handling respect these settings and add the posts to the queue for approval?

Our usercase is that we want to migrate old team emails to groups inside discourse, so the idea was to remove everyone from the team email alias, and just add ourforum@email.address as the only alias recipient (as we have done for some category emails in the past).

Unfortunately discourse rejects these emails:

Your email was marked as “auto generated”, which means it was
automatically created by a computer instead of being typed by a human;
we can’t accept those kinds of emails. If you believe this is an error,
contact a staff member.