> ## Documentation Index
> Fetch the complete documentation index at: https://developer.upsun.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Send email from your Upsun environment using an SMTP proxy

> Configure outgoing email for your Upsun environment, improve deliverability with SPF and DKIM, and send test messages using the built-in SMTP proxy.

export const SettingsIcon = () => <svg width="24px" height="24px" style={{
  display: 'inline',
  verticalAlign: 'middle'
}}>
    <title id="settings-icon">Settings</title>
    <path d="M10.5289 21.9416C9.86066 21.8582 9.3595 21.3576 9.19245 20.6903L9.02539 19.6892C8.85834 19.6058 8.77482 19.6058 8.60776 19.5224L7.93955 20.0229C7.43839 20.44 6.68665 20.44 6.10196 20.0229C6.10196 20.0229 4.09732 18.1042 4.01379 17.9374C3.51263 17.3535 3.51263 16.6027 3.93027 16.0187L4.51495 15.3514C4.43143 15.1845 4.43143 15.1011 4.3479 14.9343L3.42911 14.7674C2.76089 14.684 2.25973 14.1835 2.09268 13.4327C2.00915 13.1824 2.09268 10.4296 2.09268 10.4296C2.17621 9.76222 2.67737 9.2617 3.34558 9.09486L4.3479 8.92802C4.43143 8.8446 4.43143 8.76118 4.51495 8.59434L4.01379 7.92697C3.59616 7.42645 3.59616 6.67567 4.01379 6.09173C4.01379 6.09173 5.93491 4.08964 6.10196 4.00622C6.68665 3.5057 7.43839 3.5057 8.02307 3.9228L8.69129 4.50675C8.85834 4.42333 8.94187 4.42333 9.10892 4.33991L9.27597 3.42228C9.3595 2.75492 9.86066 2.2544 10.6124 2.08756C10.863 2.00414 13.2853 2.00414 13.5358 2.08756H13.6194C14.2876 2.17098 14.7887 2.6715 14.9558 3.33886L15.1228 4.33991C15.2064 4.42333 15.2899 4.50675 15.457 4.50675L16.1252 4.00622C16.6263 3.58912 17.3781 3.58912 17.9628 4.00622C17.9628 4.00622 19.9674 5.92489 20.0509 6.09173C20.5521 6.67567 20.5521 7.42645 20.1344 8.0104L19.6333 8.67776C19.7168 8.8446 19.7168 9.01144 19.8003 9.09486L20.7191 9.2617C21.3873 9.34512 21.972 9.92906 22.0556 10.5964V13.5996C21.972 14.2669 21.4709 14.7674 20.8027 14.9343L19.8003 15.1011C19.7168 15.268 19.7168 15.3514 19.6333 15.5182L20.218 16.269C20.6356 16.7695 20.6356 17.5203 20.218 18.1042L18.0463 20.2732C17.4616 20.6903 16.7099 20.6903 16.2087 20.2732L15.3734 19.6058C15.2064 19.6892 15.1228 19.6892 14.9558 19.7726L14.7887 20.6903C14.7052 21.3576 14.1205 21.9416 13.4523 22.025H10.5289V21.9416ZM11.5312 20.3566C11.8653 20.3566 12.1994 20.3566 12.45 20.3566C12.8676 20.3566 13.2017 20.0229 13.2853 19.6058L13.3688 18.9384C13.3688 18.6882 13.6194 18.4379 13.8699 18.2711L15.1228 17.7706C15.3734 17.6871 15.7075 17.6871 15.9581 17.854L16.5428 18.2711C16.8769 18.5213 17.3781 18.5213 17.6286 18.1877C17.7957 18.0208 18.0463 17.7706 18.2969 17.5203C18.5474 17.1866 18.631 16.7695 18.3804 16.4358L17.8792 16.0187C17.7122 15.7685 17.6286 15.4348 17.7957 15.1845L18.2969 14.0167C18.3804 13.7664 18.631 13.5996 18.9651 13.5161L19.6333 13.4327C20.0509 13.3493 20.385 13.0156 20.385 12.5985C20.385 12.2648 20.385 11.9311 20.385 11.6809C20.385 11.2638 20.0509 10.9301 19.6333 10.8467L18.9651 10.7633C18.7145 10.7633 18.4639 10.513 18.2969 10.2627L17.7957 9.01144C17.7122 8.76118 17.7122 8.4275 17.8792 8.17724L18.2969 7.59329C18.5474 7.25961 18.5474 6.84251 18.2133 6.50883C18.0463 6.34199 17.7957 6.09173 17.5451 5.84147C17.211 5.50779 16.7934 5.50779 16.4593 5.75805L16.0416 6.17515C15.7911 6.34199 15.457 6.42541 15.2064 6.25857L14.037 5.75805C13.7864 5.67463 13.6194 5.42437 13.5358 5.09069L13.3688 4.50675C13.2853 4.08964 12.9511 3.75596 12.5335 3.75596C12.1994 3.75596 11.8653 3.75596 11.6147 3.75596C11.1971 3.75596 10.863 4.08964 10.7795 4.50675L10.6959 5.17411C10.6959 5.42437 10.4453 5.67463 10.1948 5.84147L9.02539 6.25857C8.69129 6.42541 8.44071 6.34199 8.19013 6.17515L7.60544 5.75805C7.27133 5.50779 6.77017 5.50779 6.51959 5.84147C6.26901 6.00831 6.10196 6.25857 5.85138 6.42541C5.6008 6.75909 5.51727 7.17619 5.85138 7.50987L6.18549 8.09382C6.35254 8.34408 6.43607 8.67776 6.26901 8.92802L5.76785 10.0959C5.68433 10.3462 5.43375 10.513 5.09964 10.5964L4.43143 10.6798C4.01379 10.7633 3.67969 11.0969 3.67969 11.514C3.67969 11.8477 3.67969 12.1814 3.67969 12.4317C3.67969 12.8488 4.01379 13.1825 4.43143 13.2659L5.09964 13.3493C5.35022 13.3493 5.6008 13.5996 5.76785 13.8498L6.26901 15.1011C6.35254 15.3514 6.35254 15.6851 6.18549 15.9353L5.76785 16.5193C5.51727 16.8529 5.51727 17.3535 5.85138 17.6037C6.01843 17.7706 6.26901 18.0208 6.51959 18.2711C6.8537 18.5213 7.27133 18.6048 7.60544 18.3545L8.02307 17.854C8.27365 17.6871 8.60776 17.6037 8.85834 17.7706L10.0277 18.2711C10.2783 18.3545 10.4453 18.6048 10.5289 18.9384L10.6124 19.6058C10.7795 20.0229 11.1136 20.3566 11.5312 20.3566ZM18.798 6.92593C18.798 6.92593 18.798 7.00935 18.798 6.92593V6.92593Z"></path>
    <path d="M12.0324 17.0198C9.27597 17.0198 7.02075 14.7675 7.02075 12.0146C7.02075 9.26172 9.27597 7.00937 12.0324 7.00937C14.7887 7.00937 17.044 9.26172 17.044 12.0146C17.044 14.7675 14.7887 17.0198 12.0324 17.0198ZM12.0324 8.67777C10.1948 8.67777 8.69129 10.1793 8.69129 12.0146C8.69129 13.8498 10.1948 15.3514 12.0324 15.3514C13.8699 15.3514 15.3734 13.8498 15.3734 12.0146C15.3734 10.1793 13.8699 8.67777 12.0324 8.67777Z"></path>
  </svg>;

