@title Configuring Outbound Email
@group config

Instructions for configuring Phabricator to send mail.

= Overview =

Phabricator can send outbound email via several different providers, called
"Adapters".

| Send Mail With | Setup | Cost | Inbound | Notes |
|---------|-------|------|---------|-------|
| Mailgun | Easy | Cheap | Yes | Recommended |
| Amazon SES | Easy | Cheap | No | Recommended |
| SendGrid | Easy | Cheap | Yes | |
| External SMTP | Medium | Varies | No | Gmail, etc. |
| Local SMTP | Hard | Free | No | (Default) sendmail, postfix, etc |
| Custom | Hard | Free | No | Write an adapter for some other service. |
| Drop in a Hole | Easy | Free | No | Drops mail in a deep, dark hole. |

Of these options, sending mail via local SMTP is the default, but usually
requires some configuration to get working. See below for details on how to
select and configure a delivery method.

Overall, Mailgun and SES are much easier to set up, and using one of them is
recommended. In particular, Mailgun will also let you set up inbound email
easily.

If you have some internal mail service you'd like to use you can also
write a custom adapter, but this requires digging into the code.

Phabricator sends mail in the background, so the daemons need to be running for
it to be able to deliver mail. You should receive setup warnings if they are
not. For more information on using daemons, see
@{article:Managing Daemons with phd}.

= Basics =

Regardless of how outbound email is delivered, you should configure these keys
in your configuration:

  - **metamta.default-address** determines where mail is sent "From" by
    default. If your domain is `example.org`, set this to something like
    `noreply@example.org`.
  - **metamta.domain** should be set to your domain, e.g. `example.org`.
  - **metamta.can-send-as-user** should be left as ##false## in most cases,
    but see the documentation for details.

= Configuring Mail Adapters =

To choose how mail will be sent, change the `metamta.mail-adapter` key in
your configuration. Possible values are listed in the UI:

  - ##PhabricatorMailImplementationAmazonMailgunAdapter##: use Mailgun, see
    "Adapter: Mailgun".
  - ##PhabricatorMailImplementationAmazonSESAdapter##: use Amazon SES, see
    "Adapter: Amazon SES".
  - ##PhabricatorMailImplementationPHPMailerLiteAdapter##: default, uses
    "sendmail", see "Adapter: Sendmail".
  - ##PhabricatorMailImplementationPHPMailerAdapter##: uses SMTP, see
    "Adapter: SMTP".
  - ##PhabricatorMailImplementationSendGridAdapter##: use SendGrid, see
    "Adapter: SendGrid".
  - ##Some Custom Class You Write##: use a custom adapter you write, see
    "Adapter: Custom".
  - ##PhabricatorMailImplementationTestAdapter##: this will
    **completely disable** outbound mail. You can use this if you don't want to
    send outbound mail, or want to skip this step for now and configure it
    later.

= Adapter: Sendmail =

This is the default, and selected by choosing
`PhabricatorMailImplementationPHPMailerLiteAdapter` as the value for
**metamta.mail-adapter**. This requires a `sendmail` binary to be installed on
the system. Most MTAs (e.g., sendmail, qmail, postfix) should do this, but your
machine may not have one installed by default. For install instructions, consult
the documentation for your favorite MTA.

Since you'll be sending the mail yourself, you are subject to things like SPF
rules, blackholes, and MTA configuration which are beyond the scope of this
document. If you can already send outbound email from the command line or know
how to configure it, this option is straightforward. If you have no idea how to
do any of this, strongly consider using Mailgun or Amazon SES instead.

= Adapter: SMTP =

You can use this adapter to send mail via an external SMTP server, like Gmail.
To do this, set these configuration keys:

  - **metamta.mail-adapter**: set to
    `PhabricatorMailImplementationPHPMailerAdapter`.
  - **phpmailer.mailer**: set to `smtp`.
  - **phpmailer.smtp-host**: set to hostname of your SMTP server.
  - **phpmailer.smtp-port**: set to port of your SMTP server.
  - **phpmailer.smtp-user**: set to your username used for authentication.
  - **phpmailer.smtp-password**: set to your password used for authentication.
  - **phpmailer.smtp-protocol**: set to `tls` or `ssl` if necessary. Use
    `ssl` for Gmail.

= Adapter: Mailgun =

Mailgun is an email delivery service. You can learn more at
<http://www.mailgun.com>. Mailgun isn't free, but is very easy to configure
and works well.

To use Mailgun, sign up for an account, then set these configuration keys:

  - **metamta.mail-adapter**: set to
    `PhabricatorMailImplementationMailgunAdapter`.
  - **mailgun.api-key**: set to your Mailgun API key.
  - **mailgun.domain**: set to your Mailgun domain.

= Adapter: Amazon SES =

Amazon SES is Amazon's cloud email service. It is not free, but is easier to
configure than sendmail and can simplify outbound email configuration. To use
Amazon SES, you need to sign up for an account with Amazon at
<http://aws.amazon.com/ses/>.

To configure Phabricator to use Amazon SES, set these configuration keys:

  - **metamta.mail-adapter**: set to
    "PhabricatorMailImplementationAmazonSESAdapter".
  - **amazon-ses.access-key**: set to your Amazon SES access key.
  - **amazon-ses.secret-key**: set to your Amazon SES secret key.

NOTE: Amazon SES **requires you to verify your "From" address**. Configure which
"From" address to use by setting "##metamta.default-address##" in your config,
then follow the Amazon SES verification process to verify it. You won't be able
to send email until you do this!

= Adapter: SendGrid =

SendGrid is an email delivery service like Amazon SES. You can learn more at
<http://sendgrid.com/>. It is easy to configure, but not free.

You can configure SendGrid in two ways: you can send via SMTP or via the REST
API. To use SMTP, just configure ##sendmail## and leave Phabricator's setup
with defaults. To use the REST API, follow the instructions in this section.

To configure Phabricator to use SendGrid, set these configuration keys:

  - **metamta.mail-adapter**: set to
    "PhabricatorMailImplementationSendGridAdapter".
  - **sendgrid.api-user**: set to your SendGrid login name.
  - **sendgrid.api-key**: set to your SendGrid password.

If you're logged into your SendGrid account, you may be able to find this
information easily by visiting <http://sendgrid.com/developer>.

= Adapter: Custom =

You can provide a custom adapter by writing a concrete subclass of
@{class:PhabricatorMailImplementationAdapter} and setting it as the
`metamta.mail-adapter`.

TODO: This should be better documented once extending Phabricator is better
documented.

= Adapter: Disable Outbound Mail =

You can use the @{class:PhabricatorMailImplementationTestAdapter} to completely
disable outbound mail, if you don't want to send mail or don't want to configure
it yet. Just set **metamta.mail-adapter** to
`PhabricatorMailImplementationTestAdapter`.

= Testing and Debugging Outbound Email =

You can use the `bin/mail` utility to test, debug, and examine outbound mail. In
particular:

  phabricator/ $ ./bin/mail list-outbound   # List outbound mail.
  phabricator/ $ ./bin/mail show-outbound   # Show details about messages.
  phabricator/ $ ./bin/mail send-test       # Send test messages.

Run `bin/mail help <command>` for more help on using these commands.

You can monitor daemons using the Daemon Console (##/daemon/##, or click
**Daemon Console** from the homepage).

= Next Steps =

Continue by:

  - @{article:Configuring Inbound Email} so users can reply to email they
  receive about revisions and tasks to interact with them; or
  - learning about daemons with @{article:Managing Daemons with phd}; or
  - returning to the @{article:Configuration Guide}.