You can configure your Upsun environments to send emails through an SMTP proxy.

Emails aren't guaranteed to be deliverable and you can't white-label them.
The SMTP proxy is intended as a zero-configuration, best-effort service.

<Note>
  Each preview environment (a development or staging environment) has its own SendGrid sub-user, so the 12,000 email credits per calendar month limit applies individually per environment, not as a shared pool across your project.
</Note>

## 1. Turn on outgoing email

You can turn on outgoing email for each environment.
By default, email is turned on for your Production environment and blocked for other environments.

To turn it on for a specific environment, follow these steps:

<Tabs>
  <Tab title="In the Console">
    1. Select the project.
    2. Select the environment from the **Environment** menu.
    3. Click <SettingsIcon /> **Settings**.
    4. On the **General** tab, select the **Enable outgoing emails** checkbox.

    To turn off outgoing email, clear the **Enable outgoing emails** checkbox.
  </Tab>

  <Tab title="Using the CLI">
    To turn on outgoing email, run the following command:

    ```bash theme={null}
    upsun environment:info --environment <ENVIRONMENT_NAME> enable_smtp true
    ```

    To turn off outgoing email, replace `true` with `false`.
  </Tab>
</Tabs>

Changing the setting rebuilds the environment.

## 2. (Recommended) Improve deliverability

Improve deliverability of your email with [Sender Policy Framework (SPF)](https://www.twilio.com/docs/sendgrid/glossary/spf).
If you don't have an SPF record, add the following `TXT` record to your domain's DNS records:

```txt theme={null}
v=spf1 include:sendgrid.net -all
```

Having several, conflicting `TXT` records isn't supported due to [rfc4408 section 3.1.2](https://datatracker.ietf.org/doc/html/rfc4408#section-3.1.2).

If you already have an SPF record, add SendGrid to your existing record.

## 3. (Optional) Validate your email

You can request DomainKeys Identified Mail (DKIM) validation for your domain.

DKIM improves your delivery rate as an email sender.
Learn more about [how DKIM works](https://www.twilio.com/docs/sendgrid/glossary/dkim).

To have DKIM enabled for your domain:

1. Open a [support ticket](/docs/core-concepts/get-support) and request the following, replacing `<SENDER_EMAIL_ADDRESS>` with the address you send from:

   ```
   subject: DKIM record

   Hello,

   I'd like to request DKIM records to be generated for project <PROJECT_ID>. Emails are sent from the address <SENDER_EMAIL_ADDRESS>.

   Kind regards
   ```

   <Note>
     The DKIM domain might not be the same as your site domain (but it can be). DKIM needs to be generated on the domain of the `<SENDER_EMAIL_ADDRESS>` you provide above (the *sender* address), not necessarily your site's domain. For example, if `<SENDER_EMAIL_ADDRESS>` is `noreply@media.yourdomain.com`, request DKIM for `media.yourdomain.com`, not `yourdomain.com`.

     Make sure you've sent at least one email before requesting DKIM.
   </Note>

2. Add the `CNAME` and `TXT` records from the support team's reply to your domain's DNS configuration.

   The reply looks similar to the following:

   ```txt theme={null}
   em1._domainkey.yourdomain.com        CNAME   em1.domainkey.u99999999.wl999.sendgrid.net
   em12._domainkey.yourdomain.com       CNAME   em12.domainkey.u99999999.wl999.sendgrid.net
   em9999.yourdomain.com        CNAME   u99999999.wl999.sendgrid.net

   yourdomain.com       TXT     v=spf1 include:em9999.yourdomain.com
   ```

   This `TXT` record replaces the generic one from [step 2](#2-recommended-improve-deliverability) — as part of DKIM setup, SendGrid provides a unique SPF record for your domain instead of the generic one.

   Checks for the expected DNS records run every 15 minutes. After SendGrid detects the records, it confirms them automatically — you don't need to take any further action.

   <Note>
     SendGrid rotates DKIM keys on an internal schedule that it doesn't publish, and offers no manual rotation option — the process is entirely transparent to you.
   </Note>

## 4. Test the email service

To test the email service, use the [CLI](/cli) to connect to your app by running `upsun ssh`.
Run the following command:

```bash theme={null}
printf "From: <SENDER_EMAIL_ADDRESS>\nSubject: Test \nThis is a test message" | /usr/sbin/sendmail <RECIPIENT_EMAIL_ADDRESS>
```

Replace the variables with actual email addresses as in the following example:

```bash theme={null}
printf "From: someone@example.com\nSubject: Test \nThis is a test message" | /usr/sbin/sendmail someone@example.net
```

Check the recipient's inbox, including the spam folder — the test message should arrive within a few minutes.

<Warning>
  When sending emails from your project, use an address on the same domain you requested DKIM for (see the [domain note](#3-optional-validate-your-email) above), otherwise the message will be flagged as a spoofing attempt and not be sent.

  Also, **make sure to test with real email addresses**. If you send emails to fake domains (such as `example.com`), they fail and hurt your sending reputation. Make sure your test emails are deliverable.
</Warning>

## 5. Send email from your app

You can use `/usr/sbin/sendmail` on your app container to send emails as with the example in the previous step.
Or use the `PLATFORM_SMTP_HOST` environment variable in your SMTP configuration.

When outgoing emails are on, `PLATFORM_SMTP_HOST` is the address of the SMTP host that should be used.
When outgoing emails are off, the variable is empty.

When using `PLATFORM_SMTP_HOST`, send email through port 25 (often the default).
Your emails are proxied through the Upsun SMTP host and encrypted over port 465
before being sent to the outside world.

The precise way to send email depends on the language and framework you use.
The following examples show PHP and Java.

<Tabs>
  <Tab title="PHP">
    To send email in PHP, you can use the built-in [`mail()` function](https://www.php.net/manual/en/function.mail.php).
    The PHP runtime is configured to send email automatically with the correct configuration.
    This works even for libraries such as PHPMailer, which uses the `mail()` function by default.

    **The `From` header is required**. Your email will not be sent if the header is missing.

    Beware of potential security problems when using the `mail()` function.
    If you use any input from users in the `$additional_headers` or `$additional_params` parameters,
    be sure to sanitize it first.
  </Tab>

  <Tab title="Java">
    JavaMail is a Java API used to send and receive email through SMTP, POP3, and IMAP.
    JavaMail is built into the [Jakarta EE](https://jakarta.ee/) platform, but also provides an optional package for use in Java SE.

    [Jakarta Mail](https://projects.eclipse.org/projects/ee4j.mail) defines a platform-independent and protocol-independent framework to build mail and messaging applications.

    The following example sends email using Jakarta Mail:

    ```java theme={null}
    import sh.platform.config.Config;

    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.util.Properties;
    import java.util.logging.Level;
    import java.util.logging.Logger;

    public class JavaEmailSender {

        private static final Logger LOGGER = Logger.getLogger(JavaEmailSender.class.getName());

        public void send() {
            Config config = new Config();
            String to = "";//change accordingly
            String from = "";//change accordingly
            String host = config.getSmtpHost();
            //or IP address
            //Get the session object
            Properties properties = System.getProperties();
            properties.setProperty("mail.smtp.host", host);
            Session session = Session.getDefaultInstance(properties);

            //compose the message
            try {
                MimeMessage message = new MimeMessage(session);
                message.setFrom(new InternetAddress(from));
                message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
                message.setSubject("Ping");
                message.setText("Hello, this is example of sending email  ");

                // Send message
                Transport.send(message);
                System.out.println("message sent successfully....");

            } catch (MessagingException exp) {
                exp.printStackTrace();
                LOGGER.log(Level.SEVERE, "there is an error to send an message", exp);
            }
        }
    }

    ```

    Guides on using JavaMail:

    * [Send email with HTML formatting and attachments](https://mkyong.com/java/java-how-to-send-email/)
    * [JavaMail API](https://javaee.github.io/javamail/)
  </Tab>
</Tabs>

## Alternative: Use a different email server

If you need more options, use your own SMTP server or email delivery service provider.
Remember that TCP port 25 is blocked for security reasons.
Use port 465 or 587 instead to send email to your own external email server.
