Showing preview only (3,158K chars total). Download the full file or copy to clipboard to get everything.
Repository: sendgrid/docs
Branch: develop
Commit: c3eb3fef6132
Files: 627
Total size: 40.7 MB
Directory structure:
gitextract_6lgdzn0_/
├── .browserslistrc
├── .eslintignore
├── .eslintrc.json
├── .github/
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE
│ └── PULL_REQUEST_TEMPLATE
├── .gitignore
├── .nvmrc
├── .prettierrc
├── .stylelintrc
├── .travis.yml
├── .vscode/
│ └── settings.json
├── CODE_OF_CONDUCT.md
├── README.md
├── content/
│ └── docs/
│ ├── examples.md
│ ├── for-developers/
│ │ ├── parsing-email/
│ │ │ ├── inbound-email.md
│ │ │ └── setting-up-the-inbound-parse-webhook.md
│ │ ├── partners/
│ │ │ ├── account-migration.md
│ │ │ ├── amazon-marketplace.md
│ │ │ ├── azure.md
│ │ │ ├── google.md
│ │ │ ├── jelastic.md
│ │ │ ├── microsoft-azure-2021.md
│ │ │ └── microsoft-azure.md
│ │ ├── sending-email/
│ │ │ ├── api-getting-started.md
│ │ │ ├── applemail.md
│ │ │ ├── authentication.md
│ │ │ ├── automating-subusers.md
│ │ │ ├── brite-verify.md
│ │ │ ├── building-an-x-smtpapi-header.md
│ │ │ ├── cakephp.md
│ │ │ ├── categories.md
│ │ │ ├── cloud-rail.md
│ │ │ ├── codeigniter.md
│ │ │ ├── cors.md
│ │ │ ├── curl-examples.md
│ │ │ ├── django.md
│ │ │ ├── drupal.md
│ │ │ ├── enforced-tls.md
│ │ │ ├── exchange-2010.md
│ │ │ ├── exim.md
│ │ │ ├── formio.md
│ │ │ ├── getting-started-email-activity-api.md
│ │ │ ├── getting-started-smtp.md
│ │ │ ├── getting-started-with-transactional-emails.md
│ │ │ ├── how-to-create-a-subuser-with-the-api.md
│ │ │ ├── how-to-use-a-transactional-template-with-smtp-or-v2.md
│ │ │ ├── iis75.md
│ │ │ ├── integrating-with-the-smtp-api.md
│ │ │ ├── interspire.md
│ │ │ ├── joomla.md
│ │ │ ├── laravel.md
│ │ │ ├── libraries.md
│ │ │ ├── mailpoet.md
│ │ │ ├── migrating-from-v2-to-v3-mail-send.md
│ │ │ ├── modx.md
│ │ │ ├── outlook-2013.md
│ │ │ ├── outlook.md
│ │ │ ├── personalizations.md
│ │ │ ├── phpbb.md
│ │ │ ├── piesync.md
│ │ │ ├── postfix.md
│ │ │ ├── qmail.md
│ │ │ ├── quickstart-go.md
│ │ │ ├── quickstart-nodejs.md
│ │ │ ├── quickstart-php.md
│ │ │ ├── quickstart-python.md
│ │ │ ├── quickstart-ruby.md
│ │ │ ├── rubyonrails.md
│ │ │ ├── sandbox-mode.md
│ │ │ ├── scheduling-email.md
│ │ │ ├── scheduling-parameters.md
│ │ │ ├── section-tags.md
│ │ │ ├── segmentation-query-language.md
│ │ │ ├── send-mime-messages-with-sendgrid.md
│ │ │ ├── sender-identity.md
│ │ │ ├── sendmail.md
│ │ │ ├── single-sends-2020-update.md
│ │ │ ├── smtp-errors-and-troubleshooting.md
│ │ │ ├── smtp-filters.md
│ │ │ ├── smtp-go-code-example.md
│ │ │ ├── smtp-nodejs-code-example.md
│ │ │ ├── smtp-perl-code-example.md
│ │ │ ├── smtp-php-code-example.md
│ │ │ ├── smtp-python-code-example.md
│ │ │ ├── smtp-ruby-code-example.md
│ │ │ ├── ssmtp.md
│ │ │ ├── stopping-a-scheduled-send.md
│ │ │ ├── stopping-an-in-progress-send.md
│ │ │ ├── substitution-tags.md
│ │ │ ├── sugarcrm.md
│ │ │ ├── suppressions.md
│ │ │ ├── symfony.md
│ │ │ ├── thunderbird.md
│ │ │ ├── unique-arguments.md
│ │ │ ├── upgrade-your-authentication-method-to-api-keys.md
│ │ │ ├── using-handlebars.md
│ │ │ ├── v2-csharp-code-example.md
│ │ │ ├── v2-go-code-example.md
│ │ │ ├── v2-java-code-example.md
│ │ │ ├── v2-nodejs-code-example.md
│ │ │ ├── v2-perl-code-example.md
│ │ │ ├── v2-php-code-example.md
│ │ │ ├── v2-python-code-example.md
│ │ │ ├── v2-ruby-code-example.md
│ │ │ ├── v3-csharp-code-example.md
│ │ │ ├── v3-go-code-example.md
│ │ │ ├── v3-java-code-example.md
│ │ │ ├── v3-kotlin-code-example.md
│ │ │ ├── v3-mail-send-faq.md
│ │ │ ├── v3-php-code-example.md
│ │ │ ├── v3-python-code-example.md
│ │ │ ├── v3-ruby-code-example.md
│ │ │ ├── wordpress-faq.md
│ │ │ ├── wordpress-plugin.md
│ │ │ ├── wordpress-subscription-widget.md
│ │ │ ├── zapier-sending-for-gravity-forms-submissions.md
│ │ │ ├── zapier-sending-for-new-webhook-data.md
│ │ │ ├── zapier-sending-for-postgre-sql-row-matches.md
│ │ │ ├── zapier-sending-from-google-sheet-rows.md
│ │ │ ├── zapier-sending-to-tagged-infusionsoft-contacts.md
│ │ │ ├── zapier-sending-when-new-firebase-child-records-added.md
│ │ │ └── zend.md
│ │ └── tracking-events/
│ │ ├── analytics-with-keen-io.md
│ │ ├── csharp-code-example.md
│ │ ├── event-kit.md
│ │ ├── event.md
│ │ ├── getting-started-event-webhook-security-features.md
│ │ ├── getting-started-event-webhook.md
│ │ ├── go-code-example.md
│ │ ├── google-amp-for-email.md
│ │ ├── nodejs-code-example.md
│ │ ├── php-code-example.md
│ │ ├── python-code-example.md
│ │ ├── segment-sendgrid-source.md
│ │ └── troubleshooting.md
│ ├── glossary/
│ │ ├── 7-bit-encoding.md
│ │ ├── a-record.md
│ │ ├── account-reputation-dashboard.md
│ │ ├── ad-exchange.md
│ │ ├── ad-impression.md
│ │ ├── ad-unit.md
│ │ ├── affiliate-marketing.md
│ │ ├── allow-list.md
│ │ ├── automated-email.md
│ │ ├── autoresponder.md
│ │ ├── bayesian-filter.md
│ │ ├── blocks.md
│ │ ├── bounces.md
│ │ ├── bulk-email-service.md
│ │ ├── bulk-mail-folder.md
│ │ ├── campaigns.md
│ │ ├── can-spam.md
│ │ ├── categories.md
│ │ ├── challenge-response.md
│ │ ├── clicks.md
│ │ ├── cname.md
│ │ ├── complaint.md
│ │ ├── ctr.md
│ │ ├── custom-fields.md
│ │ ├── deferrals.md
│ │ ├── deliverability.md
│ │ ├── deliveries.md
│ │ ├── demand-side-platform.md
│ │ ├── deny-list.md
│ │ ├── direct-response-advertising.md
│ │ ├── dkim.md
│ │ ├── dmarc.md
│ │ ├── dns.md
│ │ ├── domain-authentication.md
│ │ ├── domain.md
│ │ ├── drip-campaign.md
│ │ ├── drops.md
│ │ ├── email-api-integration.md
│ │ ├── email-authentication.md
│ │ ├── email-harvesting.md
│ │ ├── email-marketing.md
│ │ ├── email-service-provider.md
│ │ ├── event-webhook.md
│ │ ├── expandable-banner.md
│ │ ├── expired.md
│ │ ├── feedback-loop.md
│ │ ├── flighting-in-advertising.md
│ │ ├── fqdn.md
│ │ ├── frequency-capping.md
│ │ ├── gdpr.md
│ │ ├── header.md
│ │ ├── imap.md
│ │ ├── invalid-email.md
│ │ ├── ip-address.md
│ │ ├── ip-warmup.md
│ │ ├── link-branding.md
│ │ ├── lists.md
│ │ ├── mail-merge.md
│ │ ├── mailbox-provider.md
│ │ ├── message-id.md
│ │ ├── mta.md
│ │ ├── mx-record.md
│ │ ├── native-advertising.md
│ │ ├── open-rate.md
│ │ ├── openrelay.md
│ │ ├── opens.md
│ │ ├── peer-invitations.md
│ │ ├── phishing.md
│ │ ├── preheader.md
│ │ ├── programmatic-media-buying.md
│ │ ├── rate-limiting.md
│ │ ├── reconfirmation.md
│ │ ├── request.md
│ │ ├── reseller-email-account.md
│ │ ├── reserved-fields.md
│ │ ├── reverse-dns.md
│ │ ├── scheduled-emails.md
│ │ ├── segmentation.md
│ │ ├── segments.md
│ │ ├── sender-authentication.md
│ │ ├── sender-id.md
│ │ ├── senders.md
│ │ ├── sends.md
│ │ ├── single-send.md
│ │ ├── smtp-api.md
│ │ ├── smtp-provider.md
│ │ ├── smtp-relay.md
│ │ ├── smtp-server.md
│ │ ├── smtp-service.md
│ │ ├── smtp.md
│ │ ├── spam-filter.md
│ │ ├── spam-reports.md
│ │ ├── spam-traps.md
│ │ ├── spam.md
│ │ ├── spf.md
│ │ ├── spoofing.md
│ │ ├── subscriber-list-management.md
│ │ ├── suspicious-sender.md
│ │ ├── system-fields.md
│ │ ├── teammates.md
│ │ ├── throttling.md
│ │ ├── timezone.md
│ │ ├── tls.md
│ │ ├── transactional-email-templates.md
│ │ ├── transactional-email.md
│ │ ├── triggered-actions.md
│ │ ├── triggered-email.md
│ │ ├── trusted-sender.md
│ │ ├── two-factor-authentication.md
│ │ ├── undelivered-email.md
│ │ ├── unknown-user.md
│ │ ├── utm-parameters.md
│ │ ├── web-api.md
│ │ ├── whitelabel.md
│ │ └── x-message-id.md
│ ├── release-notes/
│ │ ├── 2017-07-07.md
│ │ ├── 2017-08-01.md
│ │ ├── 2017-09-05.md
│ │ ├── 2017-09-14.md
│ │ ├── 2017-10-02.md
│ │ ├── 2017-10-11.md
│ │ ├── 2017-11-01.md
│ │ ├── 2017-12-20.md
│ │ ├── 2018-01-04.md
│ │ ├── 2018-02-13.md
│ │ ├── 2018-02-16.md
│ │ ├── 2018-02-27.md
│ │ ├── 2018-03-01.md
│ │ ├── 2018-03-06.md
│ │ ├── 2018-03-08.md
│ │ ├── 2018-03-14.md
│ │ ├── 2018-03-16.md
│ │ ├── 2018-03-29.md
│ │ ├── 2018-04-09.md
│ │ ├── 2018-04-10.md
│ │ ├── 2018-04-11.md
│ │ ├── 2018-04-17.md
│ │ ├── 2018-05-01.md
│ │ ├── 2018-05-15.md
│ │ ├── 2018-06-06.md
│ │ ├── 2018-07-23.md
│ │ ├── 2018-08-08.md
│ │ ├── 2018-08-22.md
│ │ ├── 2018-09-26.md
│ │ ├── 2018-10-15.md
│ │ ├── 2018-11-05.md
│ │ ├── 2018-11-09.md
│ │ ├── 2018-11-14.md
│ │ ├── 2018-12-01.md
│ │ ├── 2018-12-17.md
│ │ ├── 2019-01-17.md
│ │ ├── 2019-02-25.md
│ │ ├── 2019-04-01.md
│ │ ├── 2019-04-02.md
│ │ ├── 2019-04-03.md
│ │ ├── 2019-04-17.md
│ │ ├── 2019-04-22.md
│ │ ├── 2019-05-09.md
│ │ ├── 2019-06-04.md
│ │ ├── 2019-07-02.md
│ │ ├── 2019-07-10.md
│ │ ├── 2019-07-16.md
│ │ ├── 2019-07-31.md
│ │ ├── 2019-08-06.md
│ │ ├── 2019-08-26.md
│ │ ├── 2019-08-27.md
│ │ ├── 2019-09-04.md
│ │ ├── 2019-09-05.md
│ │ ├── 2019-09-10.md
│ │ ├── 2019-09-19.md
│ │ ├── 2019-09-23.md
│ │ ├── 2019-09-25.md
│ │ ├── 2019-09-27.md
│ │ ├── 2019-10-01.md
│ │ ├── 2019-10-09.md
│ │ ├── 2019-10-10.md
│ │ ├── 2019-10-23.md
│ │ ├── 2019-19-12.md
│ │ ├── 2020-01-01.md
│ │ ├── 2020-01-13.md
│ │ ├── 2020-01-29.md
│ │ ├── 2020-02-10.md
│ │ ├── 2020-03-19.md
│ │ ├── 2020-04-07.md
│ │ ├── 2020-04-13.md
│ │ ├── 2020-04-21.md
│ │ ├── 2020-04-30.md
│ │ ├── 2020-05-06.md
│ │ ├── 2020-05-18.md
│ │ ├── 2020-07-13.md
│ │ ├── 2020-07-21.md
│ │ ├── 2020-08-13.md
│ │ ├── 2020-08-17.md
│ │ ├── 2020-08-19.md
│ │ ├── 2020-09-03.md
│ │ ├── 2020-09-16.md
│ │ ├── 2020-09-17.md
│ │ ├── 2020-09-29.md
│ │ ├── 2020-11-11.md
│ │ ├── 2020-11-18.md
│ │ ├── 2020-12-01.md
│ │ ├── 2020-12-03.md
│ │ ├── 2020-12-09.md
│ │ ├── 2020-12-10.md
│ │ ├── 2020-12-16.md
│ │ ├── 2020-12-17.md
│ │ ├── 2021-01-07.md
│ │ ├── 2021-01-12.md
│ │ ├── 2021-01-13.md
│ │ ├── 2021-01-19.md
│ │ ├── 2021-02-17.md
│ │ ├── 2021-03-15.md
│ │ ├── 2021-03-24.md
│ │ ├── 2021-03-30.md
│ │ ├── 2021-04-13.md
│ │ ├── 2021-05-19.md
│ │ ├── 2021-05-25.md
│ │ └── 2021-06-02.md
│ └── ui/
│ ├── account-and-settings/
│ │ ├── accessing-email-account-associated-with-sendgrid.md
│ │ ├── account-compromised.md
│ │ ├── account-under-review.md
│ │ ├── account.md
│ │ ├── alerts.md
│ │ ├── api-keys.md
│ │ ├── billing.md
│ │ ├── cancel-your-account.md
│ │ ├── configuring-sign-in-with-apple.md
│ │ ├── custom-ssl-configurations.md
│ │ ├── dedicated-ip-addresses.md
│ │ ├── dkim-records.md
│ │ ├── dns-providers.md
│ │ ├── forced-password-reset-faq.md
│ │ ├── heroku-credentials.md
│ │ ├── hipaa-compliant.md
│ │ ├── how-to-set-up-domain-authentication.md
│ │ ├── how-to-set-up-link-branding.md
│ │ ├── how-to-set-up-reverse-dns.md
│ │ ├── inbound-parse.md
│ │ ├── ip-access-management.md
│ │ ├── ip-pools.md
│ │ ├── log-in-issues.md
│ │ ├── mail.md
│ │ ├── notifications.md
│ │ ├── partners.md
│ │ ├── password-reset-appdirect.md
│ │ ├── password-reset-azure.md
│ │ ├── password-reset-email.md
│ │ ├── password-reset-ibm-cloud-marketplace.md
│ │ ├── password-reset-openshift.md
│ │ ├── password-reset-softlayer.md
│ │ ├── pci-compliant.md
│ │ ├── reading-your-invoice.md
│ │ ├── resetting-your-username-and-password.md
│ │ ├── retired-mail-settings.md
│ │ ├── reverse-dns.md
│ │ ├── safely-test-your-sending-speed.md
│ │ ├── spf-dkim.md
│ │ ├── spf-limitations.md
│ │ ├── spf-records.md
│ │ ├── sso-okta.md
│ │ ├── sso.md
│ │ ├── subusers.md
│ │ ├── support.md
│ │ ├── taxes-and-tax-exempt.md
│ │ ├── teammates.md
│ │ ├── tracking.md
│ │ ├── troubleshooting-delays-and-latency.md
│ │ ├── troubleshooting-sender-authentication.md
│ │ ├── two-factor-authentication.md
│ │ ├── upgrading-your-account.md
│ │ └── verifying-your-account.md
│ ├── analytics-and-reporting/
│ │ ├── browser-comparison.md
│ │ ├── browser.md
│ │ ├── categories.md
│ │ ├── category-comparison.md
│ │ ├── click-tracking-html-best-practices.md
│ │ ├── click-tracking-ssl.md
│ │ ├── device.md
│ │ ├── email-activity-feed.md
│ │ ├── email-activity.md
│ │ ├── geographic.md
│ │ ├── global.md
│ │ ├── google-analytics.md
│ │ ├── interpreting-expert-insights.md
│ │ ├── mailbox-provider-comparison.md
│ │ ├── marketing-campaigns-stats-overview.md
│ │ ├── marketing-campaigns-stats.md
│ │ ├── migrating-from-the-new-relic-plugin.md
│ │ ├── spam-reports.md
│ │ ├── stats-overview.md
│ │ ├── subscribing-to-expert-insights.md
│ │ ├── subuser-comparison.md
│ │ ├── subuser.md
│ │ ├── tracking-data-with-keen-io.md
│ │ └── tracking-stats-using-new-relic.md
│ ├── managing-contacts/
│ │ ├── building-your-contact-list.md
│ │ ├── create-and-manage-contacts.md
│ │ ├── custom-fields.md
│ │ ├── email-address-validation.md
│ │ ├── formatting-a-csv.md
│ │ └── segmenting-your-contacts.md
│ └── sending-email/
│ ├── a-b-testing.md
│ ├── adding-dynamic-content-with-handlebars-in-marketing-campaigns.md
│ ├── attachments-with-digioh.md
│ ├── blocks.md
│ ├── bounces.md
│ ├── checking-email-source.md
│ ├── coming-soon-to-new-marketing-campaigns.md
│ ├── content-delivery-networks.md
│ ├── create-and-edit-legacy-transactional-templates.md
│ ├── create-and-manage-unsubscribe-groups.md
│ ├── cross-platform-html-design.md
│ ├── deliverability.md
│ ├── deny-lists.md
│ ├── dmarc.md
│ ├── editor.md
│ ├── email-flow.md
│ ├── email-testing.md
│ ├── email-to-sms.md
│ ├── formatting-html.md
│ ├── getting-started-with-automation.md
│ ├── global-unsubscribes.md
│ ├── google-feedback-loop.md
│ ├── group-unsubscribes.md
│ ├── how-to-implement-dmarc.md
│ ├── how-to-send-an-email-with-dynamic-transactional-templates.md
│ ├── how-to-send-email-with-marketing-campaigns.md
│ ├── image-editor.md
│ ├── index-suppressions.md
│ ├── invalid-emails.md
│ ├── ip-warmup-for-the-new-marketing-campaigns-experience.md
│ ├── legacy-newsletter-sunset.md
│ ├── list-unsubscribe.md
│ ├── migrating-from-legacy-marketing-campaigns.md
│ ├── migrating-from-legacy-templates.md
│ ├── old-editor-sunset.md
│ ├── recipient-subscription-preferences.md
│ ├── sender-verification.md
│ ├── senders.md
│ ├── single-sends.md
│ ├── spam-traps.md
│ ├── spam.md
│ ├── ssl-vs-tls.md
│ ├── subscription-tracking.md
│ ├── substitution-and-section-tags.md
│ ├── tls.md
│ ├── universal-links.md
│ ├── unsubscribe-groups.md
│ ├── warming-up-an-ip-address.md
│ ├── weblink.md
│ └── working-with-marketing-campaigns-email-designs.md
├── data/
│ └── SiteConfig.js
├── first-timers-tr.md
├── first-timers.md
├── gatsby-browser.js
├── gatsby-config.js
├── gatsby-node.js
├── jsconfig.json
├── license
├── package.json
├── plugins/
│ ├── sendgrid-remark-code-in-html/
│ │ ├── index.js
│ │ └── package.json
│ ├── sendgrid-remark-headers/
│ │ ├── index.js
│ │ └── package.json
│ ├── sendgrid-remark-paths/
│ │ ├── index.js
│ │ └── package.json
│ └── sendgrid-remark-tables/
│ ├── index.js
│ └── package.json
├── redirects.js
├── src/
│ ├── components/
│ │ ├── About/
│ │ │ ├── About.scss
│ │ │ └── index.jsx
│ │ ├── AsideMenu/
│ │ │ └── index.jsx
│ │ ├── BreadCrumbs/
│ │ │ └── index.jsx
│ │ ├── Footer/
│ │ │ ├── Footer.scss
│ │ │ └── index.jsx
│ │ ├── FooterCallout/
│ │ │ ├── FooterCallout.scss
│ │ │ └── index.jsx
│ │ ├── GlossaryPartial/
│ │ │ ├── GlossaryPartial.scss
│ │ │ └── glossaryPartial.jsx
│ │ ├── Group/
│ │ │ └── index.jsx
│ │ ├── Libaries/
│ │ │ ├── index.jsx
│ │ │ └── libaries.scss
│ │ ├── NavMain/
│ │ │ ├── NavMain.scss
│ │ │ └── index.jsx
│ │ ├── NavSub/
│ │ │ ├── NavSub.scss
│ │ │ └── index.jsx
│ │ ├── Rating/
│ │ │ ├── Rating.scss
│ │ │ └── index.js
│ │ ├── ReleaseNotes/
│ │ │ ├── ReleaseKey.jsx
│ │ │ └── ReleaseNotePost.jsx
│ │ ├── SEO/
│ │ │ └── index.jsx
│ │ ├── Search/
│ │ │ ├── index.jsx
│ │ │ └── search.scss
│ │ ├── SocialLinks/
│ │ │ ├── SocialLinks.css
│ │ │ └── index.jsx
│ │ ├── StatusPage/
│ │ │ ├── index.jsx
│ │ │ └── statusPage.scss
│ │ ├── layout/
│ │ │ ├── NoHeaderFooter.jsx
│ │ │ └── index.jsx
│ │ └── withUser/
│ │ └── index.jsx
│ ├── componentsMarkdown/
│ │ ├── Callout.jsx
│ │ ├── CalloutLink.jsx
│ │ ├── CodeGroup.jsx
│ │ ├── Gist.jsx
│ │ └── PageAnchor.jsx
│ ├── constants/
│ │ ├── categories.js
│ │ ├── footerLinks.js
│ │ ├── forDevelopersCards.js
│ │ ├── glossaryTerms.js
│ │ ├── groups.js
│ │ ├── homeCallouts.js
│ │ ├── homeCards.js
│ │ ├── libraries.js
│ │ ├── pageLinks.js
│ │ ├── socialLinks.js
│ │ └── starWars.js
│ ├── html.jsx
│ ├── pages/
│ │ ├── 404.jsx
│ │ ├── 404.scss
│ │ ├── api-reference.jsx
│ │ ├── api-reference.scss
│ │ ├── for-developers.jsx
│ │ ├── for-developers.scss
│ │ ├── glossary.jsx
│ │ ├── glossary.scss
│ │ ├── index.jsx
│ │ ├── index.scss
│ │ ├── release-notes.jsx
│ │ ├── release-notes.scss
│ │ └── site-map.jsx
│ ├── scss/
│ │ ├── components/
│ │ │ ├── _accordions.scss
│ │ │ ├── _alerts.scss
│ │ │ ├── _algolia.scss
│ │ │ ├── _badges.scss
│ │ │ ├── _breadcrumbs.scss
│ │ │ ├── _buttons.scss
│ │ │ ├── _cards.scss
│ │ │ ├── _center-modals.scss
│ │ │ ├── _checkboxes-radios.scss
│ │ │ ├── _confirmation-alerts.scss
│ │ │ ├── _date-range.scss
│ │ │ ├── _dropdowns.scss
│ │ │ ├── _dropzones.scss
│ │ │ ├── _email-cards.scss
│ │ │ ├── _filters.scss
│ │ │ ├── _horizontal-rules.scss
│ │ │ ├── _loader.scss
│ │ │ ├── _meters.scss
│ │ │ ├── _modals.scss
│ │ │ ├── _numbered-steps.scss
│ │ │ ├── _pagination.scss
│ │ │ ├── _progress-stages.scss
│ │ │ ├── _ranges.scss
│ │ │ ├── _segment-terms.scss
│ │ │ ├── _selects.scss
│ │ │ ├── _switches.scss
│ │ │ ├── _tables.scss
│ │ │ ├── _tabs.scss
│ │ │ ├── _text-inputs.scss
│ │ │ ├── _textareas.scss
│ │ │ └── _tooltips.scss
│ │ ├── global/
│ │ │ ├── _grid.scss
│ │ │ ├── _main.scss
│ │ │ ├── _mixins.scss
│ │ │ ├── _reset.scss
│ │ │ ├── _typography.scss
│ │ │ ├── _utilities.scss
│ │ │ └── _variables.scss
│ │ └── style-guide.scss
│ └── templates/
│ ├── category.jsx
│ ├── category.scss
│ ├── doc.jsx
│ ├── doc.scss
│ └── syntax-highlighting.scss
├── static/
│ ├── assets/
│ │ ├── TwilioSendGrid_Sample_Dashboard_NoSubusers.json
│ │ ├── TwilioSendGrid_Sample_Dashboard_WithSubusers.json
│ │ ├── example.csv
│ │ ├── global-ca466351408fcb1dae4bdec742db56d2.js
│ │ └── global-ecc286f800632a989058f964b0d52b7a.css
│ ├── config.json
│ ├── images/
│ │ ├── RT_1.0.html
│ │ ├── RT_2.0.html
│ │ ├── RT_3.0.html
│ │ ├── code.txt
│ │ └── sg-devguide002.png.bak
│ └── img/
│ └── Scream750.psd
├── styleguide.md
└── travis/
├── after_deploy.sh
├── build.sh
├── deploy.sh
└── deploy_open_source.sh
================================================
FILE CONTENTS
================================================
================================================
FILE: .browserslistrc
================================================
Last 2 versions
================================================
FILE: .eslintignore
================================================
public
static
.cache
content
================================================
FILE: .eslintrc.json
================================================
{
"extends": ["airbnb"],
"plugins": ["react", "jsx-a11y", "import"],
"rules": {
"react/prefer-stateless-function": "off",
"react/prop-types": "off",
"react/no-danger": "off",
"jsx-a11y/no-noninteractive-element-to-interactive-role": "off",
"jsx-a11y/anchor-is-valid": [ "error", { "components": [ "Link" ], "specialLink": [ "to" ] } ]
},
"settings": {
"import/core-modules": []
},
"env": {
"browser": true
}
}
================================================
FILE: .github/CONTRIBUTING.md
================================================
Hello! Thank you for choosing to help contribute to one of the SendGrid open source libraries. There are many ways you can contribute and help is always welcome. We simply ask that you follow the following contribution policies.
All third party contributors acknowledge that any contributions they provide will be made under the same open source license that the open source project is provided under.
* [Content Request](#feature-request)
* [Improvements to the Codebase](#improvements-to-the-codebase)
* [Local Setup](#install-and-run-locally)
* [Dependencies](#dependencies)
* [Setup Steps](#setup-steps)
* [Configure Jekyll](#configure-jekyll)
* [Running](#running)
* [View Your Install](#view-your-install)
* [Config](#config)
* [Pages](#pages)
* [SEO](#seo)
* [Custom Liquid Tags](#tags)
* [Anchors](#anchors)
* [Info blocks](#info_blocks)
* [API Examples](#api)
* [JS and CSS, etc.](#js_and_css)
* [Creating a Pull Request](#creating-a-pull-request)
Feel free to grab an issue you want to work on. Please indicate that you have begun work on it to avoid collisions. Once a PR is made, community review, comments, suggestions, and additional PRs are welcomed and encouraged.
**Submit all pull requests to the develop branch.**
There are a few ways to contribute, which we'll enumerate below:
<a name="feature-request"></a>
## Content Request
If you'd like to make a content request, please read this section.
The GitHub issue tracker is the preferred channel for docs content requests, but please respect the following restrictions:
- Please **search for existing issues** in order to ensure we don't have duplicate bugs/content requests.
- Please be respectful and considerate of others when commenting on issues.
<a name="improvements-to-the-codebase"></a>
## Improvements to the Codebase
We welcome direct contributions to the SendGrid docs code base. Thank you!
<a name="local"></a>
## Local Setup
<a name="dependencies"></a>
### Dependencies
* Required:
* Git
* Rvm
* Homebrew
* npm
* Gatsby
<a name="setup-steps"></a>
### Setup Steps
* Install Git for:
* [Mac](https://git-scm.com/download/mac)
* [Windows](https://git-scm.com/download/win)
* [Linux](https://git-scm.com/download/linux)
* Install RVM
`$ \curl -sSL https://get.rvm.io | bash -s stable --ruby`
* Install Homebrew (if you don't have it)
`$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`
* Install npm
`$ brew install npm`
**Note:** You may need to use 'sudo' before the command to get it to work as intended.
* Set your Node version
`$ npm install -g n`
`$ n 8.4.0`
* clone repo
`$ git clone https://github.com/sendgrid/docs.git`
* Go to your docs directory
`$ cd docs`
* switch to develop branch to make changes
`$ git checkout develop`
* Install Gatsby
`npm ci`
* Build the local site
`gatsby develop`
Gatsby starts a hot-reloading development environment accessible at [localhost:8000](localhost:8000)
<a name="config"></a>
## Config
The gatsby config is defined in [gatsby-config.js](../gatsby-config.js).
The site config is defined in [data/SiteConfig.js](../data/SiteConfig.js)
which you usually don't have to modify but are helpful to know about.
<a name="pages"></a>
### Pages
You can write pages in markdown, HTML, or HAML. They all get converted to HTML when the site is generated.
Pages have a block of YAML at the top that sets a few options. They are pretty self-explanatory; here's an example
```
---
layout: page
weight: 0
title: Docs Home
icon: icon-home
showTitle: false
navigation:
show: true
---
```
Weights are same as the folder weights - the higher numbers move higher up the tree. Icons are based on the CSS icon class names from Twitter Bootstrap. showTitle and navigation["show"] both default to true if not specified.
<a name="seo"></a>
#### SEO
Various fields pertinent to SEO can be controlled through the YAML front matter. Here's an example:
```
---
seo:
title: Really Great Documentation - SendGrid Documentation | SendGrid
override: true
description: This is some really great documentation! I hope you like it!
canonical: https://sendgrid.com/docs/really-great-docs
---
```
By default `<title>` tags follow the template `{Page Title} {Site Title}`. However the page title can be changed for the purpose of the tag by using `seo["title"]`. `seo["override"]` will override the entire template, instead making the title page `{seo["title"]}`. `description` and `canonical` change their respective tags.
<a name="tags"></a>
### Custom Liquid Tags
There are some custom plugins (look in the `plugins` folder) that define new liquid blocks for use in pages.
<a name="anchors"></a>
#### Anchors
You can create anchor tags that will have named anchors generated for them automatically with links on hover.
The parameter is the wrapping element to use.
```
{% anchor h2 %}
Some Anchor Text
{% endanchor %}
```
<a name="info_blocks"></a>
#### Info blocks
Similarly you can create info and warning blocks:
```
{% info %}
Some info for a breakout block.
{% endinfo %}
{% warning %}
...And a warning breakout.
{% endwarning %}
```
<a name="api"></a>
#### API Examples
If you are working on API reference docs, you can generate XML and JSON nav tabs and the corresponding example calls and responses like so:
```
{% apiexample identifier GET http://some.endpoint.url var1=stuff&var2=junk %}
{% response json %}
{ "foo": "bar" }
{% endresponse %}
{% response xml %}
<foo>bar</foo>
{% endresponse %}
{% endapiexample %}
```
The parameters for the `apiexample` block are: unique identifier, HTTP
method, the url (excluding .json or .xml extension), and the data
payload in querystring format.
<a name="js_and_css"></a>
## JS and CSS, etc
JavaScript and CSS are minified and combined. The files to be packaged and their orders are specified in `_includes/head.html` and <code>CssMinify.yml</code>. Preprocessing and options can be specified
via `_plugins/jekyll_asset_pipeline.rb`.
<a name="creating-a-pull-request"></a>
## Creating a Pull Request
1. [Fork](https://help.github.com/articles/fork-a-repo/) the project, clone your fork,
and configure the remotes:
```bash
# Clone your fork of the repo into the current directory
$ git clone https://github.com/sendgrid/docs
# Navigate to the newly cloned directory
$ cd docs
# Assign the original repo to a remote called "upstream"
$ git remote add upstream https://github.com/sendgrid/docs
```
2. If you cloned a while ago, get the latest changes from upstream:
```bash
$ git checkout <dev-branch>
$ git pull upstream <dev-branch>
```
3. Create a new topic branch (off the project development branch) to
contain your feature, change, or fix:
```bash
$ git checkout -b <topic-branch-name>
```
4. Commit your changes in logical chunks. Please adhere to these [git commit
message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
or your code is unlikely to be merged into the main project. Use Git's
[rebase](https://help.github.com/articles/about-git-rebase/)
feature to tidy up your commits before making them public.
4a. Create tests.
4b. Create or update the example code that demonstrates the functionality of this change to the code.
5. Locally merge (or rebase) the upstream development branch into your topic branch:
```bash
$ git pull [--rebase] upstream main
```
6. Push your topic branch up to your fork:
```bash
$ git push origin <topic-branch-name>
```
7. [Open a Pull Request](https://help.github.com/articles/about-pull-requests/)
with a clear title and description against the `develop` branch. All tests must be passing before we will review the PR.
If you have any additional questions, please feel free to [email](mailto:dx@sendgrid.com) us or create an issue in this repo.
================================================
FILE: .github/ISSUE_TEMPLATE
================================================
<!--
Please avoid submitting support questions here. You can contact our support team at https://support.sendgrid.com.
If you are able to login to https://support.sendgrid.com:
1. Click "Login & Contact Support."
2. Then, select "Contact Support" to see your contact options.
If you are unable to login to https://support.sendgrid.com:
1. Click "Trouble Logging in?"
2. Then, select "I am having a different login issue."
If you are reporting an issue with our docs, thanks for letting us know!
-->
## Expected content
## Actual content
**Link to page**:
================================================
FILE: .github/PULL_REQUEST_TEMPLATE
================================================
### Checklist
**Required**
- [x] I acknowledge that all my contributions will be made under the project's license.
### PR Details
**Description of the change**:
**Reason for the change**:
**Link to original source**:
<!--
If this pull request closes an issue, add the issue number here:
-->
Closes #
================================================
FILE: .gitignore
================================================
.vagrant/
.jekyll_indextank/
.rvmrc
_config.yml
_config.dev.yml
_config.deploy.yml
.bundle
.DS_Store
.sass-cache
.gist-cache
.idea
.pygments-cache
_deploy
sass.old
source.old
source/_stash
source/stylesheets/screen.css
vendor
node_modules
pdf
public
linklint_logs
bower_components
source/_assets/bower_components
source/.asset_pipeline
npm-debug.log
.cache
================================================
FILE: .nvmrc
================================================
12.*
================================================
FILE: .prettierrc
================================================
{
"semi": false,
"singleQuote": true,
"trailingComma": "es5"
}
================================================
FILE: .stylelintrc
================================================
{
"extends": "stylelint-config-standard",
"plugins": [
"stylelint-selector-bem-pattern"
],
"rules": {
"indentation": 2,
"at-rule-no-unknown": null,
"plugin/selector-bem-pattern": {
"componentName": "(([a-z0-9]+(?!-$)-?)+)",
"componentSelectors": {
"initial": "\\.{componentName}(((__|--)(([a-z0-9\\[\\]'=]+(?!-$)-?)+))+)?$"
},
"ignoreSelectors": [
".*\\.no-js.*",
".*\\.js-.*",
".*\\.lt-ie.*"
]
}
}
}
================================================
FILE: .travis.yml
================================================
sudo: required
dist: focal
language: node_js
branches:
only:
- main
- develop
node_js:
- 12.16.*
cache:
- pip
- npm
install:
- pip install --user awscli
before_script:
- npm ci
script: ./travis/build.sh
deploy:
- provider: script
script: ./travis/deploy.sh
skip_cleanup: true
on:
repo: sendgrid/docs
all_branches: true
condition: $TRAVIS_BRANCH = develop || $TRAVIS_BRANCH = main
- provider: script
script: ./travis/deploy_open_source.sh
skip_cleanup: true
on:
repo: sendgrid/docs
all_branches: true
condition: $TRAVIS_BRANCH = develop
after_deploy: ./travis/after_deploy.sh
================================================
FILE: .vscode/settings.json
================================================
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"eslint.enable": true,
"editor.tabSize": 2,
"editor.insertSpaces": true,
"eslint.options": {
"config": ".eslintrc.json",
"configFile": ".eslintrc.json"
}
}
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# SendGrid Community Code of Conduct
The SendGrid open source community is made up of members from around the globe with a diverse set of skills, personalities, and experiences. It is through these differences that our community experiences successes and continued growth. When you're working with members of the community, we encourage you to follow these guidelines, which help steer our interactions and strive to maintain a positive, successful, and growing community.
### Be Open
Members of the community are open to collaboration, whether it's on pull requests, code reviews, approvals, issues or otherwise. We're receptive to constructive comments and criticism, as the experiences and skill sets of all members contribute to the whole of our efforts. We're accepting of all who wish to take part in our activities, fostering an environment where anyone can participate, and everyone can make a difference.
### Be Considerate
Members of the community are considerate of their peers, which include other contributors and users of SendGrid. We're thoughtful when addressing the efforts of others, keeping in mind that often the labor was completed with the intent of the good of the community. We're attentive in our communications, whether in person or online, and we're tactful when approaching differing views.
### Be Respectful
Members of the community are respectful. We're respectful of others, their positions, their skills, their commitments and their efforts. We're respectful of the volunteer efforts that permeate the SendGrid community. We're respectful of the processes outlined in the community, and we work within them. When we disagree, we are courteous in raising our issues. Overall, we're good to each other. We contribute to this community not because we have to, but because we want to. If we remember that, these guidelines will come naturally.
## Additional Guidance
### Disclose Potential Conflicts of Interest
Community discussions often involve interested parties. We expect participants to be aware when they are conflicted due to employment or other projects they are involved in and disclose those interests to other project members. When in doubt, over-disclose. Perceived conflicts of interest are important to address so that the community’s decisions are credible even when unpopular, difficult or favorable to the interests of one group over another.
### Interpretation
This Code is not exhaustive or complete. It is not a rulebook; it serves to distill our common understanding of a collaborative, shared environment and goals. We expect it to be followed in spirit as much as in the letter. When in doubt, try to abide by [SendGrid’s cultural values](https://sendgrid.com/blog/employee-engagement-the-4h-way) defined by our “4H’s”: Happy, Hungry, Humble, and Honest.
### Enforcement
Most members of the SendGrid community always comply with this Code, not because of the existence of this Code, but because they have long experience participating in open source communities where the conduct described above is normal and expected. However, failure to observe this Code may be grounds for suspension, reporting the user for abuse or changing permissions for outside contributors.
## If you have concerns about someone’s conduct
**Initiate Direct Contact** - It is always appropriate to email a community member (if contact information is available), mention that you think their behavior was out of line, and (if necessary) point them to this Code.
**Discuss Publicly** - Discussing publicly is always acceptable. Note, though, that approaching the person directly may be better, as it tends to make them less defensive, and it respects the time of other community members, so you probably want to try direct contact first.
**Contact the Moderators** - You can reach the SendGrid moderators by emailing dx@sendgrid.com.
## Submission to SendGrid Repositories
Finally, just a reminder, changes to the SendGrid repositories will only be accepted upon completion of the [SendGrid Contributor Agreement](https://cla.sendgrid.com).
## Attribution
SendGrid thanks the following, on which it draws for content and inspiration:
* [Python Community Code of Conduct](https://www.python.org/psf/codeofconduct/)
* [Open Source Initiative General Code of Conduct](https://opensource.org/codeofconduct)
* [Apache Code of Conduct](https://www.apache.org/foundation/policies/conduct.html)
================================================
FILE: README.md
================================================

**THIS REPOSITORY WILL NO LONGER BE MONITORED AFTER JUNE 15, 2021**
# SendGrid Documentation
[](https://travis-ci.org/sendgrid/docs)
[](https://twitter.com/sendgrid)
[](./license)
## Introduction
This is a Gatsby site.
The develop branch is merged to production weekly (unless we need to do a release sooner than that).
The main branch is continuously deployed to production.
- **_Please_, feel free to make any contributions you feel will make SendGrid Documentation better.**
- **Familiarize yourself with our [Styleguide](styleguide.md)**
- **Submit all pull requests to the develop branch**
- **All third party contributors acknowledge that any contributions they provide will be made under the same open source license that the open source project is provided under.**
- **When making contributions, be sure to place an "x" in the brackets of the PR description where it says "[ ] I acknowledge that all my contributions will be made under the project's license."**
## Table of Contents
- [Local Dependency Setup](#local-dependency-setup)
- [Mac](#mac)
- [Windows](#windows)
- [Linux](#linux)
- [Local Repository Setup](#local-repository-setup)
- [About](#about)
- [License](#license)
## Local Dependency Setup
### Dependencies
- Required:
- [Git](https://git-scm.com)
- [npm](https://www.npmjs.com)
- [Gatsby](https://www.gatsbyjs.org)
**Note:** Dependencies differ for work on the `old-develop` branch. If you need to work on `old-develop`, please see the README file after checking out that branch. This is uncommon.
## Setup Steps
#### Mac
- Install Git
- [Git for Mac](https://git-scm.com/download/mac)
We recommend using [Homebrew](https://brew.sh/) to install and manage packages on a MacOS.
- Install Homebrew:
```shell
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
- Install npm:
```shell
$ brew install npm
```
- Set your Node.js version to 12
```shell
$ npm install -g n
$ n 12.16.1
```
#### Windows
- Install Git
- [Git for Windows](https://git-scm.com/download/win)
- Install npm
- To install Node.js and npm on Windows, you can download the installer here:
- https://nodejs.org/en/#home-downloadhead
- Use Node.js version 12, the current Long Term Support (LTS) version.
#### Linux
- Install Git:
- [Git for Linux](https://git-scm.com/download/linux)
- Install npm:
- To install Node.js and npm on Linux, select the package and instillation appropriate for your Linux distribution. You can find help here:
- https://nodejs.org/en/download/package-manager/
- Use Node.js version 12, the current Long Term Support (LTS) version.
## Local Repository Setup
**Note:** When working on Windows, you may need to run Command Prompt or PowerShell as an Administrator.
**Note:** When working on Mac or Linux, you may need to run some commands using "sudo."
- Clone the SendGrid Docs Repo
- SSH:
```shell
$ git clone git@github.com:sendgrid/docs.git
```
- HTTPS:
```shell
$ git clone https://github.com/sendgrid/docs.git
```
- Go to your docs directory
```shell
$ cd docs
```
- Switch to develop branch to make changes
```shell
$ git checkout develop
```
- Install the Gatsby CLI
```shell
$ npm install -g gatsby-cli
```
- Install npm package dependencies
```shell
$ npm ci
```
- Build the local site
- With the Gatsby CLI installed globally, you can run:
```shell
$ gatsby develop
```
- Alternatively, you can run:
```shell
$ npm run develop
```
- Either of the above commands should start a hot-reloading development environment accessible at [localhost:8000](localhost:8000)
## About
SendGrid is guided and supported by the SendGrid [Developer Experience Team](mailto:dx@sendgrid.com).
It is maintained and funded by SendGrid, Inc. The names and logos are trademarks of SendGrid, Inc.
## License
SendGrid Documentation is licensed under the **[MIT License (MIT)](https://github.com/sendgrid/docs/blob/develop/license)**
================================================
FILE: content/docs/examples.md
================================================
---
title: Markdown Examples
slug: markdown-examples
navigation:
show: true
---
## Callout Link
```html
<call-out-link linktext="Go To Course" img="/img/search-darth-vader.gif" link="https://rise.articulate.com/share/uGIBV4dMNFn-HzrIMDW_s2Kh4dxMH0vr#/">
### I'm a course call out title
Montes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.
</call-out-link>
```
<call-out-link linktext="Go To Course" img="/img/search-darth-vader.gif" link="https://rise.articulate.com/share/uGIBV4dMNFn-HzrIMDW_s2Kh4dxMH0vr#/">
### I'm a course call out title
Montes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.
</call-out-link>
## Callouts
### Callout Info
```html
<call-out>
Montes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.
</call-out>
```
<call-out>
Montes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.
</call-out>
### Callout Warning
```html
<call-out type="warning">
Montes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.
</call-out>
```
<call-out type="warning">
Montes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.
</call-out>
### Callout Beta
```html
<call-out type="beta">
Montes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.
</call-out>
```
<call-out type="beta">
Montes sociis turpis egestas fermentum tempus lectus cubilia vulputate justo, placerat suscipit mollis nostra mauris at sed adipiscing, enim pharetra laoreet ridiculus litora nunc.
</call-out>
## Code Group
````html
<code-group langs="Html, JavaScript, Go">
```html
<div class="yay-html">Yay HTML</div>
```
```javascript
consol.log('Yay, JavaScript!')
```
```go
print('Yay, Go!');
```
</code-group>
````
<code-group langs="Html, JavaScript, Go">
```html
<div class="yay-html">Yay HTML</div>
```
```javascript
consol.log('Yay, JavaScript!')
```
```go
print('Yay, Go!');
```
</code-group>
================================================
FILE: content/docs/for-developers/parsing-email/inbound-email.md
================================================
---
layout: page
weight: 0
title: Inbound Email Parse Webhook
group: inbound-parse
navigation:
show: true
---
SendGrid can parse the attachments and contents of incoming emails. Application examples include receiving uploads and posting blog articles via email.
The Parse API will POST the parsed email to a URL that you specify. If a POST is unsuccessful, SendGrid automatically queues and retries any POSTs that respond with a 5XX status. This prevents data loss for customers who have misconfigured their website or POST URL.
<call-out>
Respond with a 2xx status to the POST request to stop the email from retrying.
</call-out>
To avoid returning an error your link must return a 2xx HTTP code when the email is received. This response lets our system know that your link has received the email. It is then removed from our send queue. If we do **not** get a valid 2xx HTTP response, our servers will believe they have failed to deliver your message. Messages that cannot be delivered after 3 days will be dropped.
## Setup
The following steps are required to begin parsing email:
- Point the MX Record of a Domain/Hostname or Subdomain to **mx.sendgrid.net**
- Associate the Domain/Hostname and the URL in the [Parse API settings page](https://sendgrid.com/developer/reply/).
<call-out type="warning">
The Inbound Parse Webhook will not follow redirects. Please make sure to use the correct URL, or posting will fail.
</call-out>
You must ensure that the subdomain-domain combination for your receiving domain is unique.
<call-out type="warning">
Only authenticated domains may be used when configuring Inbound Parse!
</call-out>
See [Setting Up The Inbound Parse Webhook]({{root_url}}/for-developers/parsing-email/setting-up-the-inbound-parse-webhook/) for step-by-step instructions.
<call-out>
The total message size limit, including the message itself and any number of attachments, is 20MB. Be aware that other mail handlers will have their own limitations, and some ISPs and companies may either dramatically limit the size and/or type of attachments, or even block them altogether.
</call-out>
## Character Sets and Header Decoding
If you receive an email which is not in ASCII only format, you will want to read this section.
Messages and their headers can have character set data associated with them. In order to simplify the parsing of messages for the end user, SendGrid will decode the to, from, cc, and subject headers if needed. All headers will be converted to UTF-8 for uniformity since technically a header can be in many different character sets.
The charsets variable will contain a JSON encoded hash of the header / field name and its respective character set. For instance, it may look like:
```ruby
[charsets] => {"to":"UTF-8","cc":"UTF-8","subject":"UTF-8","from":"UTF-8","text":"iso-8859-1"}
```
This shows that all headers should be treated as UTF-8, and the text body is latin1.
================================================
FILE: content/docs/for-developers/parsing-email/setting-up-the-inbound-parse-webhook.md
================================================
---
seo:
title: Setting Up The Inbound Parse Webhook
description: How to set up the Inbound Parse Webhook to process and parse incoming email
keywords: Inbound Parse, Inbound Parse Webhook, Email Processing
title: Setting Up The Inbound Parse Webhook
group: inbound-parse
weight: 90
layout: page
navigation:
show: true
---
As you’re probably aware, SendGrid is great at sending your email, but SendGrid can also help you process email using the Inbound Parse Webhook. The Inbound Parse Webhook processes all incoming email for a domain or subdomain, parses the contents and attachments then POSTs multipart/form-data to a URL that you choose.
<call-out>
XML is only available in v2.
</call-out>
What your application does with this parsed data is up to you. For some ideas of what the Inbound Parse Webhook can do, check out this [blog post](https://sendgrid.com/blog/parse-api-oh-what-you-can-do/).
<call-out>
Check out some pre-made integrations for the SendGrid Inbound Parse Webhook in the [Library Index]({{root_url}}/for-developers/sending-email/libraries/#web-api-libraries).
</call-out>
## Setup
To begin processing email using SendGrid's Inbound Parse Webhook, you will have to setup MX Records, choose the hostname (or receiving domain) that will be receiving the emails you want to parse, and define the URL where you want to POST your parsed emails.
### Setting up an MX Record
1. Navigate to the MX Records page on your hosting provider’s website. If you’re unsure who your hosting or DNS provider is, please contact your website administrator.
2. Create a new MX record for the subdomain (e.g. parse.yourdomain.com) you want to process incoming email.
<call-out>
This hostname should be used exclusively to parse your incoming email.
</call-out>
<call-out type="warning">
Do not change the MX record for your domain. If you do, you will no longer receive email.
</call-out>
3. Assign the MX record a priority of 10, and point it to the address: `mx.sendgrid.net.`
It should look something like this:

<call-out>
If there is no field for priority, type 10 before the address. e.g. `10 mx.sendgrid.net.`
</call-out>
### Pointing to a Hostname and URL
1. From your SendGrid Dashboard click **Settings**, and then click **Inbound Parse**.
You are now on the Inbound Parse page.
2. Click **Add Host & URL**.
Here you will specify the subdomain and root domain of the receiving domain (or hostname). All emails sent to this receiving domain will be parsed.
If you use the same return path (subdomain) as your authenticated domain, you must have Automatic Security disabled on the authenticated domain. Otherwise, those messages will bounce due to an infinite CNAME>MX loop.
<call-out>
The URL must be accessible from the public web.
</call-out>
3. Enter the subdomain (for example, "parse") and select the authenticated root domain for your receiving domain. Enter the public URL where you would like the parsed data to be POSTed.

4. (Optional) Check **Spam Check** if you want Inbound Parse to check incoming email for spam. Checking this box will also include the spam report and spam score in the payload.
5. (Optional) Check **Send Raw** if you would prefer to receive the full MIME message URL encoded in multipart/form-data.
<call-out type="warning">
If you do not check **Send Raw**, the post will be multipart/form-data with the email content URL encoded, but the attachments will be in multipart/form-data. If your code is only set up to read URL encoding, attachments could be dropped.
</call-out>
6. Click Save.
You have just finished configuring Inbound Parse!
## Testing
To test if everything is working, send an email from your email account to example@example.com.
<call-out>
The local-part (i.e. anything before @) can be any word or combination because all email for the domain or subdomain will be processed.
</call-out>
<call-out type="warning">
Remember to direct your incoming email to your hostname (for example, example@example.com). If you do not, your incoming email will not be parsed.
</call-out>
## Default Parameters
<table class="table">
<colgroup>
<col class="table-col-200">
<col>
</colgroup>
<tbody>
<tr>
<th>headers</th>
<td>The raw headers of the email.</td>
</tr>
<tr>
<th>dkim</th>
<td>A string containing the verification results of any DKIM and domain keys signatures in the message.</td>
</tr>
<tr>
<th>content-ids</th>
<td>A string containing the number of attachments. </td>
</tr>
<tr>
<th>to</th>
<td>Email recipient field, as taken from the message headers.</td>
</tr>
<tr>
<th>Text</th>
<td>Email body in plaintext formatting.</td>
</tr>
<tr>
<th>html</th>
<td>HTML body of email. If not set, email did not have an HTML body.</td>
</tr>
<tr>
<th>from</th>
<td>Email sender, as taken from the message headers.</td>
</tr>
<tr>
<th>sender_ip</th>
<td>A string of the sender’s ip address.</td>
</tr>
<tr>
<th>spam_report</th>
<td>Spam Assassin’s spam report.</td>
</tr>
<tr>
<th>envelope</th>
<td>A string containing the SMTP envelope. This will have 2 variables: <code>to</code>, which is a single-element array containing the address that we received the email to, and <code>from</code>, which is the return path for the message.</td>
</tr>
<tr>
<th>attachments</th>
<td>Number of attachments included in email.</td>
</tr>
<tr>
<th>subject</th>
<td>Email Subject.</td>
</tr>
<tr>
<th>spam_score</th>
<td>Spam Assassin’s rating for whether or not this is spam.</td>
</tr>
<tr>
<th>attachment-info</th>
<td>A JSON map where the keys are named attachment{X}. Each attachment key points to a JSON object containing three fields, <code>filename</code>, <code>type</code>, and <code>content-id</code>. The <code>filename</code> field is the name of the file (if it was provided). The <code>type</code> field is the <a href="http://en.wikipedia.org/wiki/Internet_media_type">media type</a> of the file. <code>X</<code> is the total number of attachments. For example, if the number of attachments is 0, there will be no attachment files. If the number of attachments is 3, parameters attachment1, attachment2, and attachment3 will have file uploads. </td>
</tr>
<tr>
<th>charsets</th>
<td>A string containing the character sets of the fields extracted from the message.</td>
</tr>
<tr>
<th>SPF</th>
<td>The results of the Sender Policy Framework verification of the message sender and receiving IP address.</td>
</tr>
</tbody>
</table>
## Example Default Payload
```
[Date] array(16) {
["headers"]=>
string(1970) "Received: by mx0047p1mdw1.sendgrid.net with SMTP id 6WCVv7KAWn Wed, 27 Jul 2016 20:53:06 +0000 (UTC)
Received: from mail-io0-f169.google.com (mail-io0-f169.google.com [209.85.223.169]) by mx0047p1mdw1.sendgrid.net (Postfix) with ESMTPS id AA9FFA817F2 for <example@example.comom>; Wed, 27 Jul 2016 20:53:06 +0000 (UTC)
Received: by mail-io0-f169.google.com with SMTP id b62so81593819iod.3 for <example@example.comom>; Wed, 27 Jul 2016 13:53:06 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sendgrid.com; s=ga1; h=mime-version:from:date:message-id:subject:to; bh=DpB1CYYeumytcPF3q0Upvx3Sq/oF4ZblEwnuVzFwqGI=; b=GH5YTxjt6r4HoTa+94w6ZGQszFQSgegF+Jlv69YV76OLycJI4Gxdwfh6Wlqfez5yID 5dsWuqaVJZQyMq/Dy/c2gHSqVo60BKG56YrynYeSrMPy8abE/6/muPilYxDoPoEyIr/c UXH5rhOKjmJ7nICKu1o99Tfl0cXyCskE7ERW0=
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=DpB1CYYeumytcPF3q0Upvx3Sq/oF4ZblEwnuVzFwqGI=; b=Sq6LVHbmywBdt3sTBn19U8VOmelfoJltz8IcnvcETZsYwk96RBxN+RKMN5fOZSKw4j 15HrgdIFfyDmp67YK0ygvOITlTvZ6XY5I0PtnvDtAQt79kS3tKjI3QKJoEp/ZjIjSzlL KG7agl6cxFgBbIN0yHWBOvy3O+ZXY8tZdom1yOvULjmjW1U9JkdOs+aJ6zq4qhZX/RM/ tIgLB461eJ5V95iQDDc5Ibj9Cvy4vJfXLQRO0nLVQAT2Yz58tkEO1bDZpWOPAyUNneIL yhIWp+SpbuqhMA68mq0krG1PjmWalUbpVcGJIGuOKB9mQFFo/MqdrUCjvYnyo1jPLPeX psdQ==
X-Gm-Message-State: AEkoousvdxmDoxLlTUYJ1AOmCGJv77xRBBlfKv6YrthH0M2NueMwlOxUD6t8nidE9uonXbdJ/DQy/chmHUnN//a4
X-Received: by 10.107.6.101 with SMTP id 98mr38024553iog.41.1469652785829; Wed, 27 Jul 2016 13:53:05 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.107.48.17 with HTTP; Wed, 27 Jul 2016 13:53:05 -0700 (PDT)
From: Sender Name <example@example.com>
Date: Wed, 27 Jul 2016 14:53:05 -0600
Message-ID: <CAN_P_JMvV7ZpAQhOnDienypLrJmuhN=LQWweu4yScw4jQyXY2w@mail.gmail.com>
Subject: Different File Types
To: example@example.comom
Content-Type: multipart/mixed; boundary=001a113f8ad03e85160538a4343c
"
["dkim"]=>
string(22) "{@sendgrid.com : pass}"
["content-ids"]=>
string(37) "{"ii_1562e2169c132d83":"attachment1"}"
["to"]=>
string(26) "example@example.comom"
["html"]=>
string(479) "<div dir="ltr">Here's an email with multiple attachments<div><br></div><div><img src="cid:ii_1562e2169c132d83" alt="Inline image 1" width="455" height="544"><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><img src="https://sendgrid.com/brand/sg-logo-email.png" width="96" height="17"><br><div><br></div></div></div>
</div></div>
"
["from"]=>
string(33) "Sender Name example@example.com"
["text"]=>
string(139) "Here's an email with multiple attachments
"
["sender_ip"]=>
string(14) "209.85.223.169"
["spam_report"]=>
string(844) "Spam detection software, running on the system "mx0047p1mdw1.sendgrid.net", has
identified this incoming email as possible spam. The original message
has been attached to this so you can view it (if it isn't spam) or label
similar future email. If you have any questions, see
@@CONTACT_ADDRESS@@ for details.
Content preview: Here's an email with multiple attachments [image: Inline image
1] -- [...]
Content analysis details: (2.6 points, 5.0 required)
pts rule name description
---- ---------------------- --------------------------------------------------
0.8 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area
0.0 HTML_MESSAGE BODY: HTML included in message
1.8 HTML_IMAGE_ONLY_08 BODY: HTML: images with 400-800 bytes of words
0.0 T_MIME_NO_TEXT No text body parts
"
["envelope"]=>
string(66) "{"to":["example@example.comom"],"from":"example@example.com"}"
["attachments"]=>
string(1) "2"
["subject"]=>
string(20) "Different File Types"
["spam_score"]=>
string(5) "2.597"
["attachment-info"]=>
string(287) "{"attachment2":{"filename":"DockMcWordface.docx","name":"DockMcWordface.docx","type":"application/vnd.openxmlformats-officedocument.wordprocessingml.document"},"attachment1":{"filename":"MG_2359.jpg","name":"_MG_2359.jpg","type":"image/jpeg","content-id":"ii_1562e2169c132d83"}}"
["charsets"]=>
string(77) "{"to":"UTF-8","html":"UTF-8","subject":"UTF-8","from":"UTF-8","text":"UTF-8"}"
["SPF"]=>
string(4) "pass"
}
```
## Raw Parameters
<table class="table table-bordered table-striped">
<colgroup>
<col class="table-col-200">
</colgroup>
<tbody>
<tr>
<th>dkim</th>
<td>A string containing the verification results of any DKIM and domain keys signatures in the message.</td>
</tr>
<tr>
<th>Email</th>
<td>A string containing the email headers, date, body, and attachments</td>
</tr>
<tr>
<th>To</th>
<td>Email recipient field as taken from the message headers.</td>
</tr>
<tr>
<th>cc</th>
<td>Email cc field, as taken from the message headers.</td>
</tr>
<tr>
<th>From</th>
<td>Email sender, as taken from the message headers.</td>
</tr>
<tr>
<th>Text</th>
<td>Email body in plaintext formatting.</td>
</tr>
<tr>
<th>html</th>
<td>HTML body of email. If not set, email did not have an HTML body.</td>
</tr>
<tr>
<tr>
<th>Sender IP</th>
<td>Email sender IP address.</td>
</tr>
<tr>
<th>Spam Report</th>
<td>Spam Assassin’s spam report.</td>
</tr>
<tr>
<th>Envelope</th>
<td>A string containing the SMTP envelope. This will have 2 variables: <code>to</code>, which is an single-element array containing the addresses that received the email, and <code>from</code>, which is the return path for the message.</td>
</tr>
<tr>
<th>Subject</th>
<td>Email subject.</td>
</tr>
<tr>
<th>Spam_Score</th>
<td>Spam Assassin’s rating for whether or not this is spam.</td>
</tr>
<tr>
<th>Charsets</th>
<td>A string containing the character sets of the fields extracted from the message.</td>
</tr>
<tr>
<th>SPF</th>
<td>The results of the Sender Policy Framework verification of the message sender and receiving IP address.</td>
</tr>
</tbody>
</table>
<call-out>
We recommend limiting the total size of your message, including the message itself and all attachments, to 30MB. Be aware that other mail handlers will have their own limitations, and some ISPs and companies may either dramatically limit the size and/or type of attachments, or even block them altogether.
</call-out>
## Example Raw Payload
```
array(11) {
["dkim"]=>
string(22) "{@sendgrid.com : pass}"
["email"]=>
string(8879) "Received: by mx0032p1mdw1.sendgrid.net with SMTP id rOkt2xLLKV Tue, 19 Jul 2016 15:06:29 +0000 (UTC)
Received: from mail-it0-f45.google.com (mail-it0-f45.google.com [209.85.214.45]) by mx0032p1mdw1.sendgrid.net (Postfix) with ESMTPS id 26D6080397 for <parse@parse.yourdomain>; Tue, 19 Jul 2016 15:06:22 +0000 (UTC)
Received: by mail-it0-f45.google.com with SMTP id f6so93587860ith.1 for <example@example.comom>; Tue, 19 Jul 2016 08:06:22 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sendgrid.com; s=ga1; h=mime-version:from:date:message-id:subject:to; bh=UYWCIUKTVXyV9U41l+c9+qOlpoeQGcJkKpyOAatNr3Y=; b=c1I/LcqHEJklmAThWr9Z8NKlTPHUlE/8sDSpK382fJtIQcGdUtczG0pijnUHegrFVt FDr4NehtJDD9KFvXLXboLCtObsu5HTN99ckUCCZTibZseA+J8U3jjCqTdj1fmUage5C7 //Iwi0Ndioonzhm18J7KStap66yZ69ED7UxPk=
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=UYWCIUKTVXyV9U41l+c9+qOlpoeQGcJkKpyOAatNr3Y=; b=lgmLXnmmpNcQMckjshsZsa2/8OjFZzntWYSG5XZo0fi32KHLuBLSHuNDFXn0V4ICp1 1xuT2fZCyhBSgNBiWNbjqFspdemzrBjaI1Tgm/Zz8Fv6wW2XdjpoANNQzJxfdhnecPd5 HvZ5P8+KTqjr4tAa9RmLthDc3UqhV9NRnCnhbW/AZaVQLB8eoJus92tD1GeXpBQml5XF m6vPUGrWGZWNugINkRKxIpk+2uECglAjNm4NpZIi9j7N94CxA18RC4NJ59WIsSybtIer hbCgT1Q13rvGEzvnp6FfFQVbE3DOibNqd0bh/EvZCagFVbnenNc/Q+qHtU9KqFlisSOp xh0w==
X-Gm-Message-State: ALyK8tINVaZIP8YCgQbpg5ya8EnqQo76uxkXUPpDnM+kAyAQQzehFU10EgyuAe2fAmWf/muBiFDy0JDU74Eclp1/
X-Received: by 10.36.76.16 with SMTP id a16mr4479786itb.77.1468940781988; Tue, 19 Jul 2016 08:06:21 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.107.48.17 with HTTP; Tue, 19 Jul 2016 08:06:21 -0700 (PDT)
From: Sender Name <example@example.com>
Date: Tue, 19 Jul 2016 09:06:21 -0600
Message-ID: <CAN_P_JNa25--hzm5=-ES9cnxgWa+h+E49OOAS7sPpV0gsoXCOw@mail.gmail.com>
Subject: Hello
To: example@example.comom
Content-Type: multipart/mixed; boundary=001a11447dc881e40f0537fe6d5a
--001a11447dc881e40f0537fe6d5a
Content-Type: multipart/alternative; boundary=001a11447dc881e40b0537fe6d58
--001a11447dc881e40b0537fe6d58
Content-Type: text/plain; charset=UTF-8
This is a test email with 1 attachment.
--001a11447dc881e40b0537fe6d58
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">This is a test email with 1 attachment.<br clear=3D"all"><=
div><br></div>-- <br><div class=3D"gmail_signature" data-smartmail=3D"gmail=
_signature"><div dir=3D"ltr"><img src=3D"https://sendgrid.com/brand/sg-logo=
-email.png" width=3D"96" height=3D"17"><br><div><br></div></div></div>
</div>
--001a11447dc881e40b0537fe6d58--
--001a11447dc881e40f0537fe6d5a
Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document;
name="DockMcWordface.docx"
Content-Disposition: attachment; filename="DockMcWordface.docx"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_iqtleujy0
UEsDBBQACAgIAHc+80gAAAAAAAAAAAAAAAASAAAAd29yZC9udW1iZXJpbmcu
eG1spZJBboMwEEVP0Dsg7xNIF1WFQrNo1G66a3uAiTFgxfZYYwPN7euEAC2V
KkpXCMb//e/hb3cfWkWNICfRZGyzTlgkDMdcmjJj729Pq3sWOQ8mB4VGZOwk
HNs93Gzb1NT6ICiciwLCuFTzjFXe2zSOHa+EBrdGK0wYFkgafHilMtZAx9qu
OGoLXh6kkv4U3ybJHbtiMGM1mfSKWGnJCR0W/ixJsSgkF9dHr6A5vp1kj7zW
wviLY0xChQxoXCWt62l6KS0Mqx7S/HaJRqv+XGvnuOUEbdizVp1Ri5RbQi6c
C1/33XAgbpIZCzwjBsWcCN89+yQapBkw53ZMQIP3Onhfl3ZBjRcZd+HUnCDd
6EUeCOj0MwUs2OdXvZWzWjwhBJWvaSjkEgSvgHwPUEsICvlR5I9gGhjKnJez
6jwh5RJKAj2W1P3pz26SSV1eK7BipJX/oz0T1pbFD59QSwcIJ5yx3VgBAAC7
BAAAUEsDBBQACAgIAHc+80gAAAAAAAAAAAAAAAARAAAAd29yZC9zZXR0aW5n
cy54bWyllMFuozAQhp9g3wH5nkCqardCJZXaqnvZPaV9gIltwIrtscYGNm+/
JgTYZqWKpieMx/P94/GvuX/4Y3TSSvIKbcE264wl0nIUylYFe3t9Wd2xxAew
AjRaWbCj9Oxh++2+y70MIZ7ySSRYnxtesDoEl6ep57U04NfopI3BEslAiL9U
pQbo0LgVR+MgqL3SKhzTmyz7zs4YLFhDNj8jVkZxQo9l6FNyLEvF5fkzZtAS
3SHlGXljpA0nxZSkjjWg9bVyfqSZa2kxWI+Q9qNLtEaP5zq3RE0QdLHRRg9C
HZJwhFx6H3efh+BE3GQLGtgjpowlJbzXHCsxoOyE6c1xAZq011H73LQTar7I
3AuvlxQyhH6pPQEd/68Crujnv/lOLXLxBSFmhYYmQ16D4DVQGAH6GoJGfpDi
CWwLk5lFtcjOFyShoCIws0n9p152k13YZVeDkzOt+hrtJ2Hj2DYOIKG803B8
BH6o4qYVJ6Gky1uIXtqw9HRIltDo8Ar7XUA3Bn/cZEN4GETzajcMtQlyy+LS
gonmfjezfqOQfaghtfw6vWQ6a6bzDN3+BVBLBwiI6qJIqQEAAIgFAABQSwME
FAAICAgAdz7zSAAAAAAAAAAAAAAAABIAAAB3b3JkL2ZvbnRUYWJsZS54bWyl
lE1OwzAQhU/AHSLv26QsEIqaVogKNuyAA0wdJ7Fqe6yxk9Db4zZ/UCQUysqK
J+974/GT19sPraJGkJNoMrZaJiwShmMuTZmx97enxT2LnAeTg0IjMnYUjm03
N+s2LdB4FwW5canmGau8t2kcO14JDW6JVphQLJA0+PBJZayBDrVdcNQWvNxL
Jf0xvk2SO9ZjMGM1mbRHLLTkhA4Lf5KkWBSSi34ZFDTHt5PskNdaGH92jEmo
0AMaV0nrBpq+lhaK1QBpfjtEo9XwX2vnuOUEbbgLrTqjFim3hFw4F3Z3XXEk
rpIZAzwhRsWcFr57Dp1okGbEnJJxARq9l8G7H9oZNR1kmoVTcxrpSi9yT0DH
n13AFfP8qrdyVoovCEHlaxoDeQ2CV0B+AKhrCAr5QeSPYBoYw5yXs+J8Qcol
lAR6Cqn7082ukou4vFZgxUQr/0d7Jqwt2/SvT9SmBnSI3gNJUCzerOP+Wdp8
AlBLBwhpMWDsagEAANgEAABQSwMEFAAICAgAdz7zSAAAAAAAAAAAAAAAAA8A
AAB3b3JkL3N0eWxlcy54bWzdV+1u2jAUfYK9A8r/NiEEhlBphai6Taq6ae0e
wDgO8XBsy3ag7OlnJ04CCZkyoKMa/Eh8r++518fHH7m5e01Ib42ExIxOnf61
5/QQhSzEdDl1frw8XI2dnlSAhoAwiqbOFknn7vbDzWYi1ZYg2dPxVE4SOHVi
pfjEdSWMUQLkNeOIamfERAKUboqlmwCxSvkVZAkHCi8wwWrr+p43ciwMmzqp
oBMLcZVgKJhkkTIhExZFGCL7KCJEl7x5yD2DaYKoyjK6AhFdA6MyxlwWaMmx
aNoZFyDrPw1inZCi34Z3yRYKsNGTkZA80YaJkAsGkZTaep87S8S+14FAA1FG
dClhP2dRSQIwLWGMNGpAZe5rnduSlkFVA6m4kKRLIbnrES8EENtmFeAIPnfj
Oe6k4hqCjlKpKAV5DASMgVAFADkGgTC4QuEc0DUoxRwuO8m5hhRisBQgqUQq
/2pm+15NLs8x4KhCW56G9kmwlDu3evsJGbxHEUiJkqYpvgnbtK3s8cCokr3N
BEiI8dSZCQy05DYTKHcaCEg1kxjsmOIZlWV/10AttHUNtEq9vI1rbZkAQuaA
y7pdCbxCNSNkhInSlv1s71+F1fcLy1zWbWlhoHpLzk16B1czgpe0cC2ARATn
btcS4tZp4vWWeawQ4k/oVdVqNuZHDVgf4AaHbDPXPAtGClff1s4B1HNm+I8U
EiZEvy+QVh+yDVOiHtjHUdH4nhJtAKlilmcaGg+KlI0QeBkX7xEWUj1mELaa
n7CowYTYwXM7+N3hug0FZeeZjlZbrvE4EGYd8NjkyVxfwqnzZNZNppAwjzRj
NcEUJKialaxTnjsLbcIrsCBoD/rFWDrhZz17Tx2yHB7EZwTM8d4EjnNHz06f
kVD4tVRUlVBH7ehj194ioX6LhNp00vf3lBJ4Xps8oBaeTpQC8lyCVNBuWZHd
EKr1FXjN9ZXbdlbLMbT6rbT674zWwehctNY3x4rmwYFtLLedSPOglebBpWke
77PsvxXLe6dIMDD/xikyPnCKjM9Af9BKf/C+6PfH56J/j+5R9mvQHRygOzgD
3cNWuofvjO7gX9Ldekc6ke5RK92j/5VuXEt8EfpfsNK3osZ9J7NemPfR4bvr
2e4jwwNkDk8i8zldqIN8lo4LUzrw34TTM3701T/yOiyKwYF75aDlXlm8ydvf
UEsHCCJgqpxzAwAAhxMAAFBLAwQUAAgICAB3PvNIAAAAAAAAAAAAAAAAEQAA
AHdvcmQvZG9jdW1lbnQueG1spZXfbtsgFMafYO8QcZ/YibKpsur0YlF3s01R
2z0AAWyjAAcdcNLs6Qf+2yVV5WW+QZzD+X2f4QjuH161mh0FOgkmJ8tFSmbC
MODSlDn59fI4vyMz56nhVIEROTkLRx42n+5PGQdWa2H8LBCMyzTLSeW9zZLE
sUpo6hZghQnJAlBTH6ZYJpriobZzBtpSL/dSSX9OVmn6hXQYyEmNJusQcy0Z
goPCx5IMikIy0Q19BU7RbUu2neVGMUGhggcwrpLW9TR9Ky0kqx5y/Ognjlr1
6052ihpHegrHoVUrdALkFoEJ50J02yYH4jKdsIERMVRMsfC3Zu9EU2kGTGyO
C9CgvQja3aY1qPFHxr1waoqRNvVd7pHi+doFvWE/39ZbOamLLwihytc4NOQt
CFZR9D1A3UJQwA6Cf6XmSIdm5uWkdr4gcUlLpHpsUvdPJ7tML9rluaJWjLTy
/2jfEGpLNuEC2lN2KMPM8NkpY6Ag3ASPzUeSJg/8HEcb0uF+4085SbuPdKGt
UNfB3XXoaSsKWiv/TmaHb4KN3A7jwMB48eprqp4tZcF4KDjSKBfdJcM6/MjK
O5avBbEDeXUp0WTi2ArGVU4w36635fPvUFCFW//z3brhh7tguVqt03b/bPmD
Rnd78B5CIy3X7SoPdpwoUfhxhrKs+mnH+Fnrl7MVIRmeEYzJzlzvJOlPKhnf
lM0fUEsHCOH0LWYNAgAAmAYAAFBLAwQUAAgICAB3PvNIAAAAAAAAAAAAAAAA
HAAAAHdvcmQvX3JlbHMvZG9jdW1lbnQueG1sLnJlbHOtkktqAzEMhk/QOxjt
O54kpZQSTzYlkG2ZHsCZ0TyILRtLKZ3b1xTyghC6mKV+o0+fkNebH+/UNyYe
AxlYFCUopCa0I/UGvurt8xsoFkutdYHQwIQMm+pp/YnOSu7hYYysMoTYwCAS
37XmZkBvuQgRKb90IXkruUy9jrY52B71sixfdbpmQHXDVLvWQNq1C1D1FPE/
7NB1Y4MfoTl6JLkzQjOK5MU4M23qUQyckiKzQN9XWM6p0AWS2u4dXhzO0SOJ
1ZwSdPR7THnvi8Q5eiTxMusxZHJ4fYq/+jRe33yw6hdQSwcIY4WdHeEAAACo
AgAAUEsDBBQACAgIAHc+80gAAAAAAAAAAAAAAAALAAAAX3JlbHMvLnJlbHON
zzsOwjAMBuATcIfIO03LgBBq0gUhdUXlAFHiphHNQ0l49PZkYADEwGj792e5
7R52JjeMyXjHoKlqIOikV8ZpBufhuN4BSVk4JWbvkMGCCTq+ak84i1x20mRC
IgVxicGUc9hTmuSEVqTKB3RlMvpoRS5l1DQIeREa6aautzS+G8A/TNIrBrFX
DZBhCfiP7cfRSDx4ebXo8o8TX4kii6gxM7j7qKh6tavCAuUt/XiRPwFQSwcI
LWjPIrEAAAAqAQAAUEsDBBQACAgIAHc+80gAAAAAAAAAAAAAAAATAAAAW0Nv
bnRlbnRfVHlwZXNdLnhtbLWTTU7DMBCFT8AdIm9R4sICIdS0C36WwKIcYOpM
Wgv/yTMp7e2ZtCGLqkiwyM7jN/Pe55E8X+69K3aYycZQq5tqpgoMJjY2bGr1
sXop71VBDKEBFwPW6oCklour+eqQkAoZDlSrLXN60JrMFj1QFRMGUdqYPbCU
eaMTmE/YoL6dze60iYExcMm9h1rMn7CFznHxeLrvrWsFKTlrgIVLi5kqnvci
njD7Wv9hbheaM5hyAKkyumMPbW2i6/MAUalPeJPNZNvgvyJi21qDTTSdl5Hq
K+Ym5WiQSJbqXUXILKch9R0yv4IXW9136h+1Gh45DQIfHP4GcNQmjW/FawVr
h5cJRnlSiND5NWY5X4YY5UkhRsWDDZdBxpaBQx+/3uIbUEsHCAD+7s4fAQAA
ugMAAFBLAQIUABQACAgIAHc+80gnnLHdWAEAALsEAAASAAAAAAAAAAAAAAAA
AAAAAAB3b3JkL251bWJlcmluZy54bWxQSwECFAAUAAgICAB3PvNIiOqiSKkB
AACIBQAAEQAAAAAAAAAAAAAAAACYAQAAd29yZC9zZXR0aW5ncy54bWxQSwEC
FAAUAAgICAB3PvNIaTFg7GoBAADYBAAAEgAAAAAAAAAAAAAAAACAAwAAd29y
ZC9mb250VGFibGUueG1sUEsBAhQAFAAICAgAdz7zSCJgqpxzAwAAhxMAAA8A
AAAAAAAAAAAAAAAAKgUAAHdvcmQvc3R5bGVzLnhtbFBLAQIUABQACAgIAHc+
80jh9C1mDQIAAJgGAAARAAAAAAAAAAAAAAAAANoIAAB3b3JkL2RvY3VtZW50
LnhtbFBLAQIUABQACAgIAHc+80hjhZ0d4QAAAKgCAAAcAAAAAAAAAAAAAAAA
ACYLAAB3b3JkL19yZWxzL2RvY3VtZW50LnhtbC5yZWxzUEsBAhQAFAAICAgA
dz7zSC1ozyKxAAAAKgEAAAsAAAAAAAAAAAAAAAAAUQwAAF9yZWxzLy5yZWxz
UEsBAhQAFAAICAgAdz7zSAD+7s4fAQAAugMAABMAAAAAAAAAAAAAAAAAOw0A
AFtDb250ZW50X1R5cGVzXS54bWxQSwUGAAAAAAgACAD/AQAAmw4AAAAA
--001a11447dc881e40f0537fe6d5a--
"
["to"]=>
string(22) "example@example.comom"
["from"]=>
string(33) "Sender Name <example@example.com>"
["sender_ip"]=>
string(13) "209.85.214.45"
["spam_report"]=>
string(798) "Spam detection software, running on the system "mx0032p1mdw1.sendgrid.net", has
identified this incoming email as possible spam. The original message
has been attached to this so you can view it (if it isn't spam) or label
similar future email. If you have any questions, see
@@CONTACT_ADDRESS@@ for details.
Content preview: This is a test email with 1 attachment.
Content analysis details: (0.4 points, 5.0 required)
pts rule name description
---- ---------------------- --------------------------------------------------
0.0 HTML_MESSAGE BODY: HTML included in message
0.3 HTML_IMAGE_ONLY_04 BODY: HTML: images with 0-400 bytes of words
0.0 T_MIME_NO_TEXT No text body parts
"
["envelope"]=>
string(73) "{"to":["example@example.comom"],"from":"example@example.com"}"
["subject"]=>
string(5) "Hello"
["spam_score"]=>
string(5) "0.353"
["charsets"]=>
string(47) "{"to":"UTF-8","subject":"UTF-8","from":"UTF-8"}"
["SPF"]=>
string(4) "pass"
}
```
## Other Inbound Parse Documentation
- [Parse API](https://sendgrid.api-docs.io/v3.0/settings-inbound-parse/create-a-parse-setting) -
Manage Inbound Parse Webhook settings using the Parse API (Web API v3).
- [Parse Settings Subuser](https://www.twilio.com/docs/sendgrid/api/v2/customer_subuser_api/parse_settings) -
Get current Parse settings and create, edit, and delete entries using the Subuser API (Web API v2).
- [Reseller API Parse Settings](https://www.twilio.com/docs/sendgrid/api/v2/reseller_api/parse_settings) -
Get current Parse settings and create, edit, and delete entries using the Reseller API (Web API v2).
- [Reseller Customer Subuser Parse Settings](https://www.twilio.com/docs/sendgrid/api/v2/reseller_api/reseller_customer_subuser_api/customer_subuser_parse_settings) -
Get current Parse settings and create, edit, and delete entries using the Reseller Customer Subuser API (Web API v2).
## Statistics
SendGrid provides [statistics](https://app.sendgrid.com/statistics/parse_webhook) of how many emails are parsed over time. You can specify what is displayed on the graph by adjusting the statistics filters.
For more information, please see [Parse Webhook Stats](https://sendgrid.api-docs.io/v3.0/webhooks/retrieves-inbound-parse-webhook-statistics).
================================================
FILE: content/docs/for-developers/partners/account-migration.md
================================================
---
seo:
title: Migrating from a partner account
description: Sometimes if a SendGrid partner no longer supports SendGrid core functionality, you may want to migrate your account to a regular SendGrid account.
keywords: migrate, partner sunset
title: Migrating from a partner account
group: partner-migration
weight: 0
layout: page
navigation:
show: true
---
If you are setting up a new account directly with SendGrid but have previously had an account through one of our partners, there are several things to keep in mind - make sure to stop sending mail until you migrate to a new, warmed up account, and make sure export data from your old account, and clean up the data described here so that you can import it into your new account.
## Before you begin
- Pause sending email on your old account.
- Login to app.sendgrid.com with your current SendGrid username and password.
## Update sender authentication
You cannot export and import sender authentication data - you need to set this up manually in your new account after you delete the current authentication records from your [DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html#-DNS) provider.
If you have a domain, link, and IP authentication set up, remove 5 CNAME or MX/TXT records and 1 A record from your domain’s DNS. To verify the records delete from your DNS, go to the [Sender Authentication page](https://app.sendgrid.com/settings/sender_auth) in the UI and check the DNS column:

To set up sender authentication in your new account, check out [Setting up domain authentication]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html), [Setting up reverse DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html), and [Setting up link branding]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html).
## Migrate unsubscribes
To download your unsubscribes, on the [Global unsubscribes page](https://app.sendgrid.com/suppressions/global_unsubscribes), select the action menu, and then click **Download a CSV**.
To set up your unsubscribes in your new account, copy them into the UI by going to [Global](https://app.sendgrid.com/suppressions/global_unsubscribes) or [Group](https://app.sendgrid.com/suppressions/group_unsubscribes) Unsubscribes page, selecting the action menu and then adding them to the list. You can add them with the API by using the [Suppressions methods](https://sendgrid.api-docs.io/v3.0/suppressions-global-suppressions/add-recipient-addresses-to-the-global-suppression-group)
## Migrate templates
From the [Marketing Campaigns templates](https://sendgrid.com/marketing_campaigns/ui/marketing_templates) and the [Transactional templates](https://sendgrid.com/dynamic_templates) pages in the UI, export the HTML of any templates you want to migrate.
To add your templates in the new account, navigate to either the [Marketing Campaigns templates](https://sendgrid.com/marketing_campaigns/ui/marketing_templates) or the [Transactional templates](https://sendgrid.com/dynamic_templates) page in the UI, create a new template, select to [use the code editor]({{root_url}}/User_Guide/Marketing_Campaigns/editor.html), and paste the HTML of the exported template into the editor.
## Migrate Marketing Campaigns Contacts
From the [Marketing Campaigns contacts](https://sendgrid.com/marketing_campaigns/ui/contacts) page, click into your [Global All Contacts](https://sendgrid.com/marketing_campaigns/ui/all_contacts) list. Then export a CSV of your contacts.
To upload your contacts into your new account, from the [Contacts page](https://sendgrid.com/marketing_campaigns/ui/contacts), click **Add contacts** and then *Upload CSV*.
## Review existing API keys
If you are using the SendGrid API, double check your accounts [list of API keys](https://app.sendgrid.com/settings/api_keys). API keys are not exportable, but it's good to make sure that you're aware of all of the existing API keys in your account so that you can create new ones to match in your new account and update your integrations with the new API keys.
## Delete teammates
Teammate names have to be unique across SendGrid, so if you want to continue to use your teammate name, delete it from your original account to add it to your new account.
## Create new subusers
If you are using subusers, navigate to the [subusers page](https://app.sendgrid.com/settings/subusers) in the UI and click **Export data** to download all of the information on your current subusers.
To add subusers to your new account, go to the [subusers page](https://app.sendgrid.com/settings/subusers) in the UI, and click **Create a new subuser**. Use the data from the exported CSV to create a new subuser.
## Migrate dedicated IPs
If you are using a dedicated IP, our support team can migrate your dedicated IP for you. Access support contact options by logging into https://support.sendgrid.com. Provide us with: your current and new usernames, the IP addresses, and your preferred time for the IP transfer - we can migrate IPs between 7 am and 5 pm MST on Monday through Friday.
Be sure to set up reverse DNS and rewarm up your transferred IP before you start sending on it in your new account. You also need to reassign it to subusers if needed.
## Download statistics and email activity
On all of the statistics pages and on the email activity page, click **Export CSV** to download your statistics for your records. Your new account cannot import this data.
================================================
FILE: content/docs/for-developers/partners/amazon-marketplace.md
================================================
---
layout: page
weight: 90
title: Amazon Marketplace
group: platform-partners
navigation:
show: true
---
SendGrid has partnered with Amazon to offer our email services on the [Amazon Marketplace](https://aws.amazon.com/marketplace/pp/B074CQY6KB). Built by developers for developers, SendGrid offers developers simple SMTP and API integrations to start sending in minutes. Non-technical users can leverage Marketing Campaign's intuitive interface to create, send, and analyze marketing emails.
Once you have an AWS account, you can to [subscribe to SendGrid](https://aws.amazon.com/marketplace/pp/B074CQY6KB) and access it directly from the [AWS Management Console](https://console.aws.amazon.com/). Once you’ve subscribed to SendGrid, you have access to the [SendGrid application](https://app.sendgrid.com/) and the APIs. Use the AWS Management Console if you want to reset your password, cancel your account, or manage bills.
## Getting started
*To quickly get started with SendGrid:*
- See [Getting Started With Marketing Campaigns]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/) for all of the tools you need to get started sending with the SendGrid application.
- Look at the [API Reference]({{root_url}}/api-reference/) for all of the API endpoints as well as information about using SMTP and the Webhooks.
- See the [API Libraries]({{root_url}}/for-developers/sending-email/libraries/) page for information about using the SendGrid code libraries in C#, Go, Java, Node.js, PHP, Python, and Ruby.
<call-out>
If you are using SendGrid through AWS, you cannot change your SendGrid username.
</call-out>
<call-out>
**Warm up your sending** - Since ISP spam filters look at volume as a significant factor when determining whether or not you are sending spam, we recommend that you begin sending a low to moderate volume, eventually working your way up to larger volumes. This gives the receiving email providers a chance to closely observe your sending habits and the way your customers treat the emails they receive from you. For more information, see [IP Warmup](https://sendgrid.com/docs/glossary/ip-warmup/).
</call-out>
### Pricing
There are two plans: AWS Basic and AWS Pro. These plans are billed on your AWS invoice. For more information, check out our [AWS Marketplace page](https://aws.amazon.com/marketplace/pp/B074CQY6KB). Here's a monthly view of cost:

### Adding a dedicated IP address
You can purchase IP addresses dedicated to your account. Since you are the only one sending email over this IP, your sending practices determine the sender reputation associated with this IP. You can purchase up to 3 IP addresses per month. If you need more than 3 IPs, then you should [contact support](https://support.sendgrid.com/hc/en-us).
You can only add a Dedicated IP Address if you are on an AWS Pro plan. To upgrade your plan, see [Upgrading or Downgrading Your Account](#upgrading-or-downgrading-your-account).
*To add a dedicated IP Address*:
1. Navigate to the [Plan & Billing Details page](https://app.sendgrid.com/settings/billing) in the SendGrid UI.
2. Click **Add a Dedicated IP**.

This takes you to the Dedicated IP Addresses page
3. Next, click **Add an IP Address**.
4. Select the number of IP Addresses to add, and select whether you want to warm up your IP automatically. Warming up an IP gradually increases the amount of email sent over this IP over time to improve your email deliverability. For more information, see [Warming Up IPs]({{root_url}}/ui/sending-email/warming-up-an-ip-address/).
5. Click **Add**.
### Adding domain authentication and link branding
Sender authentication shows email providers that SendGrid has your permission to send emails on your behalf. Domain authentication works by pointing DNS entries from your domain registrar to SendGrid, which drastically increases your ability to deliver email and allows you to begin building a sender reputation for your domain and for your IP addresses. For more information on domain authentication, see [How to Set Up Domain Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/).
### Adding subusers
You can only add Subusers if you are on an AWS Pro plan. To upgrade your plan, see [Upgrading or Downgrading Your Account](#upgrading-or-downgrading-your-account). Subusers are SendGrid accounts that belong to a parent account. They have their permissions and credit limits, which you assign as you create the Subusers. Subusers help you segment your email sending and API activity.
To get started with using Subusers, see the [Subusers overview]({{root_url}}/ui/account-and-settings/subusers/).
### Upgrading or downgrading your account
You can upgrade or downgrade your account from the [SendGrid UI](https://app.sendgrid.com/settings/billing).
*To change your account plan:*
1. Navigate to the [Plan & Billing Details page](https://app.sendgrid.com/settings/billing) in the SendGrid UI.
1. Select Upgrade to AWS Pro, or Downgrade to AWS Basic.

### Managing billing options
Manage your billing options from the [AWS Billing & Cost Management Dashboard](https://console.aws.amazon.com/billing/).
### Canceling your SendGrid subscription
*To remove SendGrid from your AWS account:*
1. Navigate to your [Software Subscriptions page](https://aws.amazon.com/marketplace/library?productType=saas&ref_=lbr_tab_saas) on AWS.
1. Click **Cancel Subscription** in the SendGrid section.

### Troubleshooting
If you run into issues with your AWS SendGrid account, you can contact our support team by [logging in here](https://support.sendgrid.com) and opening a support ticket.
================================================
FILE: content/docs/for-developers/partners/azure.md
================================================
---
layout: page
weight: 0
group: platform-partners
title: Building an iOS App on Windows Azure
navigation:
show: true
---
## Point and click setup in Microsoft Azure
You can control a website, mobile backend and SendGrid all from within the Microsoft Azure management portal. We will cover all 3 of these in this tutorial.
To start, create a SendGrid account from the management portal:
1. Click **New** at the bottom left.

2. Click **Store** to load up the list of Add-ons.
3. Select **SendGrid**.

4. Then click the arrow at the lower right to go to step 2.
5. Choose the Free plan for now for 25,000 free emails per month.

6. Proceed to step 3 and click **Purchase**.
*To create a Windows Azure Website:*
1. Click **New** at the bottom left.
2. Select **Website**, then **Quick Create**.

3. Set the URL, such as `website.azurewebsites.net`.
4. Click **Create Web Site** on the bottom right.
That’s it! You now have a website running on Azure. Now let’s create something cool.
## Connect to the SendGrid Inbound Parse API
SendGrid can both send and receive an email for your domain name. The playlist app uses incoming mail, which means setting up DNS at your domain registrar or host. The process to do this is going to be different depending on who controls your DNS. This tutorial will walk through the Azure and SendGrid part of this process, but you may need to ask for help on changing DNS in your system.
It’s a good idea to choose a subdomain like playlist.example.com, rather than a domain itself. That’s because the Inbound Parse API must collect all mail and you don’t want to interrupt another email for your domain. To use custom domains in Windows Azure, your website will need to run in either Shared mode or the Standard tier; however, Shared mode is currently not available.
Find your IP address and note the further instructions in the management portal:
1. Select your website from the list and then click SCALE on the top menu bar.

2. Change the Web Site Mode to Shared, click **Save**, then select **Yes**.
3. Click **Configure** at the top menu bar, then scroll down to click **Manage Domains**.
4. Add your full subdomain plus domain, like playlist.example.com and click the check mark

5. Note the IP address and the instructions on this page. You’ll use these at your host or registrar when you modify your DNS settings.
Now you need to update your own DNS settings outside of the Windows Azure interface. This points your domain’s web traffic to Microsoft Azure and your email to SendGrid. How you change your DNS depends on where your DNS is administered, which could be your host or domain registrar.
You’ll need to make 3 updates to your DNS:
1. Create an A record for playlist.example.com that points to the IP noted above
2. Create a CNAME record according to the instructions on the screen where you obtained the IP Address
3. Create an MX record pointing to mx.sendgrid.net.
DNS changes can take an hour or more to propagate. Back at Windows Azure’s domain management page, wait for the red exclamation point to become a green checkmark.
While you're waiting for DNS to be ready, you can prepare your SendGrid Incoming Parse API webhook. From the Windows Azure interface:
1. Click the **SendGrid App Service** from your all items list.
2. In the management section, select **Go to the SendGrid website for next steps**.

3. Now you’re looking at the SendGrid interface--click **Developers** at the top.
4. Click PARSE INCOMING EMAILS on the right and you’ll see some fields to fill out

5. Fill in the values you’ve used for your hostname and URL. For example:
* Hostname: `playlist.example.com`
* URL: `http://website.azurewebsites.net/email`
6. Click **Add Host & URL**.
Once the DNS has propagated, you’ll be able to receive an email to any email address `@playlist.example.com`. In the next step, we’ll make sure your website on Microsoft Azure is ready to accept those emails.
## Prepare the code to run on Microsoft Azure
Before you can put the code in place, you need to prepare your source control system, which will be Git in this case. Make sure you have Git installed on your local machine before proceeding. There are downloads for Windows, Mac, Linux, and Solaris.
Now set up your repository within the Windows Azure interface:
1. Click the website name from your all items list.
2. Under quick glance, click **Set up deployment from source control**.
3. Choose **local git repository**.
4. Copy the Git URL to your clipboard--you will need it later, and it should look similar to `https://username@subdomain.scm.azurewebsites.net/playlist.git`
Now you need to set some environment variables, so you don’t expose these credentials in your code. Follow these steps to find those credentials:
*To find your SendGrid credentials within the Windows Azure management portal:*
1. Click **SendGrid** from the all items list.
2. In the bar on the bottom, click **Connection Info**.

3. A screen will pop up with your password, SMTP server, and username
To get your Spotify API Key, which you'll use to create your playlist, follow the instructions here: [https://developer.spotify.com/documentation/general/guides/app-settings/](https://developer.spotify.com/documentation/general/guides/app-settings/).
With the credentials in hand, it’s time to add them as environment variables within the Windows Azure management portal:
1. Choose your website from the all items list, then click **Configure**.
2. Under “app settings” set the following KEY VALUE pairs
* `SENDGRID_USER = username`
* `SENDGRID_PASS = password`
* `DOMAIN = playlist.example.com`
* `CLIENT_ID = your_key`
* `CLIENT_SECRET = your_secret`
* `XHR_POLLING_ONLY = 1`
3. Click SAVE at the bottom
With your source control and environment variables set, it’s time to download the code that makes this app run. You will then upload that code to your Azure account.
Open up your command line on your local machine and prepare it for code:
1. Create a local folder to house the code (e.g. `mkdir playlist`)
2. Clone the code into that directory by executing this command:
`git clone git://github.com/theycallmeswift/playlist.sendgriddemos.com.git`
3. `cd playlist.sendgriddemos.com`
4. `git remote add azure git_url`
* This is the long URL you saved from Microsoft Azure after
setting up source control.
5. `git push azure master`
* This is the command that pushes the code to Azure cloud
One last thing, you need to update the receiving email address:
1. Open up `public/index.html`
2. Change the email in `index.html` (line 25) to the email address you want to use. Something like `play@playlist.example.com`
3. `git add .`
* This adds the modified file for upload
4. `git commit -m "Updating email address"`
5. `git push azure master`
* Again, this pushes the code to Azure cloud
With your changes pushed to Azure, you can restart the server with the button at the bottom of the web server’s dashboard. Then click the BROWSE button within the same menu to see your website live. At this point, people can send in their song requests, assuming that the DNS has propagated.
## Add a backend using Microsoft Azure Mobile Services
Microsoft Azure can also run a backend-as-a-service for your app, which allows you to store data, authenticate users, send push notifications, and do other common mobile tasks. This backend can also be used for non-mobile applications.
Follow these steps to enable Mobile Services from the Microsoft Azure interface:
1. Click NEW at the bottom left, select MOBILE SERVICE, then click **Create**.
2. Choose a URL -- this is up to you, it will be internal to your app

3. Click **Next**.
4. Choose a Server Login Name and Password
5. Choose **Configure advanced database settings**.

6. Click **Next**, then review and click **Complete**.
*To add a table to the database:*
1. Click on the name of your mobile service to access its settings
2. Click **Data**, then Add a Table
3. Choose a table name, update permissions and click **Complete**.

In your `index.html` file add the following code near the closing body tag to add the Windows Mobile Services library to your app:
``` html
<script src="https://website.azure-mobile.net/client/MobileServices.Web-1.0.0.min.js"></script>
```

In the `js/app.js` file, after the `$("#queue").append…` line, add the following code:
``` javascript
var client = new WindowsAzure.MobileServiceClient("https://website.azure-mobile.net/", "<Password>");
var item = { request: data.name, song: data.track, user: data.user };
client.getTable("playlist_songs").insert(item);
```
To allow for your app to have access to the DB, add your URL to the cross-origin resource sharing (cors) setting.

Add your changes via git and push to Azure.
Now your website, mobile service, and SendGrid account are all in harmony on Microsoft Azure. You could stop here, but to see the real power of Mobile Services, you’ll want to create a native mobile application.
## Connect Microsoft Azure Mobile Services to iOS
The Microsoft Azure Mobile Services SDK simplifies the process of standing up a backend for your app in Microsoft Azure. The Microsoft Azure team also has SDKs for Android, HTML, Windows Store, and Windows Phone. For this example, we are going to use iOS.
We can download a pre-packaged mobile app from within the Microsoft Azure interface:
1. Click the name of your mobile service from the all items menu.
2. You should see the quickstart tab. Click iOS then Create a new iOS app.
3. Click **Download** to grab the source code.

To create a native iPhone app, you’ll need to have XCode installed on a Mac. It’s a big download (over 1 GB), so find something to do while you wait.
Now you’ll want to edit the sample app you downloaded from Microsoft Azure:
1. Expand the files on your computer and open the project file using XCode.
2. Update the credentials and table name in `QSTodoService.m` with the ones you used when you created your mobile service.

3. Update the function refreshDataOnSuccess in `QSTodoService.m` to return all from the queue. Remove the existing code there and replace it with:
``` objc
// Return all song request titles from the table
// items: An NSArray of the records that matched your query.
// totalCount: The total count of items in all pages of the query, not just those returned in the current page. This value is set to -1, unless you explicitly request the total count in your request. For more info, see Return data in pages.
// error: Any error that occurred; otherwise nil.
[self.table readWithCompletion:^(NSArray *results, NSInteger totalCount, NSError *error) {
[self logErrorIfNotNil:error];
items = [results mutableCopy];
// Let the caller know that we finished
completion();
}];
```

4. Now, go to the file QSToDoListViewController.m, and replace the onAdd function’s contents with:
``` objc
// Populate the parameters for the SendGrid Web API Call
// Find more details about the [Web API here]({{root_url}}/api-reference/).
NSString *username = @"<Your SendGrid Username>";
NSString *apikey = @"<Your SendGrid Password>";
NSString *to = @"<Email to Playlist Service from Appendix A>";
NSString *from = @"<From Email Address>";
NSString *fromname = @"<Your Name>";
NSString *text = @"%20";
// Make sure the data received from the text field is formatted properly
NSString *subject = [itemText.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// Generate the Web API call
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://api.sendgrid.com/api/mail.send.json?to=%@&from=%@&fromname=%@&subject=%@&text=%@&api_user=%@&api_key=%@",to, from, fromname, subject, text, username, apikey]];
// This writes the composed URL in the XCode console for debugging purposes
NSLog(@"URL %@",url);
// Create a request object using the URL
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// Prepare for the response back from the server
NSHTTPURLResponse *response = nil;
NSError *error = nil;
// Send a synchronous request to the server
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
// Error handling
if (error != nil) {
NSLog(@"%@", [error localizedDescription]);
UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Error"
message:@""
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[message show];
}
itemText.text = @"";
```
5. In the same file, replace this line:
```label.text = [item objectForKey:@"text"];```
with this line:
```label.text = [item objectForKey:@"request"];```
Now you can make some adjustments to the interface:
1. Click on the storyboard, then the **Text Input** field.

2. On the right, change the placeholder text to read: “Enter your song request”
3. Next, double click on the button and rename it to “Send”. You will have to adjust the size of the text box and button by single clicking and adjusting.

Your project in XCode should look like the above screenshot. When you run the iPhone app, you should be able to see requested songs and add your own songs to the shared playlist.
The code for this tutorial is available at our [GitHub page](https://github.com/sendgrid/sendgrid-azure-ios/). Enjoy!
================================================
FILE: content/docs/for-developers/partners/google.md
================================================
---
layout: page
weight: 0
group: platform-partners
title: Google
navigation:
show: true
---
If you are using Google’s cloud platform, you can easily integrate with SendGrid. Simply navigate to the [GCP Marketplace](https://console.cloud.google.com/marketplace/details/sendgrid-app/sendgrid-email), locate the [SendGrid add-on](https://console.cloud.google.com/marketplace/details/sendgrid-app/sendgrid-email), select the appropriate plan, and get ready to start sending.
Using Google’s App Engine or Compute Engine? Here are a few examples of how to implement SendGrid to help improve deliverability and provide analytics for your projects.
## App Engine Examples
1. [Python](https://cloud.google.com/appengine/docs/standard/python/mail/sendgrid)
2. [Java](https://cloud.google.com/appengine/docs/standard/java/mail/sendgrid)
3. [PHP](https://cloud.google.com/appengine/docs/standard/php/mail/sendgrid)
4. [Go](https://cloud.google.com/appengine/docs/standard/go/mail/sendgrid)
5. [Node.js](https://cloud.google.com/appengine/docs/standard/nodejs/sending-emails-with-sendgrid)
## Compute Engine
If you're using Google's Compute Engine, click [here](https://cloud.google.com/compute/docs/tutorials/sending-mail/using-sendgrid)
Check out [our blog](https://sendgrid.com/blog/partnership-includes-google-compute-engine/) for more information on how to make Google and SendGrid work together.
================================================
FILE: content/docs/for-developers/partners/jelastic.md
================================================
---
layout: page
weight: 0
group: platform-partners
title: Jelastic
navigation:
show: true
---
SendGrid can be implemented in Jelastic's cloud platform. SendGrid and Jelastic interconnection allows you to send emails directly from your Java or PHP application hosted with Jelastic cloud technologies.
### Application Examples
1. [Java with Spring](http://docs.jelastic.com/sendgrid-java)
2. [PHP](http://docs.jelastic.com/sendgrid-php)
================================================
FILE: content/docs/for-developers/partners/microsoft-azure-2021.md
================================================
---
seo:
title: Sending Email with Microsoft Azure
description: Learn how to send email with Twilio SendGrid's newest Azure integration
keywords: Microsoft, Azure, Integration
title: Sending Email with Microsoft Azure
group: platform-partners
weight: 100
layout: page
navigation:
show: true
---
<call-out>
This documentation applies to the most recent version of the Twilio SendGrid integration for Microsoft Azure. For documentation on the previous version, see the [SendGrid documentation]({{root_url}}/for-developers/partners/microsoft-azure/) or related [Azure documentation](https://docs.microsoft.com/en-us/azure/sendgrid-dotnet-how-to-send-email).
</call-out>
This guide will help you create and configure a Twilio SendGrid account using Microsoft Azure. Once your account is ready, you'll be on your way to delivering email at scale.
## Create an Azure Subscription
To get started with Twilio SendGrid and Azure, visit the [Azure Portal home page](https://portal.azure.com/#home). You will need to sign in or create a Microsoft account if you do not already have one.
Once logged in, select the **Subscriptions** icon under the **Azure services** menu.

A new page will load, listing your current subscriptions. You can add Twilio SendGrid to an existing Subscription or Select **+Add** to create a new subscription. For more information about Subscriptions and billing, see the Azure docs for how to "[Create an additional Azure subscription](https://docs.microsoft.com/en-us/azure/cost-management-billing/manage/create-subscription)."
For this guide, we will create a new Subscription.

If you already have an Azure account set up for billing, you will be taken to a page where you can create a subscription.
<call-out>
If you are creating your first Azure Subscription, you will first need to select a billing offer for your Subscription. You will be guided through the Azure offer signup process. You can return to this guide once your billing setup is complete.
</call-out>
A form will load with a **Subscription Name** field. You must add a name — we recommend something that clearly differentiates the subscription. All the other fields are already populated and cannot be edited. Click **Create**.

Once the Subscription is created, you will see it listed on the Subscriptions page. If you do not see the Subscription, try refreshing the list.
<call-out>
If you have multiple Azure Active Directory tenants, be sure you are viewing the tenant your subscription is assigned to. You can select **Switch directories** to view your additional tenants. For more on Azure AD, see "[Associate or add an Azure subscription to your Azure Active Directory tenant](https://docs.microsoft.com/en-us/azure/active-directory/fundamentals/active-directory-how-subscriptions-associated-directory)."
</call-out>

## Create a Twilio SendGrid account
From the Azure portal home page, select **Marketplace** under **Azure services**. If you do not see the **Marketplace** icon, you can search for it by selecting **More services**.

The Azure Marketplace provides many services, including the Twilio SendGrid email service. You can find it by searching for "Twilio SendGrid." You will also find it under **Software as a Service (SaaS)**.
Click the Twilio SendGrid resource to load a page where you can select your account tier. You can start with a free account and upgrade as your sending needs change. See the [Twilio SendGrid pricing page](https://sendgrid.com/pricing/) to understand what's included with each plan.


Select **Set up + subscribe**. You will be taken to a page where you can assign your Twilio SendGrid account to an Azure Subscription and Resource Group. Once you have completed the required fields, select **Review + subscribe**.

You will be asked to agree to Azure's term of services. You can now review your order and click **Subscribe**.
It takes a few moments to establish your account. You will be shown a progress screen. When the setup is complete, you will be able to click the **Configure account now** button to be taken to the Twilio SendGrid App. You will also receive an email when the subscription setup is complete.

## Twilio SendGrid account setup
Before sending your first email, you will need to complete the following Twilio SendGrid account setup. These requirements help secure your account and keep your messages from landing in spam folders.
- Configure Two-factor authentication
- Create an API key
- Complete Sender Authentication
### Two-factor authentication
Twilio SendGrid uses Two-factor authentication (2FA) to help protect your account. To enable 2FA, Navigate to **Two-Factor Authentication** in the Twilio SendGrid **Settings** menu, and click **Add Two-Factor Authentication**.

A modal will open where you can complete the 2FA setup. Click **Ok, Got it** to continue.
<call-out type="warning">
If you have previously configured services to authenticate with Twilio SendGrid APIs using Basic Authentication, enabling 2FA will break those integrations. You must use API keys to authenticate with Twilio SendGrid APIs.
</call-out>

Twilio SendGrid supports 2FA using either SMS or the Authy App. Select your preferred 2FA method, and click **Next**.
You will need to enter a phone number to complete the 2FA process. SMS users will be sent a confirmation code at the number they entered. Authy users will be sent instructions for downloading and completing the 2FA setup using the Authy app.
### API keys
API Keys authenticate your application, mail client, or website with Twilio SendGrid services. Unlike a username and password, API keys are scoped to provide access only to the services you select. You can also delete and create API keys without impacting your other account credentials. For these reasons, Twilio SendGrid requires you to connect to its services using API keys.
#### Create an API key
In the Twilio SendGrid App, navigate to **API Keys** in the **Settings** menu, and select **Create API Key**.

A modal will open where you can create your key. You must name the API key — we recommend something that will clearly differentiate the key from others you may create in the future.

You must also select the type of key you want to create. Twilio SendGrid provides three types of API key:
- Full Access
- Restricted Access
- Billing Access
To keep your account secure, you should give each key the [least privilege](https://www.twilio.com/blog/principle-of-least-privilege-details-best-practices) necessary. You can limit a key's capabilities by creating a **Restricted Access** key and selecting a subset of all the possible permissions. For more about managing Twilio SendGrid API keys, see the [Twilio SendGrid API keys documentation]({{root_url}}/ui/account-and-settings/api-keys/).
<call-out>
For security reasons, Twilio SendGrid API keys will be displayed to you at the time of creation only. Be sure to copy your key and store it somewhere secure like your [Azure Key Vault](https://azure.microsoft.com/en-us/services/key-vault/). If you lose your key, you must create another — it's not possible to recover a lost key. The permissions assigned to a key can be modified after it's created.
</call-out>
#### Use an API key
Twilio SendGrid's v3 APIs expect an API key to be passed in an Authorization header as a Bearer Token. See the [Twilio SendGrid v3 API reference]({{root_url}}/api-reference/) for help using your key to send your first email.
The Twilio SendGrid helper libraries all provide a method to set your key, handling the authentication via Bearer Token for you. See the [Twilio SendGrid developer documentation]({{root_url}}/for-developers/) for helpful code examples and links to helper libraries in C#, Go, Java, Node.js, PHP, Python, and Ruby.
When using Twilio SendGrid’s SMTP integration, you will set your API key as a password via Basic Authentication. Your username must always be the string, “apikey.” Using the account credentials (username and password) you set up through Azure will fail, so be sure to set your password to the 14 digit API key provided by the Twilio SendGrid App. Your account credentials are separate from the credentials used to authenticate with Twilio SendGrid’s APIs and SMTP services.
```
username: "apikey"
password: <your-api-key>
```
### Sender Authentication
Twilio SendGrid requires customers to complete Sender Authentication. This requirement protects your domain's reputation as an email sender and helps uphold legitimate sending behavior by Twilio SendGrid customers.
Setup includes domain authentication. Twilio SendGrid will provide DNS records that you must add to your domain. For instructions on the domain authentication process, see "[How to Set Up Domain Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)."
## Change, unsubscribe, reactivate your Twilio SendGrid plan
You can upgrade or downgrade your Twilio SendGrid plan to accommodate your email sending needs as they change. If you no longer need the Twilio SendGrid service, you will aslo unsubscribe through the Azure portal.
From your Azure portal's Subscription overview page, select **Resources** and click your Twilio SendGrid resource (it is labeled "Contoso" in the following examples).

A detail page will load where you can modify your Twilio SendGrid subscription.

### Upgrade or downgrade your plan
To upgrade or downgrade your plan, select **Change plan** from the Twilio SendGrid resource detail page. There are two locations where you can select **Change plan** — selecting **Change subscription** will allow you to modify your Azure subscription, not your Twilio SendGrid plan.

A modal will open, displaying the available plans with your current plan selected. Select a new plan, and click **Change plan**. You will see a confirmation message on the page when your plan has been updated.
### Unsubscribe from Twilio SendGrid
To unsubscribe from Twilio SendGrid, select **Unsubscribe** from the Twilio SendGrid resource detail page.

A modal will open asking you to select the reason for ending your subscription. Select an option that best describes your situation, and click **Unsubscribe**.

You will receive a confirmation message when your subscription has been removed.
### Reactivate your Twilio SendGrid account
If you have unsubscribed from Twilio SendGrid and need the service again in the future, you will need to create a new subscription. If your account has been suspended, you can reactivate the service by paying any outstanding account balance. Once payment has been received, you'll be able to reactivate your account.
================================================
FILE: content/docs/for-developers/partners/microsoft-azure.md
================================================
---
layout: page
weight: 0
group: platform-partners
title: Microsoft Azure
navigation:
show: true
---
If you are using Microsoft’s cloud platform, you can easily integrate with SendGrid. Simply navigate to the [Azure Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/SendGrid.SendGrid), locate the [SendGrid add-on](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/SendGrid.SendGrid), select the appropriate plan, and get ready to start sending.
The following documentation covers signing up, sending an email, adding an attachment, as well as using filters. See the below Code Examples to start learning how Azure and SendGrid can solve your email deliverability problems.
## Code Examples
1. [PHP](https://docs.microsoft.com/en-us/azure/store-sendgrid-php-how-to-send-email)
2. [Node.js](https://docs.microsoft.com/en-us/azure/store-sendgrid-nodejs-how-to-send-email)
3. [.NET](https://docs.microsoft.com/en-us/azure/sendgrid-dotnet-how-to-send-email)
4. [Java](https://docs.microsoft.com/en-us/azure/store-sendgrid-java-how-to-send-email)
5. [Java]({{root_url}}/for-developers/partners/azure/) via an Azure webpage
6. [Mobile Services](https://docs.microsoft.com/en-us/azure/sendgrid-dotnet-how-to-send-email)
## Still have questions?
Wondering how to make the most of your SendGrid/Azure integration? Check out our [Azure related blog entries](https://sendgrid.com/?s=Azure).
You are limited to 1 SendGrid account per Azure subscription. This limit exists for security and compliance reasons to prevent abuse.
Customers that integrate through the [Azure Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/SendGrid.SendGrid), do not have access to SendGrid's Marketing Campaigns.
If you try to create a second account, you will encounter this error on your dashboard:

================================================
FILE: content/docs/for-developers/sending-email/api-getting-started.md
================================================
---
seo:
title: Getting started with the SendGrid API
description: Sending your first email using the SendGrid REST API.
keywords: Getting Started, API, v3, REST, SendGrid REST API
title: Getting started with the SendGrid API
group: api-v3
weight: 100
layout: page
navigation:
show: true
---
There are several ways you can get started with the SendGrid API.
## Prerequisites for sending your first email with the SendGrid API
These instructions describe how to send your first email using cURL calls. This is one of many ways to send email with the SendGrid API - we also have [PHP](https://github.com/sendgrid/sendgrid-php), [Python](https://github.com/sendgrid/sendgrid-python), [Node.js](https://github.com/sendgrid/sendgrid-nodejs), [Java](https://github.com/sendgrid/sendgrid-java), [C#](https://github.com/sendgrid/sendgrid-csharp), [Go](https://github.com/sendgrid/sendgrid-go), and [Ruby](https://github.com/sendgrid/sendgrid-ruby) libraries.
Before you can start using the API, you need to do the following:
1. Create a SendGrid [account](https://sendgrid.com/pricing/).
2. Create an [API Key](https://app.sendgrid.com/settings/api_keys).
3. Make sure you have [curl](https://curl.haxx.se/) installed on your machine.
<call-out>
cURL comes standard on Mac operating systems.
</call-out>
## How to send an API email
### Build your API call
Your API call must have the following components:
- **A host.** The host for Web API v3 requests is always `https://api.sendgrid.com/v3/`
- **An [Authorization header](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-authentication#authorization-header).** An [API Key](https://app.sendgrid.com/settings/api_keys) must be included in the Authorization header.
- **A request.** When submitting data to a resource via POST or PUT, you must submit your payload in JSON.
<call-out>
**Message size limit:** The total message size should not exceed 20MB. This includes the message itself, headers, and the combined size of any attachments.
</call-out>
### Send your email using the API
<call-out type="warning">
Please note that Basic Authentication is no longer accepted; you must use an API key.
</call-out>
_To Send an email using the SendGrid API:_
```
curl --request POST \
--url https://api.sendgrid.com/v3/mail/send \
--header 'Authorization: Bearer <<YOUR_API_KEY>>' \
--header 'Content-Type: application/json' \
--data '{"personalizations":[{"to":[{"email":"john.doe@example.com","name":"John Doe"}],"subject":"Hello, World!"}],"content": [{"type": "text/plain", "value": "Heya!"}],"from":{"email":"sam.smith@example.com","name":"Sam Smith"},"reply_to":{"email":"sam.smith@example.com","name":"Sam Smith"}}'
```
1. Copy the curl example above.
2. Paste the curl call into your favorite text editor.
3. Copy your API key and paste it in the "Authorization" header.
4. In the data section, specify the "to", "from", and "reply to" names and email addresses and enter a subject.
5. Copy the code and paste it in your terminal.
6. Hit **Enter**.
7. Check the inbox of the address you specified as the "to" email and see your message!
<call-out>
If you have not yet set up [Sender Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/) in your account, you may need to check your spam folder for the email you just sent.
</call-out>
<call-out-link linktext="IMPLEMENTATION SERVICES" img="/img/expert-insights-promo1.png" link="https://sendgrid.com/solutions/email-implementation/">
### Do you want expert help to get your email program started on the right foot?
Save time and feel confident you are set up for long-term success with Email Implementation. Our experts will work as an extension of your team to ensure your email program is correctly set up and delivering value for your business.
</call-out-link>
### API response messages
All responses are returned in JSON format. We specify this by sending the `Content-Type` header. The Web API v3 provides a selection of [response codes](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#status-codes), [content-type headers](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#content-type-header), and [pagination](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#pagination) options to help you interpret the responses to your API requests.
<call-out>
Get additional onboarding support. Save time, increase the quality of your sending, and feel confident you are set up for long-term success with [SendGrid Onboarding Services](https://sendgrid.com/marketing/onboarding-services-request/?utm_source=docs).
</call-out>
## Next steps
For more information on SendGrid and where you can go from here, check out these pages:
- [API Reference]({{root_url}}/api-reference/)
- [Sender Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)
- [Automating Subusers]({{root_url}}/for-developers/sending-email/automating-subusers/)
================================================
FILE: content/docs/for-developers/sending-email/applemail.md
================================================
---
layout: page
weight: 0
title: Apple Mail
group: plugins
navigation:
show: true
---
These instructions show how to add an SMTP server to an existing Mail account, but you can also add these settings at the account creation stage.
## Adding SMTP settings
Go to Mail -\> Preferences (⌘,). On the account you want to edit, click the tab that says **Server Settings**, then click the **Outgoing Mail Account** dropdown and select **Edit SMTP Server List...**.

Next, click the **+** under the list of SMTP servers, and add a new one.

Then enter the server details:
- **Description:** SendGrid
- **User Name:** SendGrid account username
- **Password:** SendGrid account password
- **Host Name:** smtp.sendgrid.net
- Uncheck **Automatically manage connection settings** if you want to specify Custom Ports, Encryption Type and Authentication
- **Port:** Specify the port
- **Encryption:** Check or uncheck Use TLS/SSL
- **Authentication:** Password

Now the SendGrid SMTP Server can be specified on the **Accounts** tab of the **Preferences** window in the **Outgoing Mail Account** dropdown. Once this is selected, mail sent out of Apple Mail going forward will use the SMTP server chosen until specified otherwise.

<call-out>
Unfortunately, there is not an easy way to add SMTP API headers to a message in Mail.
</call-out>
## Attachment Compatibility
Mail will sometimes attach images in a way that is incompatible with other email readers. However, this behavior can be changed so that Mail will send more traditional non-inline attachments.
1. Open Terminal (found in Finder > Applications > Utilities).
1. In Terminal, paste the following: ```defaults write com.apple.mail DisableInlineAttachmentViewing -bool yes```.
1. Press return.
1. Restart the Mail app.
If you wish to restore the normal behavior of Mail, repeat the steps above while using the following command: ```defaults write com.apple.mail DisableInlineAttachmentViewing -bool no```.
================================================
FILE: content/docs/for-developers/sending-email/authentication.md
================================================
---
seo:
title: Authentication
description: Authenticating with the SendGrid API.
keywords: getting started, Authentication, authorization, API key
title: Authentication
group: sending-email
weight: 0
layout: page
navigation:
show: true
---
SendGrid supports API keys delivered via Bearer token or Basic authentication, depending on the SendGrid functionality you are using. In addition to Bearer API key authentication, SendGrid recommends two-factor authentication (2FA) to improve security.
## API key
Authenticate to the SendGrid API by creating an API Key in the [Settings section of the SendGrid UI](https://app.sendgrid.com/settings/api_keys).
SendGrid requires using API keys because they are a secure way to talk to the SendGrid API that is separate from your username and password. If your API key gets compromised, it's easy to delete and create a new API key and update your environment variables with the new key. API key permissions can be set to provide access to different functions of your account, without providing access to your account as a whole.
To use an API key, pass an Authorization header with a value of `Bearer <Your-API-Key-Here>`, where you replace `<Your-API-Key-Here>` with the API Key that you created in the UI.
Example header:
```
GET https://api.sendgrid.com/v3/resource HTTP/1.1
Authorization: Bearer <Your-API-Key-Here>
```
```bash
curl -X "GET" "https://api.sendgrid.com/v3/templates" -H "Authorization: Bearer <Your-API-Key-Here>" -H "Content-Type: application/json"
```
## Basic authentication
SendGrid supports Basic Authentication using an API key as your password value for some services. When using Basic Authentication, your username will always be "apikey," and your password will be your API key.
<call-out type="warning">
To ensure the security of your account, Twilio SendGrid has ended support for basic authentication with username and password as of Q4 2020.
</call-out>
### Security with Basic authentication
Using basic authentication with your account password is not as secure as using an API key. If your credentials are compromised—for example, if you accidentally commit them to version control—it is more difficult to regain the security of your account when those credentials are your username and password rather than an API key. For this reason, Twilio SendGrid no longer supports authentication via username and password.
<call-out type="warning">
If you are currently using Basic authentication, we recommend upgrading your authentication method to Bearer using [API Keys]({{root_url}}/ui/account-and-settings/api-keys/) and then enabling Two-Factor Authentication for improved security. For more information, see [Upgrading your authentication method to API Keys]({{root_url}}/for-developers/sending-email/upgrade-your-authentication-method-to-api-keys/).
</call-out>
## Two-factor authentication
Enabling two-factor authentication (2FA) will allow Twilio SendGrid to deliver confirmation codes via SMS to your mobile phone. You will not be able to log in when cellular service is not available. SMS 2FA is powered by [Authy](https://authy.com/). Selecting this option does not require an Authy account, but if you have one, you will be able to use either the [Authy App](https://www.authy.com/app/mobile/) or SMS messages.
SendGrid recommends enabling two-factor authentication (2FA) for all users. For more information about setting up 2FA, see [Two-factor authentication]({{root_url}}/ui/account-and-settings/two-factor-authentication/).
<call-out>
To ensure the security of your account, Twilio SendGrid requires customers to enable [Two-factor authentication]({{root_url}}/ui/account-and-settings/two-factor-authentication/).
</call-out>
<call-out type="warning">
It is not possible to use basic authentication for users, subusers, or teammates that enable 2FA.
</call-out>
================================================
FILE: content/docs/for-developers/sending-email/automating-subusers.md
================================================
---
seo:
title: Automate Adding Subusers with the SendGrid API
description: Use the SendGrid API to add Subusers to your account.
keywords: Getting Started, API, v3, REST, SendGrid REST API, Subuser
title: Automate Adding Subusers with the SendGrid API
group: api-v3
weight: 100
layout: page
navigation:
show: true
---
You can utilize the SendGrid API to automate the addition of Subusers to your account. Use the following ```curl``` examples to add a Subuser using the SendGrid V3.0 API.
## Prerequisites for automating addition of Subusers to your account
Before you can start using the API, you need to do the following:
1. Create a SendGrid [account](https://sendgrid.com/pricing/).
2. Create an [API Key](https://app.sendgrid.com/settings/api_keys).
3. Make sure you have [curl](https://curl.haxx.se/) installed on your machine.
<call-out>
cURL comes standard on Mac operating systems.
</call-out>
## How to add a Subuser via the SendGrid API and curl
### Creating the Subuser
1. **Create Subuser** - Creating the actual account, the profile, username, password, and the keys you want on the account.
```bash
curl -X POST -H "Authorization: Basic XXXXXXXXXXXXXX" -H "Content-Type: application/json" -d '{
"username": “examplecurltesting",
"email": "example@example.com",
"password": “PASSWORD",
"ips": [
"167.89.38.39",
"198.37.152.144"
]
}' 'https://api.sendgrid.com/v3/subusers'
```
The successful Response looks like this:
```bash
=> 2xx
{"username”:”examplecurltesting","user_id":1868534,"email”:”example@example.com","signup_session_token":"","authorization_token":"","credit_allocation":{"type":"unlimited"}}
```
2. **GET Subusers** (optional step to confirm POST):
```bash
curl -X GET -H "Authorization: Basic XXXXXXXXXXXXXX" -H "Content-Type: application/json" 'https://api.sendgrid.com/v3/subusers'
```
Response:
```bash
[{"disabled":false,"email":"example@example.com","id":1762958,"username":"exampletestingv3subuserapi"},{"disabled":false,"email":"example@testsite.com","id":1766771,"username":"examplesubuser-UI"},{"disabled":false,"email":"example@testsite.com","id":1803837,"username":"exampleisasubuser"},{"disabled":false,"email":"example@example.com","id":1868534,"username":"examplecurltesting"}]
```
3. **Create API Keys** (optional, depends on integration style): If the application would rather run on API keys than a password, then follow this step:
```bash
curl -X POST -H "Authorization: Basic XXXXXXXXXXXXXXXX" -H "Content-Type: application/json" -d '{"name": “API KEY NAME"}' 'https://api.sendgrid.com/v3/api_keys'
```
or, you can create the key for your Subuser:
```bash
curl -X POST -H "Authorization: Bearer PARENT_APIKEY_HERE"
-H "On-Behalf-Of: examplecurltesting" \
-H "Content-Type: application/json" -d '{"name": “API KEY NAME"}' \
'https://api.sendgrid.com/v3/api_keys'
```
Successful API key implementation Response:
```bash
=> 201 created
{"api_key":"SG.XXXXXXXXXXXXXXXXXXXXXXXXX","api_key_id":"sample_id","name":"new api key","scope_set_id":"00766089-9730-4f16-8191-b8bedc5f57f5"}
```
Once this has been done, the Subuser has been created. From this point on, we’ll cover implementing Click Tracking, Open Tracking, and the Event Webhook for those Subusers.
### Enable/Edit Applications
As of right, now this needs to be done directly through the account in question.
**Click Tracking**
```bash
curl -X PATCH -H "Authorization: Basic XXXXXXXXXXXXXX" -H "Content-Type: application/json" -d '{"enabled": true,"enable_text" : true}' 'https://api.sendgrid.com/v3/tracking_settings/click'
```
Response:
```bash
=> 200 OK
{"enable_text":true,"enabled":true}
```
**Open Tracking**
```bash
curl -X PATCH -H "Authorization: Basic XXXXXXXXXXXXXX" -H "Content-Type: application/json" -d '{"enabled": true}' 'https://api.sendgrid.com/v3/tracking_settings/open'
```
Response:
```bash
=> 200 ok
{"enabled":true}
```
**Event Webhook**
```bash
curl -X PATCH -H "Authorization: Basic XXXXXXXXXXXXXXX" -H "Content-Type: application/json" -d '{"enabled": true,"url":"https://api.keen.io/3.0/projects/526a8a5f05cd660472000012/partners/sendgrid?api_key=081da3fc30ca5b11b1f8b133de7064817b57c86d3261f140dc36243eb6829a100d4c5e38db8dd289194d4e02159bbf7ebad74a1fba1fce7a421a00c7a2f7d0f8ba5ef6ea3cece6345904d79395c35cdeaed221c3a208c897e79dd95da399a1d2d1d3e66768af929aa52d621e5bd296a5","group_resubscribe": true,"delivered": true,"group_unsubscribe": true,"bounce": true,"deferred": true,"unsubscribe": true,"processed": true,"open": true,"click": true,"dropped": true}' 'https://api.sendgrid.com/v3/user/webhooks/event/settings'
```
Response:
```bash
=> 200 ok
{
"bounce": true,
"click": true,
"deferred": true,
"delivered": true,
"dropped": true,
"enabled": true,
"group_resubscribe": true,
"group_unsubscribe": true,
"open": true,
"processed": true,
"spam_report": false,
"unsubscribe": true,
"url": "https://api.keen.io/3.0/projects/526a8a5f05cd660472000012/partners/sendgrid?api_key=081da3fc30ca5b11b1f8b133de7064817b57c86d3261f140dc36243eb6829a100d4c5e38db8dd289194d4e02159bbf7ebad74a1fba1fce7a421a00c7a2f7d0f8ba5ef6ea3cece6345904d79395c35cdeaed221c3a208c897e79dd95da399a1d2d1d3e66768af929aa52d621e5bd296a5"}
```
### Domain Authentication for the Subuser
Now we are going to setup Domain Authentication for the Subusers created above. This process involves creating the parent Domain Authentication and then associating it with your Subusers:
1. **Create Domain Authentication**
```bash
curl -X POST -H "Authorization: Basic XXXXXXXXXXXXXXXXXXXXX" -H "Content-Type: application/json" -d '{
"domain": "example.com",
"subdomain": "subdomain",
"ips": [
"167.89.38.39",
"198.37.152.144"
],
"default": true,
"automatic_security": true
}' 'https://api.sendgrid.com/v3/whitelabel/domains'
```
Response:
```bash
=> 2xx
{"id":50784,"user_id":624781,"subdomain":"subdomain","domain":"example.com","username":"examplecurltesting","ips":["167.89.38.39","198.37.152.144"],"custom_spf":false,"default":true,"legacy":false,"automatic_security":true,"valid":false,
"dns":{"mail_cname":{"valid":false,"type":"cname","host":"subdomain.example.com","data":"u624781.wl.sendgrid.net"},"dkim1":{"valid":false,"type":"cname","host":"s1._domainkey.example.com","data":"s1.domainkey.u624781.wl.sendgrid.net"},"dkim2":{"valid":false,"type":"cname","host":"s2._domainkey.example.com","data":"s2.domainkey.u624781.wl.sendgrid.net"},"spf":{"valid":false,"type":"txt","host":"example.com","data":"v=spf1 include:u624781.wl.sendgrid.net -all"}}}
{
"id": 50784,
"user_id": 624781,
"subdomain": "subdomain",
"domain": "example.com",
"username": "examplecurltesting",
"ips": [
"167.89.38.39",
"198.37.152.144"
],
"custom_spf": false,
"default": true,
"legacy": false,
"automatic_security": true,
"valid": false,
"dns": {
"mail_cname": {
"valid": false,
"type": "cname",
"host": "subdomain.example.com",
"data": "u624781.wl.sendgrid.net"
},
"dkim1": {
"valid": false,
"type": "cname",
"host": "s1._domainkey.example.com",
"data": "s1.domainkey.u624781.wl.sendgrid.net"
},
"dkim2": {
"valid": false,
"type": "cname",
"host": "s2._domainkey.example.com",
"data": "s2.domainkey.u624781.wl.sendgrid.net"
},
"spf": {
"valid": false,
"type": "txt",
"host": "example.com",
"data": "v=spf1 include:u624781.wl.sendgrid.net -all"
}
}
```
You will want to look for the Domain Authentication ID here (in this example, the ID is ```"id": 50784```), as this will be used in the next calls to append this ID to the Subusers. Also, the records needed to validate this Domain Authentication will be passed back in the response.
2. **Create Reverse DNS**
```bash
curl -X POST -H "Authorization: Basic XXXXXXXXXXXXXXX" -H "Content-Type: application/json” -d '{"ip": "167.89.66.50",
"subdomain": "email",
"domain": "example.com"}' 'https://api.sendgrid.com/v3/whitelabel/ips'
```
Successful Response:
```bash
=> 2xx
{
"id": 11887,
"ip": "167.89.66.50",
"rdns": "o4.email.example.com",
"users": [],
"subdomain": "email",
"domain": "example.com",
"a_record": {
"valid": false,
"type": "a",
"host": "o4.email.example.com",
"data": "167.89.66.50"
},
"valid": false,
"legacy": false
}
```
3. **Create Link Branding**
```bash
curl -X POST -H "Authorization: Basic XXXXXXXXXXXXXX" -H "Content-Type: application/json" -d '{
"domain": "example.com",
"subdomain": "links",
"default": true
}' 'https://api.sendgrid.com/v3/whitelabel/links'
```
Response:
```bash
=> 2xx
{
"id": 42371,
"user_id": 624781,
"domain": "example.com",
"subdomain": "links",
"username": "examplecurltesting",
"valid": false,
"default": true,
"legacy": false,
"dns": {
"domain_cname": {
"valid": false,
"type": "cname",
"host": "links.example.com",
"data": "sendgrid.net"
},
"owner_cname": {
"valid": false,
"type": "cname",
"host": "624781.example.com",
"data": "sendgrid.net"
}
}
}
```
After creating DNS records then wait for them to propagate and validate records.
4. **GET all Domain Authentication IDs** - grab the ID to validate and associate to an account.
```bash
curl -X GET -H "Authorization: Basic XXXXXXXXXXXXXXXX" -H "Content-Type: application/json" 'https://api.sendgrid.com/v3/whitelabel/domains'
```
Response:
```bash
= 2xx ok
{
"id": 50784,
"user_id": 624781,
"subdomain": "subdomain",
"domain": "example.com",
"username": "examplecurltesting",
"ips": [
"167.89.38.39",
"198.37.152.144"
],
"custom_spf": false,
"default": true,
"legacy": false,
"automatic_security": true,
"valid": false,
"dns": {
"mail_cname": {
"valid": false,
"type": "cname",
"host": "subdomain.example.com",
"data": "u624781.wl.sendgrid.net"
},
"dkim1": {
"valid": false,
"type": "cname",
"host": "s1._domainkey.example.com",
"data": "s1.domainkey.u624781.wl.sendgrid.net"
},
"dkim2": {
"valid": false,
"type": "cname",
"host": "s2._domainkey.example.com",
"data": "s2.domainkey.u624781.wl.sendgrid.net"
},
"spf": {
"valid": false,
"type": "txt",
"host": "example.com",
"data": "v=spf1 include:u624781.wl.sendgrid.net -all"
}
}
}
```
5. **Validate ID of the Domain Authentication**
Once you have the ID of the Domain Authentication you can Validate it.
```bash
curl -X POST -H "Authorization: Basic XXXXXXXXXXXXXXXX" -H "Content-Type: application/json" 'https://api.sendgrid.com/v3/whitelabel/domains/50784/validate'
````
Response:
```bash
=> 2xx
{ "id”: 50784, "valid": true, "validation_results": { "mail_cname": { "valid": false, "reason": "Expected your MX record to be "mx.sendgrid.net" but found "example.com"." },"dkim1": { "valid": true, "reason": null }, "dkim2": { "valid": true, "reason": null }, "spf": { "valid": true, "reason": null } } }
```
6. **Associate with a Subuser**
Once Validated, you can associate to any Subuser accounts.
```bash
curl -X POST -H "Authorization: Basic XXXXXXXXXXXXXXX" -H "Content-Type: application/json" -d '{
"username": "examplecurltesting"
}' 'https://api.sendgrid.com/v3/whitelabel/domains/50784/subuser'
````
7. **Link Branding**
Follow the same process with Link branding:
```bash
-> GET link ID (ex. 42371)
curl -X GET -H "Authorization: Basic XXXXXXXXXXXXXX" -H "Content-Type: application/json" -'https://api.sendgrid.com/v3/whitelabel/links'
```
Response:
```bash
=> 200 ok
[
{
"id": 203,
"user_id": 624781,
"domain": "example.com",
"subdomain": "links",
"username": "examplecurltesting",
"valid": true,
"default": false,
"legacy": false,
"dns": {
"domain_cname": {
"valid": true,
"type": "cname",
"host": "links.example.com",
"data": "sendgrid.net"
},
"owner_cname": {
"valid": true,
"type": "cname",
"host": "624781.example.com",
"data": "sendgrid.net"
}
}
},
{
"id": 202,
"user_id": 624781,
"domain": "example.org",
"subdomain": "links",
"username": "examplecurltesting",
"valid": true,
"default": false,
"legacy": false,
"dns": {
"domain_cname": {
"valid": true,
"type": "cname",
"host": "links.example.org",
"data": "sendgrid.net"
},
"owner_cname": {
"valid": true,
"type": "cname",
"host": "624781.example.org",
"data": "sendgrid.net"
}
}
},
{
"id": 42371,
"user_id": 624781,
"domain": "example.net",
"subdomain": "links",
"username": "examplecurltesting",
"valid": false,
"default": true,
"legacy": false,
"dns": {
"domain_cname": {
"valid": false,
"type": "cname",
"host": "links.example.net",
"data": "sendgrid.net"
},
"owner_cname": {
"valid": false,
"type": "cname",
"host": "624781.example.net",
"data": "sendgrid.net"
}
}
}
]
```
Validate Link Branding:
```bash
curl -X POST -H "Authorization: Basic XXXXXXXXXXXX" -H "Content-Type: application/json" 'https://api.sendgrid.com/v3/whitelabel/links/203/validate'
```
Response:
```bash
=> 200 ok
{
"id": 203,
"valid": true,
"validation_results": {
"domain_cname": {
"valid": true,
"reason": null
},
"owner_cname": {
"valid": true,
"reason": null
}
}
}
```
Associate Link Branding:
```bash
curl -X POST -H "Authorization: Basic XXXXXXXXXXXX" -H "Content-Type: application/json" -d '{"username": "jane@example.com”}' 'https://api.sendgrid.com/v3/whitelabel/links/{link_id}/subuser'
```
Response:
```bash
=> 201 created
{
"id": 200,
"user_id": 623032,
"domain": "example.com",
"subdomain": "links",
"username": "examplecurltesting",
"valid": false,
"default": false,
"legacy": false,
"dns": {
"domain_cname": {
"valid": false,
"type": "cname",
"host": "links.example.com",
"data": "sendgrid.net"
},
"owner_cname": {
"valid": true,
"type": "cname",
"host": "623032.example.com",
"data": "sendgrid.net"}}}
```
## Next Steps
For more information on SendGrid and where you can go from here, check out these pages:
- [API Reference]({{root_url}}/api-reference/)
- [How to Create a Subuser with the API]({{root_url}}/for-developers/sending-email/how-to-create-a-subuser-with-the-api/)
- [Sender Authentication]({{root_url}}/ui/account-and-settings/how-to-set-up-domain-authentication/)
- [How to Send Email]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/)
================================================
FILE: content/docs/for-developers/sending-email/brite-verify.md
================================================
---
seo:
title: Using SendGrid with BriteVerify
description: Verify your SendGrid email list with Briteverify
keywords: SendGrid email list, SendGrid integrate, Briteverify, Tutorial
title: Using SendGrid with BriteVerify
group: plugins
weight: 90
layout: page
navigation:
show: true
---
## Creating a new API Key
Use BriteVerify to verify your SendGrid list. First, you will need to generate an API Key within SendGrid.
<call-out type="warning">
Once you generate the SendGrid Key, copy the API Key somewhere safe for future reference—this will only be visible once.
</call-out>
<call-out>
We hid API Keys in this tutorial for security purposes.
</call-out>
To get started, open the BriteVerify app and click **Verify New List** and then select **SendGrid**.


The app triggers the prompt to input the SendGrid API key. The app requires this authentication only once to link the 2 applications.

To generate the SendGrid API key, log into your SendGrid account. On the left side of the screen, click **Settings** and then click **API Keys**.

On the API Keys page, click **Create API Key**.

Here you will be able to name your API Key and set up the relevant permissions.
Select **Restricted Access** to customize permissions.

To allow BriteVerify to work with your SendGrid list, make the following changes to your permissions:
- Email Activity – should have “read” access
- Stats – should have “read” access
- Suppressions – should have “full” access
- Marketing Campaigns – should have “full” access

When finished, click **Create & View** to generate your API Key.
<call-out type="warning">
Remember to store this key somewhere safe because you will not be able to retrieve or restore it once you navigate away from this page.
</call-out>

Copy the key then paste it in the textbox in the Briteverify app. Make sure that there are no extra spaces when pasting the key. If you enter the key incorrectly, an error requesting you to review the info displays.

Once you provide the correct API Key, the applications sync, and you may now verify your SendGrid data.
Choose the list you would like to verify and an estimated cost will display.

Risky emails include Unknown and Accept_all category emails. Remove these to prevent diluting a marketing campaign’s overall performance. Enable the radio button to eliminate risky emails from the final list.

Next choose **File** as your Export Destination. Once the verification is complete, BriteVerify transfers the cleaned list directly to your SendGrid account.
Click **Verify List** to begin the verification.

<call-out>
For more information or support, contact [BriteVerify](https://support.briteverify.com/)
</call-out>
================================================
FILE: content/docs/for-developers/sending-email/building-an-x-smtpapi-header.md
================================================
---
seo:
title: Building an X-SMTPAPI Header
description: Learn how to build email content, add recipients and schedule your send.
keywords: SMTP, send email, integrate, building, filters, scheduling, substitution, suppression groups, unique arguments, recipients, X-SMTPAPI
title: Building an X-SMTPAPI Header
group: smtp
weight: 949
layout: page
navigation:
show: true
---
Now that you've [sent a test SMTP email with Telnet]({{root_url}}/for-developers/sending-email/getting-started-smtp/), and [integrated with SendGrid]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/), it's time to build content.
## Getting started building
The Twilio SendGrid SMTP service allows you to pass SendGrid a JSON string with as many SMTP objects as you want. This functionality is made possible by including a header named X-SMTPAPI. This page provides instructions for using the X-SMTPAPI to modify and control your mail send.
### Limitations
The X-SMTPAPI is a powerful way to modify your SMTP messages. However, there are several things to keep in mind when using the header.
- Ensure that you are sending just ONE X-SMTPAPI header per SMTP transaction. For any request received with multiple X-SMTPAPI headers on the same request, Twilio SendGrid will adhere to the first X-SMTPAPI header instance on each request.
- There is a hard limit of 10,000 addresses in a multiple recipient email. However, the best practice is to split large jobs into separate transactions of approximately 1,000 recipients, which allows better processing load distribution. If you have a large number of additional substitutions or sections in the headers, it is best to split the send into even smaller groups.
- When using the X-SMTPAPI header to send to multiple recipients, you cannot use SMTP's standard RCPT TO command to also send to multiple recipients. Doing so can generate duplicate messages to the addresses listed in both the X-SMTPAPI "to" field and the RCPT list. For more information, see [RFC 5321](https://tools.ietf.org/html/rfc5321).
- Ensure that the header is limited to a maximum total line length of 1,000 characters. Failure to do this can cause intermediate Mail Transfer Agents (MTAs) to split the header on non-space boundaries, which causes inserted spaces in the final email. If your email is going through another MTA before reaching SendGrid, it is likely that the other MTA will have an even lower setting for maximum header length and may truncate the header.
- When using the X-SMTPAPI header, if our system encounters a parsing error, the message will be bounced to the address specified in the MAIL FROM portion of the SMTP session. The MAIL FROM address is re-written when we send the email for final delivery, so it is safe to set the MAIL FROM to an address that can receive the bounces and alert you to any errors.
- When sending Unicode characters via the SMTP API, you should escape these characters using the `\u` escape character. For example, the Unicode `á` character will look like this: `\u00E1`.
## Customizing your send (filters)
```json
{
"to": ["example@example.com", "example@example.com"],
"sub": {
"%name%": ["Ben", "Joe"],
"%role%": ["%sellerSection%", "%buyerSection%"]
},
"category": ["Orders"],
"unique_args": {
"orderNumber": "12345",
"eventID": "6789"
},
"filters": {
"footer": {
"settings": {
"enable": 1,
"text/plain": "Thank you for your business"
}
}
},
"send_at": 1409348513
}
```
You can customize the emails you send via SMTP by using different settings (also referred to as [filters](#smtp-filters)).
The X-SMTPAPI header is a JSON-encoded object (key-value pairs) consisting of several sections. Below are examples of JSON strings using each section.
- [Scheduling Your Send](#scheduling-your-send)
- [BCC Behavior](#bcc-behavior)
- [Substitution Tags](#substitution-tags)
- [Suppression Groups](#suppression-groups)
- [Categories](#categories)
- [Unique Arguments](#unique-arguments)
- [SMTP Filters](#smtp-filters)
- [IP Pools](#ip-pools)
### Scheduling Your Send
Schedule your email send time using the `send_at` parameter within your X-SMTPAPI header. Set the value of `send_at` formatted as a [UNIX timestamp](https://en.wikipedia.org/wiki/Unix_time).
```json
{
"send_at": 1409348513
}
```
For more information, see our [scheduling parameters documentation]({{root_url}}/for-developers/sending-email/scheduling-parameters/).
### BCC behavior
It is possible to simulate blind carbon copy (BCC) behavior using SMTP with or without the X-SMTPAPI header. The concept of BCC exists outside of SMTP as defined by [RFC 5321](https://tools.ietf.org/html/rfc5321).
When sending email with SMTP, all recipients are listed using SMTP's RCPT (recipient) command. In addition to the sender, which is set with SMTP's MAIL command, these RCPT addresses can be thought of as part of the message envelope—they instruct sending email servers where to deliver the message. These addresses are not designated as carbon copy (CC), BCC, or another type of recipient—they are all just recipients.
The SMTP DATA command follows the MAIL and RCPT commands in an SMTP transaction. The DATA command allows you to insert message headers, which can be thought of as portions of the email body or the text inside the _envelope_. The DATA command is what allows you to create BCC behavior using SMTP without the X-SMTPAPI.
#### BCC without the X-SMTPAPI header
The following code shows an example of an SMTP transaction with BCC behavior. How this example achieves BCC behavior is explained following the example.
```shell
235 Authentication successful
MAIL FROM:tiramisu@example.com
250 Sender address accepted
RCPT TO:person1@sendgrid.com
250 Recipient address accepted
RCPT TO:person2@sendgrid.com
250 Recipient address accepted
DATA
354 Continue
From: "Tira Misu" <tiramisu@example.com>
To: <person1@sendgrid.com>
Subject: Test message subject
This is the test message body.
.
250 Ok: queued as Yo60h6C5ScGPeP5fUWU3Kw
```
Notice that there are two recipients designated by RCPT commands, "person1@sendgrid.com" and "person2@sendgrid.com." These addresses are both part of the message envelope.
In the DATA command, there is also a "To" header. This header lists only "person1@sendgrid.com." This is where differentiating between the envelop "To" (RCPT TO) and header "To" becomes important. The header "To" set in the DATA command does not tell the sending email server to deliver the message to any address, only the RCPT or envelop "To" does this. The header "To" instead provides recipients with a friendly display of any addresses included in the "To" header.
To achieve BCC behavior, you can deliver a message to a recipient by adding them in a RCPT but omit their address from the header "To". The message will be delivered to each RCPT address, but only the addresses listed in the header "To" will be visible to other recipients.
In the previous code sample, "person2@sendgrid.com" will be treated like a BCC address because that address is not included in the header "To." The "person1@sendgrid.com" is listed in the header "To" and will therefore be visible to other recipients of the message. This means both recipients receive the message, but recipient2@sendgrid.com is not visible to recipient1@sendgrid.com while recipient1@sendgrid.com is visible to recipient2@sendgrid.com.
By omitting any addresses from the header "To," you will be hiding them from the other recipients and therefore treating them like BCC recipients.
#### BCC with the X-SMTPAPI
The following code shows an example of an SMTP transaction with BCC behavior using the X-SMTPAPI header. How this example achieves BCC behavior is explained following the example.
```shell
235 Authentication successful
MAIL FROM:tiramisu@example.com
250 Sender address accepted
RCPT TO:sender@sendgrid.com
250 Recipient address accepted
DATA
354 Continue
x-smtpapi: {"to":["person1@sendgrid.com","person2@sendgrid.com"]}
From: "Tira Misu" <tiramisu@example.com>
Subject: This is a test
Body of test message.
.
250 Ok: queued as uKIPst3rQtCl_hLVB9RvEw
```
Using the X-SMTPAPI header achieves BCC behavior in a slightly different way than by omitting addresses from a "To" header. The X-SMTPAPI header's "to" field allows you to set multiple recipients in a JSON array.
```json
{
"to": ["person1@sendgrid.com", "person2@sendgrid.com"]
}
```
When SendGrid receives the message and parses the X-SMTPAPI header, it will treat each recipient address in the X-SMTPAPI "to" field as a separate RCTP TO or _envelope_ address. This means each recipient will receive the same DATA content, but with an added friendly display "to" header set to its own address. A single recipient in the X-SMTPAPI "to" field in the previous code sample will eventually look something like the following example.
```shell
235 Authentication successful
MAIL FROM:test@example.com
250 Sender address accepted
RCPT TO:person1@sendgrid.com
250 Recipient address accepted
```
The addresses in the X-SMTPAPI "to" field are not duplicated in a header "To," for all recipients. Only the individual recipient is included in the header "To" for each messages (Each recipient sees only their own address). The additional recipients will therefore not be visible to each recipient of the message.
### Substitution Tags
Substitution tags allow you to dynamically insert specific content relevant to each of your recipients, such as their first and last names.
For example, to use a substitution tag to replace the first name of your recipient, insert the tag {{name}} in the HTML of your message:
```html
<html>
<head></head>
<body>
<p>
Hello {{name}},<br />
The body of your email would go here...
</p>
</body>
</html>
```
To define the value that will replace the {{name}} tag, define the following in your X-SMTPAPI header:
```json
{
"to": ["john.doe@example.com", "jan.doe@example.com"],
"sub": {
"{{name}}": ["John", "Jane"]
}
}
```
For more information, see our [substitution tags documentation]({{root_url}}/for-developers/sending-email/substitution-tags/).
### Section Tags
<call-out type="warning">
This feature has been deprecated.
</call-out>
Section tags are similar to substitution tags, but rather than replace tags with content for each recipient; section tags allow you to replace a tag with more generic content— like a salutation.
For more information, see our [section tags documentation]({{root_url}}/for-developers/sending-email/section-tags/).
### Suppression Groups
You can easily specify an unsubscribe group for an email sent via SMTP by including the `asm_group_id` parameter in your X-SMTPAPI header. Simply set the value of `asm_group_id` to the numerical ID of the group you would like to use.
```json
{
"asm_group_id": 1
}
```
For more information, see our [suppression groups documentation]({{root_url}}/for-developers/sending-email/suppressions/).
### Categories
<call-out type="warning">
This information will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.
</call-out>
Categories allow you to track your emails according to broad topics that you define, like "Weekly Newsletter" or "Confirmation Email". Simply define the category by using the `category` parameter within your X-SMTPAPI header:
```json
{
"category": "Example Category"
}
```
For more information, see our [categories documentation]({{root_url}}/for-developers/sending-email/categories/).
<call-out>
Categories should only be used for broad topics. To attach unique identifiers, please use [unique arguments]({{root_url}}/for-developers/sending-email/unique-arguments/).
</call-out>
### Unique Arguments
<call-out type="warning">
This information will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.
</call-out>
Use unique arguments to track your emails based on specific identifiers unique to individual messages. Unique arguments can be retrieved via SendGrid's [Event Webhook]({{root_url}}/for-developers/tracking-events/event/) or your [email activity page]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/).
For more information, see our [unique arguments documentation]({{root_url}}/for-developers/sending-email/unique-arguments/).
### SMTP Filters
SMTP Filters can be used for turning on or off a number of different features for your sending. For example, you can turn on open or click tracking on a per-send basis.
For more information, see our [SMTP Filters documentation]({{root_url}}/for-developers/sending-email/smtp-filters/).
### IP Pools
IP Pools can be used to send you mail over a specific group of IPs. It is common to create different pools for transactional and marketing email.
For more information, see our [IP Pools documentation](https://sendgrid.api-docs.io/v3.0/ip-pools).
```json
{
"ip_pool": "pool_name"
}
```
## Additional Resources
- [How to send email]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/)
- [Getting started with the API]({{root_url}}/api-reference/)
- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/)
- [Getting Started with the SMTP API]({{root_url}}/for-developers/sending-email/getting-started-smtp/)
- [Integrating with SMTP]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/)
================================================
FILE: content/docs/for-developers/sending-email/cakephp.md
================================================
---
layout: page
weight: 0
group: frameworks
title: CakePHP
seo:
title: Send Email with CakePHP & SendGrid
description: View instructions on how to easily send email with CakePHP using SendGrid, by setting up your views and controller.
navigation:
show: true
---
CakePHP comes with an email library that already supports SMTP. [For more information check out the CakePHP documentation page](http://book.cakephp.org/2.0/en/core-utility-libraries/email.html#configuration). This example shows how to send an email with both HTML and text bodies.
In **app/views/layouts/** you need to define the layout of your text and HTML emails:
```
email/
html/
default.ctp
text/
default.ctp
```
In **app/views/layouts/email/text/default.ctp** add:
``` php
<!--?php echo $content_for_layout; ?-->
```
and in **app/views/layouts/email/html/default.ctp** add:
``` php
<!--?php echo $content_for_layout; ?-->
```
Then create the template for your emails. In this example we created templates for a registration email with the following structure:
```
app/
views/
elements/
email/
text/
registration.ctp
html/
registration.ctp
```
In **app/views/elements/email/text/registration.ctp** add:
``` php
Dear <!--?php echo $name ?-->,
Thank you for registering. Please go to http://domain.com to finish your registration.
```
and in **app/views/layouts/email/html/default.ctp** add:
``` php
Dear <!--?php echo $name ?-->,
Thank you for registering. Please go to <a href="http://domain.com">here</a> to finish your registration.
```
In your controller enable the email component:
``` php
<!--?php var $components = array('Email'); ?-->
```
Then anywhere in your controller you can do something like the following to send an email:
(make sure to replace your own sendgrid_username / sendgrid_api_key details, better to make them constant)
``` php
<?php
$this->Email->smtpOptions = array(
'port'=>'587',
'timeout'=>'30',
'host' => 'smtp.sendgrid.net',
'username'=>'sendgrid_username',
'api_key'=>'sendgrid_api_key',
'client' => 'yourdomain.com'
);
$this->Email->delivery = 'smtp';
$this->Email->from = 'Your Name ';
$this->Email->to = 'Recipient Name ';
$this->set('name', 'Recipient Name');
$this->Email->subject = 'This is a subject';
$this->Email->template = 'registration';
$this->Email->sendAs = 'both';
$this->Email->send();
?>
```
================================================
FILE: content/docs/for-developers/sending-email/categories.md
================================================
---
layout: page
weight: 0
title: Categories
group: x-smtpapi
navigation:
show: true
---
<call-out type="warning">
This information will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.
</call-out>
You can add [categories]({{root_url}}/glossary/categories/) to the X-SMTPAPI header of the emails you send via SendGrid. This will allow you to track emails based on your own categorization system.
<call-out type="warning">
Categories must be in 7bit encoding using the US-ASCII character set.
</call-out>
<call-out>
Currently, there is no limit to the number of categories you can track. However, we recommend _no more than ~100 total unique categories_ as this will increase your ease of use in the Statistics area. Additionally, a high rate of unique categories on your account can negatively impact the rate at which we process the messages you send.
</call-out>
## Example
You can use SendGrid's [SMTP API]({{root_url}}/for-developers/sending-email/getting-started-smtp/) to add these categories to your email. The following should be added to the email's header:
<call-out type="warning">
When passing `category` please make sure to only use strings as shown in our examples. Any other type could result in unintended behavior.
</call-out>
### Example Category Header
```json
{
"category": "Example Category"
}
```
In this example, SendGrid would associate statistics for the email containing that header with the category **Example Category**.
## Limitations
You can assign up to 10 categories per message:
```json
{
"category": ["dogs", "animals", "pets", "mammals"]
}
```
<call-out type="warning">
Categories should be used to group messages together by broad topic. If you need to attach unique data or identifiers to a message, use [Unique Arguments]({{root_url}}/for-developers/sending-email/unique-arguments/) instead.
</call-out>
================================================
FILE: content/docs/for-developers/sending-email/cloud-rail.md
================================================
---
layout: page
weight: 0
title: Using CloudRail to integrate SendGrid into your application
group: plugins
navigation:
show: true
---
CloudRail is an API integration platform that has a set of free software libraries which abstract multiple external APIs from different providers, SendGrid among them, into a single and universal interface.
This makes it easy to integrate many of them in your application.
Abstract means that, for example, upload() works in exactly the same way for Dropbox as it does for Google Drive, OneDrive, and other Cloud Storage Services, and getEmail() works similarly the same way across all social networks.
In this tutorial, the integration of the Android SDK into an application is demonstrated with Android Java code.
Gradle is used as the build tool (Android Studio standard).
Head to the [Website](https://cloudrail.com/) for all the details about CloudRail and instructions for other platforms.
## Setup
The easiest way to integrate CloudRail for Android is via Maven.
It suffices to add the following to your build.gradle:
```java
dependencies {
compile 'com.cloudrail:cloudrail-si-android:2.6.5'
}
```
## Send a simple email
After setup, sending an email with SendGrid is a breeze.
Just add code like the one below:
```java
final Email email = new SendGrid(this, "[API key]");
new Thread() {
public void run() {
email.sendEmail(
"[senderEmail]",
"[senderName]",
Arrays.asList("[toEmail]"),
"I'm the subject",
"I'm a text body",
"<p>I'm an HTML body</p>",
Arrays.asList("[ccAddress0]", "[ccAddress1]"),
Arrays.asList("[bccAddress]")
);
}
}.start();
```
## Send a personalized email
Since you've already integrated CloudRail SI, why not make use of some of the other APIs that come with it?
Let's use Facebook to get a user's info to personalize the email:
```java
final Email email = new SendGrid(this, "[API key]");
final Profile profile = new Facebook(this, "[Client ID]", "[Client Secret]");
new Thread() {
public void run() {
String userFullName = profile.getFullName(); // Implicitly triggers login
String userEmail = profile.getEmail();
email.sendEmail(
"[senderEmail]",
"[senderName]",
Arrays.asList(userEmail),
"Hello " + userFullName + ", I'm the subject",
"I'm a text body",
"<p>I'm an HTML body</p>",
Arrays.asList("[ccAddress0]", "[ccAddress1]"),
Arrays.asList("[bccAddress]")
);
}
}.start();
```
The code above assumes that "this" points to a Context (an Activity, for example, is a Context) and that you are registered as a developer with the services used (and thus possess the needed credentials).
You can find more information about the functionalities and the services in the [Documentation](https://github.com/CloudRail/cloudrail-si-android-sdk/wiki).
================================================
FILE: content/docs/for-developers/sending-email/codeigniter.md
================================================
---
layout: page
weight: 0
group: frameworks
title: CodeIgniter
seo:
title: Send Email with CodeIgniter & SendGrid
description: View instructions on how to easily send email with CodeIgniter using SendGrid, by setting up setting up CodeIgniter's built in mail library.
navigation:
show: true
---
CodeIgniter comes with an email sending library built in. See more information on how to [use CodeIgniter with SendGrid](https://www.codeigniter.com/user_guide/libraries/email.html#using-the-email-library).
<call-out>
It is important to use the correct end of lines using "crlf" =\> "\\r\\n" and "newline" =\> "\\r\\n".
</call-out>
``` php
<?php
$this->load->library('email');
$this->email->initialize(array(
'protocol' => 'smtp',
'smtp_host' => 'smtp.sendgrid.net',
'smtp_user' => 'apikey',
'smtp_pass' => 'sendgridapikey',
'smtp_port' => 587,
'crlf' => "\r\n",
'newline' => "\r\n"
));
$this->email->from('your@example.com', 'Your Name');
$this->email->to('someoneexampexample@example.com');
$this->email->cc('another@another-example.com');
$this->email->bcc('them@their-example.com');
$this->email->subject('Email Test');
$this->email->message('Testing the email class.');
$this->email->send();
echo $this->email->print_debugger();
?>
```
================================================
FILE: content/docs/for-developers/sending-email/cors.md
================================================
---
layout: page
weight: 0
title: Cross Origin Resource Sharing (CORS)
group: api-v3
navigation:
show: true
seo:
title: Cross Origin Resource Sharing (CORS)
description: CORS is a security feature of modern browsers to keep browser users secure.
keywords: API, API Key, CORS, cross origin resource sharing
---
Cross-Origin Resource Sharing is a security feature of modern browsers that keeps browser users secure. It prevents malicious activity like cross-site scripting.
CORS implements headers in the response of any request to the server to say what domains are allowed to make specific types of calls to that server. In SendGrid's case, we do not allow our customers to make a browser-based call to our v3/mail/send endpoint.
## Browser-Only Applications
When you have a browser-only application that reaches out to APIs, the API key has to be embedded in the application. Anyone with access to a browser-only application can access all of the Javascript source code, including your API keys.
Making your API key publicly accessible could result in anyone authenticating API calls with your API key — this is a significant security concern both for you and SendGrid.
## Workarounds
You can create a server-based application, which will protect your API keys from being released to the world. Languages like [NodeJS](https://github.com/sendgrid/sendgrid-nodejs), [PHP](https://github.com/sendgrid/sendgrid-php), [Ruby](https://github.com/sendgrid/sendgrid-ruby), [Python](https://github.com/sendgrid/sendgrid-python), [C#](https://github.com/sendgrid/sendgrid-csharp), [Go](https://github.com/sendgrid/sendgrid-go), and [Java](https://github.com/sendgrid/sendgrid-java), and others can be implemented to make calls to the API from the security of a locked down server environment.
================================================
FILE: content/docs/for-developers/sending-email/curl-examples.md
================================================
---
seo:
title: cURL Examples for Common Use Cases
description:
keywords: cURL, v3 mail send
title: cURL Examples for Common Use Cases
group: api-v3
weight: 0
layout: page
navigation:
show: true
---
Below are some cURL examples for several basic use cases to get you sending email through SendGrid's v3 Mail Send endpoint right away!
## Hello, World!
```bash
curl --request POST \
--url https://api.sendgrid.com/v3/mail/send \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"personalizations": [{"to": [{"email": "recipient@example.com"}]}],"from": {"email": "sendeexampexample@example.com"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}'
```
## Sending a Basic Email to Multiple Recipients
```bash
curl --request POST \
--url https://api.sendgrid.com/v3/mail/send \
--header 'authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"personalizations": [{"to": [{"email": "recipient@example.com"}],"cc": [{"email":"recipient2@example.com"}, {"email": "recipient3@example.com"}, {"email":"recipient4@example.com"}]}], "from": {"email": "sendeexampexample@example.com"},"subject":"Hello, World!", "content": [{"type": "text/plain", "value": "Heya!"}]}'
```
## Sending a Basic Email Using a Template
```bash
curl --request POST \
--url https://api.sendgrid.com/v3/mail/send \
--header 'authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"personalizations": [{"to": [{"email": "recipient@example.com"}]}],"from": {"email": "sendeexampexample@example.com"},"subject":"Hello, World!","content": [{"type": "text/plain","value": "Heya!"}], "template_id" : "YOUR_TEMPLATE_ID"}'
```
## Sending a Basic Email with Attachment
```bash
curl --request POST \
--url https://api.sendgrid.com/v3/mail/send \
--header 'authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"personalizations": [{"to": [{"email": "recipient@example.com"}]}],"from": {"email": "sender@example.com"},"subject":"Hello, World!","content": [{"type": "text/html","value": "Hey,<br>Please find attachment."}], "attachments": [{"content": "BASE64_ENCODED_CONTENT", "type": "text/plain", "filename": "attachment.txt"}]}'
```
## Sending a Basic Email at a Scheduled Time
```bash
curl --request POST \
--url https://api.sendgrid.com/v3/mail/send \
--header 'authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"personalizations": [{"to": [{"email": "recipient@example.com"}]}],"from": {"email": "sendeexampexample@example.com"},"subject":"Hello, World!","content": [{"type": "text/plain","value": "Heya!"}], "send_at" : UNIX_TIMESTAMP_HERE}'
```
## Scheduling and Cancelling an Email
You may schedule an email to be sent up to 72 hours in the future by using the `send_at` parameter. You may cancel this same scheduled email by using the [Cancel Scheduled Sends endpoint](https://sendgrid.api-docs.io/v3.0/cancel-scheduled-sends).
**Step 1: Generate a batch ID**
```bash
curl --request POST \
--url https://api.sendgrid.com/v3/mail/batch \
--header 'authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
```
**Step 2: Schedule the email to be sent, using your new batch ID**
```bash
curl --request POST \
--url https://api.sendgrid.com/v3/mail/send \
--header 'authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"personalizations": [{"to": [{"email": "recipient@example.com"}]}],"from": {"email": "sendeexampexample@example.com"},"subject":"Hello, World!","content": [{"type": "text/plain","value": "Heya!"}], "send_at" : UNIX_TIMESTAMP_HERE, "batch_id" : "YOUR_BATCH_ID"}'
```
**Step 3: Cancel the scheduled email**
```bash
curl --request POST \
--url https://api.sendgrid.com/v3/user/scheduled_sends \
--header 'authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"batch_id":"YOUR_BATCH_ID","status":"cancel"}'
```
================================================
FILE: content/docs/for-developers/sending-email/django.md
================================================
---
layout: page
weight: 0
group: frameworks
title: Django
seo:
title: Send SMTP Email with Django
description: View instructions on how to easily send email with Django using SendGrid, by setting up setting up Django's built in mail library.
navigation:
show: true
---
There is more detailed information about sending email over SMTP with Django on the [Django project website](https://docs.djangoproject.com/en/dev/topics/email/).
First start by adding the following to **settings.py:**
```python
SENDGRID_API_KEY = os.getenv('SENDGRID_API_KEY')
EMAIL_HOST = 'smtp.sendgrid.net'
EMAIL_HOST_USER = 'apikey' # this is exactly the value 'apikey'
EMAIL_HOST_PASSWORD = SENDGRID_API_KEY
EMAIL_PORT = 587
EMAIL_USE_TLS = True
```
Then to send email you can do the following:
Inside yourapp.views.py
```python
from django.core.mail import send_mail
send_mail('Subject here', 'Here is the message.', 'from@example.com', ['to@example.com'], fail_silently=False)
```
<call-out>
You may also send emails with Django by using the [django-sendgrid-v5](https://github.com/sklarsa/django-sendgrid-v5) library, which utilizes the [Web API](https://sendgrid.api-docs.io/v3.0/mail-send/v3-mail-send) instead of SMTP as the transport mechanism.
</call-out>
================================================
FILE: content/docs/for-developers/sending-email/drupal.md
================================================
---
layout: page
weight: 0
title: Drupal
group: plugins
navigation:
show: true
---
To send emails from Drupal using SendGrid, you may use the SendGrid Integration module, the SMTP Authentication Support module, the Swift Mailer module, or the PHPMailer SMTP Module depending on your needs.
## Using the SendGrid Integration Module
The SendGrid Integration Module uses the SendGrid API web services to send email. It does not use SMTP. Depending on the workload of your website, this could be of benefit to you in performance. This module also provides charts for reports of vital statistics. The module does require an advanced knowledge of Drupal in order to install and setup. Usage of Drush is required.
Download and install the [SendGrid Integration Module](https://www.drupal.org/project/sendgrid_integration "SendGrid Integration Module") from Drupal.org and perform updates via Drush with Composer Manager.
Once installed access `admin/config/services/sendgrid` to configure your API credentials.
For detailed instructions, please refer to the [module documentation](http://cgit.drupalcode.org/sendgrid_integration/tree/README.md).
## Using the SMTP Authentication Support Module
To use SendGrid with [Drupal](https://www.drupal.org/ "Drupal"), use the [SMTP Authentication Support module](https://www.drupal.org/project/smtp "SMTP Authentication Support"). Install a version of this module that is compatible with your version of Drupal.

Open your modules page, find the SMTP module, and configure it with the following settings:
- **SMTP Server** - smtp.sendgrid.net
- **SMTP Port** - 587
- **Use Encrypted Protocol** - No. If you want encryption choose "Use SSL" and set SMTP Port to 465
- **Username** - SendGrid Username: "apikey"
- **Password** - SendGrid API Key

## Using the Swift Mailer Module
To use the [Swift Mailer module](https://www.drupal.org/project/swiftmailer "Swift Mailer Module"), install a version of this module that is compatible with your version of Drupal.
Configuration for this module is largely the same as above.

## Using the PHPMailer SMTP Module
PHPMailer SMTP sends email via SMTP using the latest PHPMailer library and is RFC-compliant. It requires the [Mail System](https://www.drupal.org/project/mailsystem "Mail System") module. See the [project page](https://www.drupal.org/project/phpmailer_smtp "PHPMailer SMTP") for more details.
Install using composer and enable.
`composer require drupal/phpmailer_smtp`
Once installed access `admin/config/system/phpmailer-smtp` to configure the module.
- **Primary SMTP server** - smtp.sendgrid.net
- **SMTP port** - 587
- **Use Secure Protocol** - TLS
Under **SMTP Authentication**, set your username and password (API key):
- **Username** - SendGrid Username: "apikey"
- **Password** - SendGrid API Key
================================================
FILE: content/docs/for-developers/sending-email/enforced-tls.md
================================================
---
layout: page
weight: 0
title: Enforced TLS
group: sending-email
navigation:
show: true
---
The Enforced TLS settings specify whether or not the recipient is required to support TLS or have a valid certificate. The Enforced TLS endpoint supports retrieving and updating TLS settings.
<call-out type="warning">
If either `require_tls` or `require_valid_cert` is set to `true`, the recipient must support TLS 1.1 or higher or have a valid certificate. If these conditions are not met, we drop the message and send a block event with “TLS required but not supported” as the description.
</call-out>
## GET
Get the current Enforced TLS settings.
#### Request URL
`GET https://api.sendgrid.com/v3/user/settings/enforced_tls HTTP/1.1`
#### Response
```javascript
HTTP/1.1 200
{
"require_tls": true,
"require_valid_cert": false
}
```
## PATCH
Change the Enforced TLS settings
<table class="table" style="table-layout:fixed">
<thead>
<tr>
<th>
URI Parameter
</th>
<th>
Required
</th>
<th>
Requirements
</th>
<th>
Description
</th>
</tr>
<tr>
<td>
require_tls
</td>
<td>
False
</td>
<td>
true or false
</td>
<td>
Require recipient TLS support
</td>
</tr>
<tr>
<td>
require_valid_cert
</td>
<td>
False
</td>
<td>
true or false
</td>
<td>
Require certificates to be valid
</td>
</tr>
</thead>
</table>
#### Request URL
`PATCH https://api.sendgrid.com/v3/user/settings/enforced_tls HTTP/1.1`
#### Request Body
```javascript
{
"require_tls": true
}
```
#### Response
```javascript
HTTP/1.1 200
{
"require_tls": true,
"require_valid_cert": false
}
```
================================================
FILE: content/docs/for-developers/sending-email/exchange-2010.md
================================================
---
layout: page
weight: 0
title: Exchange 2010
group: mail-servers
navigation:
show: true
---
If your organization is using Microsoft's Exchange 2010 for email services, this document outlines the basics required in order to use SendGrid for SMTP. This requires the configuration of a send connector in the Exchange Management Console.
<call-out type="warning">
This documentation assumes that you already have a working installation of Exchange 2010 that is configured for client access and is able to send messages to the public internet. **If you do not configure this connector correctly it may result in the unintended delivery of messages through your SendGrid account, resulting in the consumption of account emails.**
</call-out>
<call-out>
[For more information regarding Send Connectors, check out this swank TechNet documentation on the subject](http://technet.microsoft.com/en-us/library/aa998662.aspx).
</call-out>
The configuration of a new send connector is straightforward. It is the associated configurations that you may require in order to properly control access to the connector that may be complicated. Let's start with just sending email through SendGrid:
1. Log in to your Exchange server or a server that has the Exchange Management Console installed for administrative purposes.
2. Go to **Start \> All Programs \> Microsoft Exchange Server 2010** and click on the **Exchange Management Console** item.
3. Roll open the **Organization Configuration** list and select **Hub Transport**.
4. Click on **New Send Connector** in the Actions sidebar.
5. Name the Send Connector whatever you like and select Internet for the Intended Use pull-down. This allows for the integration with an authenticated SmartHost and adds the default send permissions required by Exchange 2010 to route messages through an external host that is not a part of the domain forest.
6. Click **Next**.
7. Click Add and specify the allowed address space to which the connector can send messages. If you want to send to anyone on the internet, then you would insert a "\*" in the Address field. If you want to send only to a specific domain, enter that domain. If you want to allow all sub-domains you can check the box, but I prefer to notate that literally like so: \*.SAMPLEDOMAIN.COM. Insert a high cost (100 is the top, so choose wisely) so that the connector is not used inadvertently.
8. Click **Next**.
9. On the Network Settings page, select the **Route mail through the following smart hosts** item.
10. Click **Add**.
11. Select the **Fully qualified domain name (FQDN)** item, and enter: *smtp.sendgrid.net*
12. Click **Next**.
13. In the **Configure smart host authentication settings** page, select the **Basic Authentication** option and check the **Basic Authentication over TLS** checkbox.
14. Enter `apikey` as your username and your SendGrid [API key]({{root_url}}/ui/account-and-settings/api-keys/) as the password to authenticate.
15. Click **Next**.
15. If you only have one Exchange server, it should automatically appear. If you want to use another server(s) in your domain click Add to locate the servers you want to allocate to this connector.
16. Click **Next**.
17. Verify your settings and, when satisfied, click **New**.
18. If the configuration completes correctly, you will receive positive notification. You can then click on **Finish**.
Once you have completed installation of the connector, you will need to configure your server(s) to allow limited access to the new send connector. You can read more about [Send Connector permissions][send-connector-permissions].
[send-connector-permissions]: https://docs.microsoft.com/en-us/previous-versions/office/exchange-server-2010/aa998662(v=exchg.141)#send-connector-permissions
================================================
FILE: content/docs/for-developers/sending-email/exim.md
================================================
---
layout: page
weight: 0
title: Exim 4
group: mail-servers
navigation:
show: true
seo:
title: Exim 4 configuration for SendGrid
keywords: Exim Internet Mailer, Exim, Exim, and SendGrid
description: Configuration information for Exim 4 and SendGrid.
---
<call-out type="warning">
Versions of Exim prior to the current major release are considered obsolete. If you are using Exim 3.x or earlier it is suggested by the Exim development team that you upgrade to the current release.
</call-out>
The following configuration file, which can be found at **/etc/exim4/update-exim4.conf.conf**, was pulled from Ubuntu Server 10.4 and is for example purposes only:
```bash
dc_eximconfig_configtype='smarthost'
dc_other_hostnames=''
dc_local_interfaces='127.0.0.1'
dc_readhost='your.server.name'
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets=''
dc_smarthost='smtp.sendgrid.net::587'
CFILEMODE='644'
dc_use_split_config='false'
dc_hide_mailname='true'
dc_mailname_in_oh='true'
```
Enable TLS support in **/etc/exim4/exim4.conf.localmacros**.
<call-out>
If this file does not exist, you will need to create it:
</call-out>
```bash
MAIN_TLS_ENABLE = 1
```
Enter credentials that will allow Exim to access SendGrid in **/etc/exim4/passwd.client**:
<call-out>
Note that you must use an API key to authenticate. Do this by setting your username to 'apikey' and your password to your API key's actual value (the string provided by Twilio SendGrid when you created the key).
</call-out>
```bash
*:apikey:<YourAPIKey>
```
Once you have completed and saved all changes to Exim's configuration files, you will need to restart it to activate those changes:
```bash
$ /etc/init.d/exim4 restart
```
## cPanel
If you are using cPanel with Exim and want to relay your email through SendGrid, go to **Main \> Service Configuration \> Exim Configuration Editor**, click on the Advanced Editor button, and enter the following in the **AUTH** Box:
```bash
begin authenticators
sendgrid_login:
driver = plaintext
public_name = LOGIN
client_send = : apikey : <YourAPIKey>
```
<call-out>
Only include "begin authenticators" if it's not already in the configuration.
</call-out>
Add a route in the **Router Configuration** Box:
```bash
send_via_sendgrid:
driver = manualroute
domains = ! +local_domains
transport = sendgrid_smtp
route_list = "* smtp.sendgrid.net::587 byname"
host_find_failed = defer
no_more
```
Add a transport to the **Transport Configuration** Box:
```bash
sendgrid_smtp:
driver = smtp
hosts = smtp.sendgrid.net
hosts_require_auth = <; $host_address
hosts_require_tls = <; $host_address
```
Once you have completed and saved all changes to Exim's configuration files, you will need to restart it to activate those changes:
```bash
$ /etc/init.d/exim4 restart
```
## Exim Documentation
If your version of Exim does not match the version above or you are not finding the answer you need, please check out the Official [Exim Documentation](http://www.exim.org/docs.html) for more information.
================================================
FILE: content/docs/for-developers/sending-email/formio.md
================================================
---
seo:
title: Form.io Integration
description: How to integrate Form.io with SendGrid.
keywords: Form.io, integrate
title: Building Serverless Apps with Form.io + SendGrid
group: partners
weight: 100
layout: page
navigation:
show: true
---
[Form.io](https://form.io) is a combined form and data management API platform created for developers who are building "Serverless" form-based applications. Form.io provides an easy drag-and-drop form builder workflow, allowing you to build complex forms for enterprise applications quickly and easily. These forms are then embedded directly into your application with a single line of code that dynamically renders the form (using Angular or React) in your app while at the same time generating the RESTful API to support those forms. The Form.io platform also offers numerous 3rd-party services that are fully integrated into the form building process, allowing you to extend the power and capability of your apps while saving time and effort.
Form.io has recently announced the integration of SendGrid’s API into their list of standard “Form Actions”, allowing you to extend your SendGrid email capabilities further into your apps by automatically triggering emails through your SendGrid account when forms are submitted within your application.

This step-by-step guide will show how to set up a SendGrid integration within the Form.io platform.
## Create your first Form.io project
To get started, you will first need to create an account at [Form.io](https://portal.form.io). Once you have an account, you can quickly bootstrap an already working application by clicking on one of the provided templates on the home screen. These are not simple form templates, but rather fully functional applications complete with Data Resources, Forms, Actions, and User Roles/Permissions. For more on how these items function within Form.io, feel free to read through our [User Guide](https://help.form.io/userguide/) or view our [Video Tutorials](https://help.form.io/tutorials/videos/#welcome).

Once you have a project created, you can now view the project live within the Preview tab of the project portal.
## Configure your project
Once you have a Form.io project, the next step is to create an **API Key** within your SendGrid account (under **Settings | API Keys**). Ensure that the API Key you create has **Full Access** for the **Mail Send** permission. Once you have your API Key, go back to your Form.io project and follow these steps.
1. Click the **Project Settings** button located at the top right of your screen.
1. Click the **Email Providers** tab on the left and then the **SendGrid Settings** tab.
1. Input the *SendGrid API Key* provided to you when the API key was created.
1. **Save** your settings.

## Adding an email action
Now that you have your project configured to send emails through SendGrid, the next step is to add an email action to any form within your project. A good use case for this would be to send an email anytime someone registers for your application. To achieve this capability, please follow the following steps.
1. Click on the **Resources** tab within your project.
1. Next, click on the **Actions** button on the **User** resource.
1. Now select the **Email** action, and then press the **+ Add Action** button.

4. Now on the email settings page, select **SendGrid** for the **Transport** of the action.
5. Input a **From** email address you would like to send the email from.
1. Input a **To** email address you would like to send the email to. For this, you can use handlebar notation, such as ```{{ data.user }}```, to access the data from the submission as you see in the following image.
1. Input a **Subject** for the message being sent.
1. Input a **Message** for the message being sent.

9. **Save** the action.
With this step complete, every user who registers for this application will receive your email which was sent through the SendGrid platform.
## Deploy your serverless application!
Now that your project is configured for SendGrid, you can deploy it in a number of different ways including [GitHub Pages](https://pages.github.com/), [Apache Cordova](https://cordova.apache.org/), [Electron](http://electron.atom.io/), etc. You can also preview your application by clicking on the Preview tab of your project. Since this application is "serverless" it can be hosted in a wide range of places and immediately connect your forms with SendGrid!

If you have any questions on the Form.io integration, please feel free to [Contact Form.io Support](https://form.io/#contact).
Thanks and enjoy **SendGrid** and **Form.io**!
================================================
FILE: content/docs/for-developers/sending-email/getting-started-email-activity-api.md
================================================
---
seo:
title: Getting Started with the Email Activity Feed API
description: Use the Email Activity Feed query language to get started with the Email Activity Feed API.
keywords: email activity, query language, email stats, email events
title: Getting Started with the Email Activity Feed API
group: sending-email
weight: 0
layout: page
navigation:
show: true
---
<call-out>
In order to gain access to the Email Activity Feed API, you must purchase [additional email activity history](https://app.sendgrid.com/settings/billing/addons/email_activity).
</call-out>
The API gives you access to query all of your stored messages, to query individual messages, and to download a CSV with data about the stored messages.
## Getting started
Start with this basic query to the Email Activity Feed API (replace `<<your API key>>` with an API key from your account):
```bash
curl --request GET \
--url 'https://api.sendgrid.com/v3/messages?limit=10' \
--header 'authorization: Bearer <<your API key>>'
```
This returns a list of the 10 most recent emails you've sent. Next, check out some of the common use cases to narrow down your search.
### Encoding queries
All queries need to be [URL encoded](https://meyerweb.com/eric/tools/dencoder/) and have this format:
`query={query_type}="{query_content}"`
Encoded, this query would look like this:
`query=query_type%3D%22query_content%22`
## Queries for common use cases
Here are some queries for common use cases. For a full list of possible query types, see the [query reference](#query-reference).
### Filter by subject
Use this query to filter by email subject (replace `<<your API key>>` with an API key from your account, and replace <<subject>> with the subject you want to search):
```bash
curl --request GET \
--url 'https://api.sendgrid.com/v3/messages?limit=10&query=subject%3D<<subject>>' \
--header 'authorization: Bearer <<your API key>>'
```
Subject queries have this format:
`subject="This is a subject test"`
Encoded, this query would look like this:
`subject%3D%22This%20is%20a%20subject%20test%22`
### Filter by recipient email
Use this query to filter by a recipient's email: (replace `<<your API key>>` with an API key from your account, and replace <<email>> with the URL encoded recipients email):
```bash
curl --request GET \
--url 'https://api.sendgrid.com/v3/messages?limit=10&query=to_email%3D%22<<email>>%22' \
--header 'authorization: Bearer <<your API key>>'
```
Recipient email queries have this format:
`to_email="example@example.com"`
Encoded, this query would look like this:
`to_email%3D%22example%40example.com%22`
### Filter by bounced emails
Use this query to filter by all bounced emails: (replace `<<your API key>>` with an API key from your account):
```
curl --request GET \
--url 'https://api.sendgrid.com/v3/messages?limit=10&query=status%3D%22bounced%22' \
--header 'authorization: Bearer <<your API key>>'
```
Subject queries have this format:
`status="bounced"`
Encoded, this query would look like this:
`status%3D%22bounced%22`
## Creating compound queries
Use [operators and keywords](#keywords-and-operator-reference) to combine queries for a compound query. For example, you could filter for emails between a date range or you could filter for when a specific recipients email is bounced. Here are some common use cases:
### Filter by a recipient email that was bounced
Use this query to filter by a recipient's email and by emails that are bounced: (replace `<<your API key>>` with an API key from your account, and replace <<email>> with the URL encoded recipients email):
```
curl --request GET \
--url 'https://api.sendgrid.com/v3/messages?limit=10&query=status%3D%22bounced%22%20AND%20to_email%3D%22<<email>>%22' \
--header 'authorization: Bearer <<your API key>>'
```
### Filter by date range
Use this query to filter to emails between specific dates: (replace `<<your API key>>` with an API key from your account, and replace {start_date} and {end_date} with a URL encoded UTC date string in this format: `YYYY-MM-DD HH:mm:SS`. Encoded, this looks like this: `2018-02-01T00%3A00%3A00.000Z`)
```
curl --request GET \
--url 'https://api.sendgrid.com/v3/messages?limit=10&query=last_event_time%20BETWEEN%20TIMESTAMP%20%22{start_date}%22%20AND%20TIMESTAMP%20%22{end_date}%22' \
--header 'authorization: Bearer <<your API key>>'
```
### Filter by a recipient and a date range
Use this query to filter to emails by recipient and between specific dates: (replace `<<your API key>>` with an API key from your account, replace <<start_date>> and <<end_date>> with a URL encoded UTC date string in this format: `YYYY-MM-DD HH:mm:SS`, and replace <<email>> with the URL encoded recipient's email)
```
curl --request GET \
--url 'https://api.sendgrid.com/v3/messages?limit=10&query=last_event_time%20BETWEEN%20TIMESTAMP%20%22{start_date}%22%20AND%20TIMESTAMP%20%22{end_date}%22AND%20to_email%3D%22<<email>>%22' \
--header 'authorization: Bearer <<your API key>>'
```
## Keywords and Operator reference
There are several operators and keywords that you can use to build [Compound queries](#creating-compound-queries). Use these operators between query statements. If the character used as the delimiter is found within the string. The escape character is `\`, which must be escaped with a preceding `\`. All queries need to be URL encoded.
_This is a full list of accepted operators and keywords:_
- `=`
- `!=`
- `<`
- `>`
- `<=`
- `>=`
- `-` - to
- `+`
- `/`
- `*`
- `-` - subtraction
- AND
- BETWEEN
- NOT BETWEEN
- CONTAINS
- DAY
- FALSE
- HOUR
- IN
- NOT IN
- INTERVAL
- IS
- IS NOT
- LIKE
- NOT LIKE
- MINUTE
- MONTH
- NOT
- NULL
- OR
- SECOND
- TIMESTAMP
- TRUE
- YEAR
## Query reference
<call-out type="warning">
Categories and Unique Arguments will be stored as a “Not PII” field and may be used for counting or other operations as SendGrid runs its systems. These fields generally cannot be redacted or removed. You should take care not to place PII in this field. SendGrid does not treat this data as PII, and its value may be visible to SendGrid employees, stored long-term, and may continue to be stored after you’ve left SendGrid’s platform.
</call-out>
This is a full list of basic query types and examples: (replace the data in quotes with the information you want to query, and then URL encode it)
<table class="table" style="table-layout:fixed">
<tr>
<th><b>Query</b></th>
<th><b>Unencoded example</b></th>
</tr>
<tr>
<td><code>msg_id</code></td>
<td><code>msg_id="filter0307p1las1-16816-5A023E36-1.0"</code></td>
</tr>
<tr>
<td><code>from_email</code></td>
<td><code>from_email="testing@sendgrid.net"</code></td>
</tr>
<tr>
<td><code>subject</code></td>
<td><code>subject="This is a subject test"</code></td>
</tr>
<tr>
<td><code>to_email</code></td>
<td><code>to_email="example@example.com"</code></td>
</tr>
<tr>
<td><code>status</code></td>
<td><code>status="processed"</code></td>
</tr>
<tr>
<td><code>template_id</code></td>
<td><code>template_id="8f0d27bc-cf8f-42d3-b951-3990af7d0619"</code></td>
</tr>
<tr>
<td><code>template_name</code></td>
<td><code>template_name="example_template"</code></td>
</tr>
<tr>
<td><code>campaign_name</code></td>
<td><code>campaign_name="example_campaign"</code></td>
</tr>
<tr>
<td><code>campaign_id</code></td>
<td><code>campaign_id="1453849"</code></td>
</tr>
<tr>
<td><code>api_key_id</code></td>
<td><code>api_key_id="SG.xxxxxxxxxxxxxxxx"</code> (everything before the middle dot in the API key)</td>
</tr>
<tr>
<td><code>events</code></td>
<td><code>(Contains(events,"processed"))</code></td>
</tr>
<tr>
<td><code>categories</code> - custom tags that you create</td>
<td><code>(Contains(categories,"categories_example"))</code></td>
</tr>
<tr>
<td><code>unique_args</code> - custom tracking arguments that you can attach to SMTP API calls</td>
<td><code>unique_args="example argument"</code></td>
</tr>
<tr>
<td><code>outbound_ip</code> - this is the SendGrid dedicated IP address used to send the email</td>
<td><code>outbound_ip="4.77.777.77"</code></td>
</tr>
<tr>
<td><code>last_event_time</code></td>
<td><code>last_event_time="2017-11-07T23:13:58Z"</code></td>
</tr>
<tr>
<td><code>clicks</code></td>
<td><code>clicks="0"</code></td>
</tr>
<tr>
<td><code>asm_group_id</code></td>
<td><code>asm_group_id="1041"</code></td>
</tr>
<tr>
<td><code>teammate</code> - teammates username</td>
<td><code>teammate="my_username"</code></td>
</tr>
</table>
## Additional Resources
- [Email Activity Feed API Reference](https://sendgrid.api-docs.io/v3.0/email-activity/filter-all-messages)
- [Email Activity Feed UI]({{root_url}}/ui/analytics-and-reporting/email-activity-feed/)
================================================
FILE: content/docs/for-developers/sending-email/getting-started-smtp.md
================================================
---
seo:
title: How to Send an SMTP Email
description: Use Telnet to send your first SMTP email. SendGrid’s SMTP API allows developers to specify custom handling instructions for email using an X-SMTPAPI header inserted into the message.
keywords: telnet, ports, connection, SMTP, send email, getting started
title: How to Send an SMTP Email
group: smtp
weight: 960
layout: page
navigation:
show: true
---
You can also send email with [the UI]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/) and with [the API]({{root_url}}/api-reference/).
## What is SMTP?
[Simple Mail Transfer Protocol (SMTP)]({{root_url}}/glossary/smtp/) is a quick and easy way to send email from one server to another. SendGrid provides an SMTP service that allows you to deliver your email via our servers instead of your own client or server. This means you can count on SendGrid's delivery at scale for your SMTP needs.
SendGrid’s SMTP API also allows you to specify custom email handling instructions using a JSON encoded list called the [X-SMTPAPI header]({{root_url}}/for-developers/sending-email/building-an-x-smtpapi-header/). The X-SMTPAPI header is parsed by SendGrid to modify your message in the ways you specify.
For a deeper dive into what SMTP is, the benefits of sending an email with SMTP, and how SendGrid can help, see the [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/) on our blog.
## Sending a test SMTP email with Telnet
This page will help you send a first test message using Telnet. Once you complete this process, you will be better prepared to explore and build messages using the [X-SMTPAPI header]({{root_url}}/for-developers/sending-email/building-an-x-smtpapi-header/).
### Prerequisites
Be sure to perform the following prerequisites to complete this tutorial.
1. Sign up for a [SendGrid account](https://signup.sendgrid.com/)
2. Create and store a SendGrid [API key](https://app.sendgrid.com/settings/api_keys) with full access "Mail Send" permissions.
3. Verify your [Sender Identity]({{root_url}}/for-developers/sending-email/sender-identity/)
4. Open your terminal, also commonly referred to as a command prompt, or command line. You'll use the terminal to encode your API key and input the commands that initiate a Telnet connection.
<call-out>
In the following code samples, greater than and less than symbol are wrapped around placeholder values (e.g., `<YOUR_API_KEY>`). You should replace the greater than and less than symbols and the text inside them with an actual value. For example, `echo -n '<YOUR_API_KEY>' | openssl base64` will become `echo -n 'SG.someactualkey' | openssl base64` if your API key is `SG.someactualkey`.
In some cases you will see two sets of greater than and less than symbols wrapping a placeholder. In this case, one set of greater than and less than symbols is required in the actual value and should not be replaced. For example, `From: "Example" <<example@example.com>>` will become `From: "Example" <example@example.com>`.
</call-out>
Once you have your terminal open and have saved your API key, you must Base64 encode the API key. Note that it is not secure to put your API key into an external webpage for a conversion, so we recommend using a conversion in your terminal. If you are on Mac or Linux, you can use the pre-installed OpenSSL package to Base64 encode a string with the following command.
```shell
echo -n '<YOUR_API_KEY>' | openssl base64
```
Save your encoded key for a later. Also, be sure you have not included any newline or whitespace characters by accident. This can happen when copying the encoded key from a shell that line wraps output. SMTP is a line-oriented protocol, and linefeed characters will prevent you from authenticating successfully.
<call-out type="warning">
Telnet does not register backspaces correctly, so you must type your commands correctly or copy and paste them from this page.
</call-out>
### Send an SMTP email using Telnet:
<call-out>
You may need to install Telnet on your machine. Telnet comes natively on some operating systems; However, recent releases of MacOS no longer include Telnet, and Telnet must be enabled manually on Windows 10.
You can install Telnet on MacOS using [Homebrew](https://brew.sh/).
To enable Telnet on Windows 10, navigate to **Windows Features** > **Turn Windows Features on or off** from the Windows **Control Panel**. Check the box next to **Telnet Client**, and select **OK**.
</call-out>
1. Start a Telnet session by typing the following in the terminal:
```shell
TELNET smtp.sendgrid.net 25
```
SendGrid accepts unencrypted and TLS connections on ports **25**, **587**, & **2525**. You can also connect via SSL on port **465**. Many hosting providers and ISPs block port 25 as a default practice. If your Telent session continually times out or will not connect using port 25, it is likely that your ISP or hosting provider is blocking the port. You can contact your host/ISP to find out which ports are open for outgoing SMTP relay. We recommend using port 587 to avoid any rate limiting that your server host may apply.
2. Once you successfully connect to SendGrid, log in to the server by typing the following:
```shell
AUTH LOGIN
```
The mail server will respond with `334 VXNlcm5hbWU6`, which is a Base64 encoded request for your username.
3. Input `YXBpa2V5` and press **Enter** on your keyboard. Twilio SendGrid requires you to authenticate using an API key. When using Basic Authentication and an API key, you must use the string `apikey` in place of your account username. The string `apikey` is `YXBpa2V5` when Base64 encoded, which is why we use it in this step.
The mail server will respond with `334 UGFzc3dvcmQ6`. This response is a Base64 encoded request for your password (your API Key).
4. Enter your Base64 converted API key in the next line as the password and press **Enter**.
The mail server will respond with `235 Authentication successful`. Getting this far indicates that your connection to `smtp.sendgrid.net` over the chosen port is open and that your API key is valid.
5. Next, add the email that you’re sending from using the SMTP MAIL FROM command and press **Enter**.
```shell
MAIL FROM: <SENDER_EMAIL>
```
The mail server will respond with `250 Sender address accepted`.
6. Add the email that you’re sending to using the SMTP RCPT TO command and press **Enter**.
```shell
RCPT TO: <RECIPIENT_ADDRESS>
```
Note that you can add more RCPT TO addresses during this step. Repeat the process by adding another RCPT TO command and pressing **Enter** for each recipient you intend to deliver the message to.
The mail server will respond with `250 Recipient address accepted` after each recipient is added.
7. On the next line, type `DATA` and press **Enter**.
The mail server will respond with `354 Continue`. Unlike the MAIL FROM and RCPT TO commands, which are part of the email envelope, the DATA command is not meant to contain information that routes your email from a sender to a recipient. Instead, DATA allows you to modify the content of your message.
8. Optionally, add a mail-to header to add the name and email address of the recipient to the email header and press **Enter**. Note that the name should be wrapped in quotation marks, and the address should be wrapped in a greater than and less than symbol.
```shell
To: "<RecipientName>" <<RecipientEmailAddress>>
```
9. Next, add a from header to add the name and email address of the sender to the email header and press **Enter**. If a from header is not included, SendGrid will block your email because it doesn’t follow [RFC 5322](https://tools.ietf.org/html/rfc5322) compliance guidelines. Note that the name should be wrapped in quotation marks, and the address should be wrapped in a greater than and less than symbol.
```shell
From: "<SenderName>" <<SenderEmail>>
```
10. Include a subject line and press **Enter**.
```shell
Subject: <EMAIL_SUBJECT>
```
11. Add the body content of the message and press **Enter**.
```shell
"<MESSAGE>"
```
For example:
```
“This is a test for the SMTP relay."
```
12. Finally, send the email by typing a period, `.`, and then pressing **Enter**.
The mail server will return `250 Ok: queued as <examplestring1234>`. This means the email has been queued to send. The queue moves very quickly, and you should see mail delivered to the designated recipients shortly.
13. Exit the Telnet connection by typing `quit` and pressing **Enter**.
The full command should look like the following example.
```shell
235 Authentication successful
MAIL FROM:tiramisu@example.com
250 Sender address accepted
RCPT TO:person1@sendgrid.com
250 Recipient address accepted
DATA
354 Continue
From: "Tira Misu" <tiramisu@example.com>
To: "Person 1" <person1@sendgrid.com>
Subject: Test message subject
"This is the test message body."
.
250 Ok: queued as Yo60h6C5ScGPeP5fUWU3K
```
Now that you've sent a test email, learn to [integrate your servers with our SMTP service]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/).
<call-out>
Message size limit: The total message size should not exceed 20MB. This includes the message itself, headers, and the combined size of any attachments.
</call-out>
<call-out-link linktext="IMPLEMENTATION SERVICES" img="/img/expert-insights-promo1.png" link="https://sendgrid.com/solutions/email-implementation/">
### Do you want expert help to get your email program started on the right foot?
Save time and feel confident you are set up for long-term success with Email Implementation. Our experts will work as an extension of your team to ensure your email program is correctly set up and delivering value for your business.
</call-out-link>
## Additional Resources
- [Getting Started with the UI]({{root_url}}/ui/sending-email/how-to-send-email-with-marketing-campaigns/)
- [Getting Started with the API]({{root_url}}/for-developers/sending-email/api-getting-started/)
- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/)
- [Integrating with the SMTP API]({{root_url}}/for-developers/sending-email/integrating-with-the-smtp-api/)
- [Building an SMTP Email]({{root_url}}/for-developers/sending-email/building-an-x-smtpapi-header/)
================================================
FILE: content/docs/for-developers/sending-email/getting-started-with-transactional-emails.md
================================================
---
seo:
title: Getting Started with Transactional Email
description: Using SendGrid to send Transactional Email.
keywords: Getting Started, API, v3, REST, Transactional Email
title: Getting Started with Transactional Email
group: api-v3
weight: 100
layout: page
navigation:
show: true
---
SendGrid is perfect for sending Transactional Emails.
## What is Transactional Email?
Transactional Email is a type of email sent to facilitate an agreed-upon transaction between the sender and the recipient. Transactional emails typically contain information a recipient wants or needs and consequently have very high open rates. Common transactional email use cases include, account creation emails, password resets, purchase receipts, account notifications, and social media updates like friend and follower notifications.
These emails typically contain information a user wants or needs. They have the highest open rates across all categories of email.
<call-out>
Well designed and useful emails help keep open rates high. Use ([SendGrid’s Dynamic Transactional Email Templates]({{root_url}}/ui/sending-email/how-to-send-an-email-with-dynamic-transactional-templates/)) to help with the creation of responsive transactional email templates.
</call-out>
Read more about Transactional Email in the [SendGrid Guide]({{root_url}}/glossary/transactional-email/).
## How to send a Transactional Email
Once your SendGrid account is set up, you have choices on how to send the emails to your users.
1. Send [via SMTP]({{root_url}}/for-developers/sending-email/getting-started-smtp/)
2. Send [via API]({{root_url}}/api-reference)
3. Send via other options like [Open Source]({{root_url}}/for-developers/sending-email/libraries/) and [plugins]({{root_url}}/for-developers/sending-email/wordpress-plugin/)
## Additional Resources
For more information on SendGrid and where you can go from here, check out these pages:
- [Transactional Emails]({{root_url}}/glossary/transactional-email/)
- [API Reference]({{root_url}}/api-reference/)
- [How to Send Email]({{root_url}}/for-developers/sending-email/)
================================================
FILE: content/docs/for-developers/sending-email/how-to-create-a-subuser-with-the-api.md
================================================
---
seo:
title: How to Create a Subuser with the API
description: How to Create a Subuser with the API
keywords: subuser, api, IP, account, new, create, /customer.
title: How to Create a Subuser with the API
group: api-v3
weight: 0
layout: page
zendesk_id: 201750787
navigation:
show: true
---
Creating a new subuser through SendGrid's API is a multi-step process. This guide will walk you through the necessary steps to create a new subuser account using only API calls.
## Establish the New Subuser (required)
With the [subuser creation API call](https://www.twilio.com/docs/sendgrid/api/v2/customer_subuser_api/subusers) you will be able to establish the new subuser's account and profile settings. This call will create the new subuser account. However, it does not apply the sending IP for the account, nor does it establish a domain authentication entry or enable website/SMTP access for the subuser.
#### Call Example
```
https://api.sendgrid.com/apiv2/customer.add.json?api_user=ryan.burrer@sendgrid.com&api_key=xxxxxx&username=newsubuser_username&website=yourdomain.com&password=newsubuser_password&confirm_password=newsubuser_password&first_name=Ryan&last_name=Burrer&address=555_anystreet&city=any_city&state=CO&zip=80203&email=example@example.com&country=US&phone=555-5555
```
<center>
<strong>Success Message<br></strong><img src="http://content.screencast.com/users/Ryan.Burrer/folders/Jing/media/5e355c42-487e-442a-bd2b-89c9d80dd7d0/00000094.png" alt=""><center><strong> <br>Failure Message<br></strong></center>
<img src="http://content.screencast.com/users/Ryan.Burrer/folders/Jing/media/d8482205-976f-4f82-ad3a-77503e867c2f/00000095.png" alt=""> <strong><span class="wysiwyg-font-size-medium"><br><br></span></strong>
</center>
## Assign an IP to be Used by the New Subuser (required)
Now that you have created the new subuser account, you will need to [add an IP](https://www.twilio.com/docs/sendgrid/api/v2/customer_subuser_api/ip_management) so that it can send emails. We advise that you first find an available IP for this subuser. You can do so by using the following call:
#### Call Example
```
https://api.sendgrid.com/apiv2/customer.ip.xml?ap
gitextract_6lgdzn0_/
├── .browserslistrc
├── .eslintignore
├── .eslintrc.json
├── .github/
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE
│ └── PULL_REQUEST_TEMPLATE
├── .gitignore
├── .nvmrc
├── .prettierrc
├── .stylelintrc
├── .travis.yml
├── .vscode/
│ └── settings.json
├── CODE_OF_CONDUCT.md
├── README.md
├── content/
│ └── docs/
│ ├── examples.md
│ ├── for-developers/
│ │ ├── parsing-email/
│ │ │ ├── inbound-email.md
│ │ │ └── setting-up-the-inbound-parse-webhook.md
│ │ ├── partners/
│ │ │ ├── account-migration.md
│ │ │ ├── amazon-marketplace.md
│ │ │ ├── azure.md
│ │ │ ├── google.md
│ │ │ ├── jelastic.md
│ │ │ ├── microsoft-azure-2021.md
│ │ │ └── microsoft-azure.md
│ │ ├── sending-email/
│ │ │ ├── api-getting-started.md
│ │ │ ├── applemail.md
│ │ │ ├── authentication.md
│ │ │ ├── automating-subusers.md
│ │ │ ├── brite-verify.md
│ │ │ ├── building-an-x-smtpapi-header.md
│ │ │ ├── cakephp.md
│ │ │ ├── categories.md
│ │ │ ├── cloud-rail.md
│ │ │ ├── codeigniter.md
│ │ │ ├── cors.md
│ │ │ ├── curl-examples.md
│ │ │ ├── django.md
│ │ │ ├── drupal.md
│ │ │ ├── enforced-tls.md
│ │ │ ├── exchange-2010.md
│ │ │ ├── exim.md
│ │ │ ├── formio.md
│ │ │ ├── getting-started-email-activity-api.md
│ │ │ ├── getting-started-smtp.md
│ │ │ ├── getting-started-with-transactional-emails.md
│ │ │ ├── how-to-create-a-subuser-with-the-api.md
│ │ │ ├── how-to-use-a-transactional-template-with-smtp-or-v2.md
│ │ │ ├── iis75.md
│ │ │ ├── integrating-with-the-smtp-api.md
│ │ │ ├── interspire.md
│ │ │ ├── joomla.md
│ │ │ ├── laravel.md
│ │ │ ├── libraries.md
│ │ │ ├── mailpoet.md
│ │ │ ├── migrating-from-v2-to-v3-mail-send.md
│ │ │ ├── modx.md
│ │ │ ├── outlook-2013.md
│ │ │ ├── outlook.md
│ │ │ ├── personalizations.md
│ │ │ ├── phpbb.md
│ │ │ ├── piesync.md
│ │ │ ├── postfix.md
│ │ │ ├── qmail.md
│ │ │ ├── quickstart-go.md
│ │ │ ├── quickstart-nodejs.md
│ │ │ ├── quickstart-php.md
│ │ │ ├── quickstart-python.md
│ │ │ ├── quickstart-ruby.md
│ │ │ ├── rubyonrails.md
│ │ │ ├── sandbox-mode.md
│ │ │ ├── scheduling-email.md
│ │ │ ├── scheduling-parameters.md
│ │ │ ├── section-tags.md
│ │ │ ├── segmentation-query-language.md
│ │ │ ├── send-mime-messages-with-sendgrid.md
│ │ │ ├── sender-identity.md
│ │ │ ├── sendmail.md
│ │ │ ├── single-sends-2020-update.md
│ │ │ ├── smtp-errors-and-troubleshooting.md
│ │ │ ├── smtp-filters.md
│ │ │ ├── smtp-go-code-example.md
│ │ │ ├── smtp-nodejs-code-example.md
│ │ │ ├── smtp-perl-code-example.md
│ │ │ ├── smtp-php-code-example.md
│ │ │ ├── smtp-python-code-example.md
│ │ │ ├── smtp-ruby-code-example.md
│ │ │ ├── ssmtp.md
│ │ │ ├── stopping-a-scheduled-send.md
│ │ │ ├── stopping-an-in-progress-send.md
│ │ │ ├── substitution-tags.md
│ │ │ ├── sugarcrm.md
│ │ │ ├── suppressions.md
│ │ │ ├── symfony.md
│ │ │ ├── thunderbird.md
│ │ │ ├── unique-arguments.md
│ │ │ ├── upgrade-your-authentication-method-to-api-keys.md
│ │ │ ├── using-handlebars.md
│ │ │ ├── v2-csharp-code-example.md
│ │ │ ├── v2-go-code-example.md
│ │ │ ├── v2-java-code-example.md
│ │ │ ├── v2-nodejs-code-example.md
│ │ │ ├── v2-perl-code-example.md
│ │ │ ├── v2-php-code-example.md
│ │ │ ├── v2-python-code-example.md
│ │ │ ├── v2-ruby-code-example.md
│ │ │ ├── v3-csharp-code-example.md
│ │ │ ├── v3-go-code-example.md
│ │ │ ├── v3-java-code-example.md
│ │ │ ├── v3-kotlin-code-example.md
│ │ │ ├── v3-mail-send-faq.md
│ │ │ ├── v3-php-code-example.md
│ │ │ ├── v3-python-code-example.md
│ │ │ ├── v3-ruby-code-example.md
│ │ │ ├── wordpress-faq.md
│ │ │ ├── wordpress-plugin.md
│ │ │ ├── wordpress-subscription-widget.md
│ │ │ ├── zapier-sending-for-gravity-forms-submissions.md
│ │ │ ├── zapier-sending-for-new-webhook-data.md
│ │ │ ├── zapier-sending-for-postgre-sql-row-matches.md
│ │ │ ├── zapier-sending-from-google-sheet-rows.md
│ │ │ ├── zapier-sending-to-tagged-infusionsoft-contacts.md
│ │ │ ├── zapier-sending-when-new-firebase-child-records-added.md
│ │ │ └── zend.md
│ │ └── tracking-events/
│ │ ├── analytics-with-keen-io.md
│ │ ├── csharp-code-example.md
│ │ ├── event-kit.md
│ │ ├── event.md
│ │ ├── getting-started-event-webhook-security-features.md
│ │ ├── getting-started-event-webhook.md
│ │ ├── go-code-example.md
│ │ ├── google-amp-for-email.md
│ │ ├── nodejs-code-example.md
│ │ ├── php-code-example.md
│ │ ├── python-code-example.md
│ │ ├── segment-sendgrid-source.md
│ │ └── troubleshooting.md
│ ├── glossary/
│ │ ├── 7-bit-encoding.md
│ │ ├── a-record.md
│ │ ├── account-reputation-dashboard.md
│ │ ├── ad-exchange.md
│ │ ├── ad-impression.md
│ │ ├── ad-unit.md
│ │ ├── affiliate-marketing.md
│ │ ├── allow-list.md
│ │ ├── automated-email.md
│ │ ├── autoresponder.md
│ │ ├── bayesian-filter.md
│ │ ├── blocks.md
│ │ ├── bounces.md
│ │ ├── bulk-email-service.md
│ │ ├── bulk-mail-folder.md
│ │ ├── campaigns.md
│ │ ├── can-spam.md
│ │ ├── categories.md
│ │ ├── challenge-response.md
│ │ ├── clicks.md
│ │ ├── cname.md
│ │ ├── complaint.md
│ │ ├── ctr.md
│ │ ├── custom-fields.md
│ │ ├── deferrals.md
│ │ ├── deliverability.md
│ │ ├── deliveries.md
│ │ ├── demand-side-platform.md
│ │ ├── deny-list.md
│ │ ├── direct-response-advertising.md
│ │ ├── dkim.md
│ │ ├── dmarc.md
│ │ ├── dns.md
│ │ ├── domain-authentication.md
│ │ ├── domain.md
│ │ ├── drip-campaign.md
│ │ ├── drops.md
│ │ ├── email-api-integration.md
│ │ ├── email-authentication.md
│ │ ├── email-harvesting.md
│ │ ├── email-marketing.md
│ │ ├── email-service-provider.md
│ │ ├── event-webhook.md
│ │ ├── expandable-banner.md
│ │ ├── expired.md
│ │ ├── feedback-loop.md
│ │ ├── flighting-in-advertising.md
│ │ ├── fqdn.md
│ │ ├── frequency-capping.md
│ │ ├── gdpr.md
│ │ ├── header.md
│ │ ├── imap.md
│ │ ├── invalid-email.md
│ │ ├── ip-address.md
│ │ ├── ip-warmup.md
│ │ ├── link-branding.md
│ │ ├── lists.md
│ │ ├── mail-merge.md
│ │ ├── mailbox-provider.md
│ │ ├── message-id.md
│ │ ├── mta.md
│ │ ├── mx-record.md
│ │ ├── native-advertising.md
│ │ ├── open-rate.md
│ │ ├── openrelay.md
│ │ ├── opens.md
│ │ ├── peer-invitations.md
│ │ ├── phishing.md
│ │ ├── preheader.md
│ │ ├── programmatic-media-buying.md
│ │ ├── rate-limiting.md
│ │ ├── reconfirmation.md
│ │ ├── request.md
│ │ ├── reseller-email-account.md
│ │ ├── reserved-fields.md
│ │ ├── reverse-dns.md
│ │ ├── scheduled-emails.md
│ │ ├── segmentation.md
│ │ ├── segments.md
│ │ ├── sender-authentication.md
│ │ ├── sender-id.md
│ │ ├── senders.md
│ │ ├── sends.md
│ │ ├── single-send.md
│ │ ├── smtp-api.md
│ │ ├── smtp-provider.md
│ │ ├── smtp-relay.md
│ │ ├── smtp-server.md
│ │ ├── smtp-service.md
│ │ ├── smtp.md
│ │ ├── spam-filter.md
│ │ ├── spam-reports.md
│ │ ├── spam-traps.md
│ │ ├── spam.md
│ │ ├── spf.md
│ │ ├── spoofing.md
│ │ ├── subscriber-list-management.md
│ │ ├── suspicious-sender.md
│ │ ├── system-fields.md
│ │ ├── teammates.md
│ │ ├── throttling.md
│ │ ├── timezone.md
│ │ ├── tls.md
│ │ ├── transactional-email-templates.md
│ │ ├── transactional-email.md
│ │ ├── triggered-actions.md
│ │ ├── triggered-email.md
│ │ ├── trusted-sender.md
│ │ ├── two-factor-authentication.md
│ │ ├── undelivered-email.md
│ │ ├── unknown-user.md
│ │ ├── utm-parameters.md
│ │ ├── web-api.md
│ │ ├── whitelabel.md
│ │ └── x-message-id.md
│ ├── release-notes/
│ │ ├── 2017-07-07.md
│ │ ├── 2017-08-01.md
│ │ ├── 2017-09-05.md
│ │ ├── 2017-09-14.md
│ │ ├── 2017-10-02.md
│ │ ├── 2017-10-11.md
│ │ ├── 2017-11-01.md
│ │ ├── 2017-12-20.md
│ │ ├── 2018-01-04.md
│ │ ├── 2018-02-13.md
│ │ ├── 2018-02-16.md
│ │ ├── 2018-02-27.md
│ │ ├── 2018-03-01.md
│ │ ├── 2018-03-06.md
│ │ ├── 2018-03-08.md
│ │ ├── 2018-03-14.md
│ │ ├── 2018-03-16.md
│ │ ├── 2018-03-29.md
│ │ ├── 2018-04-09.md
│ │ ├── 2018-04-10.md
│ │ ├── 2018-04-11.md
│ │ ├── 2018-04-17.md
│ │ ├── 2018-05-01.md
│ │ ├── 2018-05-15.md
│ │ ├── 2018-06-06.md
│ │ ├── 2018-07-23.md
│ │ ├── 2018-08-08.md
│ │ ├── 2018-08-22.md
│ │ ├── 2018-09-26.md
│ │ ├── 2018-10-15.md
│ │ ├── 2018-11-05.md
│ │ ├── 2018-11-09.md
│ │ ├── 2018-11-14.md
│ │ ├── 2018-12-01.md
│ │ ├── 2018-12-17.md
│ │ ├── 2019-01-17.md
│ │ ├── 2019-02-25.md
│ │ ├── 2019-04-01.md
│ │ ├── 2019-04-02.md
│ │ ├── 2019-04-03.md
│ │ ├── 2019-04-17.md
│ │ ├── 2019-04-22.md
│ │ ├── 2019-05-09.md
│ │ ├── 2019-06-04.md
│ │ ├── 2019-07-02.md
│ │ ├── 2019-07-10.md
│ │ ├── 2019-07-16.md
│ │ ├── 2019-07-31.md
│ │ ├── 2019-08-06.md
│ │ ├── 2019-08-26.md
│ │ ├── 2019-08-27.md
│ │ ├── 2019-09-04.md
│ │ ├── 2019-09-05.md
│ │ ├── 2019-09-10.md
│ │ ├── 2019-09-19.md
│ │ ├── 2019-09-23.md
│ │ ├── 2019-09-25.md
│ │ ├── 2019-09-27.md
│ │ ├── 2019-10-01.md
│ │ ├── 2019-10-09.md
│ │ ├── 2019-10-10.md
│ │ ├── 2019-10-23.md
│ │ ├── 2019-19-12.md
│ │ ├── 2020-01-01.md
│ │ ├── 2020-01-13.md
│ │ ├── 2020-01-29.md
│ │ ├── 2020-02-10.md
│ │ ├── 2020-03-19.md
│ │ ├── 2020-04-07.md
│ │ ├── 2020-04-13.md
│ │ ├── 2020-04-21.md
│ │ ├── 2020-04-30.md
│ │ ├── 2020-05-06.md
│ │ ├── 2020-05-18.md
│ │ ├── 2020-07-13.md
│ │ ├── 2020-07-21.md
│ │ ├── 2020-08-13.md
│ │ ├── 2020-08-17.md
│ │ ├── 2020-08-19.md
│ │ ├── 2020-09-03.md
│ │ ├── 2020-09-16.md
│ │ ├── 2020-09-17.md
│ │ ├── 2020-09-29.md
│ │ ├── 2020-11-11.md
│ │ ├── 2020-11-18.md
│ │ ├── 2020-12-01.md
│ │ ├── 2020-12-03.md
│ │ ├── 2020-12-09.md
│ │ ├── 2020-12-10.md
│ │ ├── 2020-12-16.md
│ │ ├── 2020-12-17.md
│ │ ├── 2021-01-07.md
│ │ ├── 2021-01-12.md
│ │ ├── 2021-01-13.md
│ │ ├── 2021-01-19.md
│ │ ├── 2021-02-17.md
│ │ ├── 2021-03-15.md
│ │ ├── 2021-03-24.md
│ │ ├── 2021-03-30.md
│ │ ├── 2021-04-13.md
│ │ ├── 2021-05-19.md
│ │ ├── 2021-05-25.md
│ │ └── 2021-06-02.md
│ └── ui/
│ ├── account-and-settings/
│ │ ├── accessing-email-account-associated-with-sendgrid.md
│ │ ├── account-compromised.md
│ │ ├── account-under-review.md
│ │ ├── account.md
│ │ ├── alerts.md
│ │ ├── api-keys.md
│ │ ├── billing.md
│ │ ├── cancel-your-account.md
│ │ ├── configuring-sign-in-with-apple.md
│ │ ├── custom-ssl-configurations.md
│ │ ├── dedicated-ip-addresses.md
│ │ ├── dkim-records.md
│ │ ├── dns-providers.md
│ │ ├── forced-password-reset-faq.md
│ │ ├── heroku-credentials.md
│ │ ├── hipaa-compliant.md
│ │ ├── how-to-set-up-domain-authentication.md
│ │ ├── how-to-set-up-link-branding.md
│ │ ├── how-to-set-up-reverse-dns.md
│ │ ├── inbound-parse.md
│ │ ├── ip-access-management.md
│ │ ├── ip-pools.md
│ │ ├── log-in-issues.md
│ │ ├── mail.md
│ │ ├── notifications.md
│ │ ├── partners.md
│ │ ├── password-reset-appdirect.md
│ │ ├── password-reset-azure.md
│ │ ├── password-reset-email.md
│ │ ├── password-reset-ibm-cloud-marketplace.md
│ │ ├── password-reset-openshift.md
│ │ ├── password-reset-softlayer.md
│ │ ├── pci-compliant.md
│ │ ├── reading-your-invoice.md
│ │ ├── resetting-your-username-and-password.md
│ │ ├── retired-mail-settings.md
│ │ ├── reverse-dns.md
│ │ ├── safely-test-your-sending-speed.md
│ │ ├── spf-dkim.md
│ │ ├── spf-limitations.md
│ │ ├── spf-records.md
│ │ ├── sso-okta.md
│ │ ├── sso.md
│ │ ├── subusers.md
│ │ ├── support.md
│ │ ├── taxes-and-tax-exempt.md
│ │ ├── teammates.md
│ │ ├── tracking.md
│ │ ├── troubleshooting-delays-and-latency.md
│ │ ├── troubleshooting-sender-authentication.md
│ │ ├── two-factor-authentication.md
│ │ ├── upgrading-your-account.md
│ │ └── verifying-your-account.md
│ ├── analytics-and-reporting/
│ │ ├── browser-comparison.md
│ │ ├── browser.md
│ │ ├── categories.md
│ │ ├── category-comparison.md
│ │ ├── click-tracking-html-best-practices.md
│ │ ├── click-tracking-ssl.md
│ │ ├── device.md
│ │ ├── email-activity-feed.md
│ │ ├── email-activity.md
│ │ ├── geographic.md
│ │ ├── global.md
│ │ ├── google-analytics.md
│ │ ├── interpreting-expert-insights.md
│ │ ├── mailbox-provider-comparison.md
│ │ ├── marketing-campaigns-stats-overview.md
│ │ ├── marketing-campaigns-stats.md
│ │ ├── migrating-from-the-new-relic-plugin.md
│ │ ├── spam-reports.md
│ │ ├── stats-overview.md
│ │ ├── subscribing-to-expert-insights.md
│ │ ├── subuser-comparison.md
│ │ ├── subuser.md
│ │ ├── tracking-data-with-keen-io.md
│ │ └── tracking-stats-using-new-relic.md
│ ├── managing-contacts/
│ │ ├── building-your-contact-list.md
│ │ ├── create-and-manage-contacts.md
│ │ ├── custom-fields.md
│ │ ├── email-address-validation.md
│ │ ├── formatting-a-csv.md
│ │ └── segmenting-your-contacts.md
│ └── sending-email/
│ ├── a-b-testing.md
│ ├── adding-dynamic-content-with-handlebars-in-marketing-campaigns.md
│ ├── attachments-with-digioh.md
│ ├── blocks.md
│ ├── bounces.md
│ ├── checking-email-source.md
│ ├── coming-soon-to-new-marketing-campaigns.md
│ ├── content-delivery-networks.md
│ ├── create-and-edit-legacy-transactional-templates.md
│ ├── create-and-manage-unsubscribe-groups.md
│ ├── cross-platform-html-design.md
│ ├── deliverability.md
│ ├── deny-lists.md
│ ├── dmarc.md
│ ├── editor.md
│ ├── email-flow.md
│ ├── email-testing.md
│ ├── email-to-sms.md
│ ├── formatting-html.md
│ ├── getting-started-with-automation.md
│ ├── global-unsubscribes.md
│ ├── google-feedback-loop.md
│ ├── group-unsubscribes.md
│ ├── how-to-implement-dmarc.md
│ ├── how-to-send-an-email-with-dynamic-transactional-templates.md
│ ├── how-to-send-email-with-marketing-campaigns.md
│ ├── image-editor.md
│ ├── index-suppressions.md
│ ├── invalid-emails.md
│ ├── ip-warmup-for-the-new-marketing-campaigns-experience.md
│ ├── legacy-newsletter-sunset.md
│ ├── list-unsubscribe.md
│ ├── migrating-from-legacy-marketing-campaigns.md
│ ├── migrating-from-legacy-templates.md
│ ├── old-editor-sunset.md
│ ├── recipient-subscription-preferences.md
│ ├── sender-verification.md
│ ├── senders.md
│ ├── single-sends.md
│ ├── spam-traps.md
│ ├── spam.md
│ ├── ssl-vs-tls.md
│ ├── subscription-tracking.md
│ ├── substitution-and-section-tags.md
│ ├── tls.md
│ ├── universal-links.md
│ ├── unsubscribe-groups.md
│ ├── warming-up-an-ip-address.md
│ ├── weblink.md
│ └── working-with-marketing-campaigns-email-designs.md
├── data/
│ └── SiteConfig.js
├── first-timers-tr.md
├── first-timers.md
├── gatsby-browser.js
├── gatsby-config.js
├── gatsby-node.js
├── jsconfig.json
├── license
├── package.json
├── plugins/
│ ├── sendgrid-remark-code-in-html/
│ │ ├── index.js
│ │ └── package.json
│ ├── sendgrid-remark-headers/
│ │ ├── index.js
│ │ └── package.json
│ ├── sendgrid-remark-paths/
│ │ ├── index.js
│ │ └── package.json
│ └── sendgrid-remark-tables/
│ ├── index.js
│ └── package.json
├── redirects.js
├── src/
│ ├── components/
│ │ ├── About/
│ │ │ ├── About.scss
│ │ │ └── index.jsx
│ │ ├── AsideMenu/
│ │ │ └── index.jsx
│ │ ├── BreadCrumbs/
│ │ │ └── index.jsx
│ │ ├── Footer/
│ │ │ ├── Footer.scss
│ │ │ └── index.jsx
│ │ ├── FooterCallout/
│ │ │ ├── FooterCallout.scss
│ │ │ └── index.jsx
│ │ ├── GlossaryPartial/
│ │ │ ├── GlossaryPartial.scss
│ │ │ └── glossaryPartial.jsx
│ │ ├── Group/
│ │ │ └── index.jsx
│ │ ├── Libaries/
│ │ │ ├── index.jsx
│ │ │ └── libaries.scss
│ │ ├── NavMain/
│ │ │ ├── NavMain.scss
│ │ │ └── index.jsx
│ │ ├── NavSub/
│ │ │ ├── NavSub.scss
│ │ │ └── index.jsx
│ │ ├── Rating/
│ │ │ ├── Rating.scss
│ │ │ └── index.js
│ │ ├── ReleaseNotes/
│ │ │ ├── ReleaseKey.jsx
│ │ │ └── ReleaseNotePost.jsx
│ │ ├── SEO/
│ │ │ └── index.jsx
│ │ ├── Search/
│ │ │ ├── index.jsx
│ │ │ └── search.scss
│ │ ├── SocialLinks/
│ │ │ ├── SocialLinks.css
│ │ │ └── index.jsx
│ │ ├── StatusPage/
│ │ │ ├── index.jsx
│ │ │ └── statusPage.scss
│ │ ├── layout/
│ │ │ ├── NoHeaderFooter.jsx
│ │ │ └── index.jsx
│ │ └── withUser/
│ │ └── index.jsx
│ ├── componentsMarkdown/
│ │ ├── Callout.jsx
│ │ ├── CalloutLink.jsx
│ │ ├── CodeGroup.jsx
│ │ ├── Gist.jsx
│ │ └── PageAnchor.jsx
│ ├── constants/
│ │ ├── categories.js
│ │ ├── footerLinks.js
│ │ ├── forDevelopersCards.js
│ │ ├── glossaryTerms.js
│ │ ├── groups.js
│ │ ├── homeCallouts.js
│ │ ├── homeCards.js
│ │ ├── libraries.js
│ │ ├── pageLinks.js
│ │ ├── socialLinks.js
│ │ └── starWars.js
│ ├── html.jsx
│ ├── pages/
│ │ ├── 404.jsx
│ │ ├── 404.scss
│ │ ├── api-reference.jsx
│ │ ├── api-reference.scss
│ │ ├── for-developers.jsx
│ │ ├── for-developers.scss
│ │ ├── glossary.jsx
│ │ ├── glossary.scss
│ │ ├── index.jsx
│ │ ├── index.scss
│ │ ├── release-notes.jsx
│ │ ├── release-notes.scss
│ │ └── site-map.jsx
│ ├── scss/
│ │ ├── components/
│ │ │ ├── _accordions.scss
│ │ │ ├── _alerts.scss
│ │ │ ├── _algolia.scss
│ │ │ ├── _badges.scss
│ │ │ ├── _breadcrumbs.scss
│ │ │ ├── _buttons.scss
│ │ │ ├── _cards.scss
│ │ │ ├── _center-modals.scss
│ │ │ ├── _checkboxes-radios.scss
│ │ │ ├── _confirmation-alerts.scss
│ │ │ ├── _date-range.scss
│ │ │ ├── _dropdowns.scss
│ │ │ ├── _dropzones.scss
│ │ │ ├── _email-cards.scss
│ │ │ ├── _filters.scss
│ │ │ ├── _horizontal-rules.scss
│ │ │ ├── _loader.scss
│ │ │ ├── _meters.scss
│ │ │ ├── _modals.scss
│ │ │ ├── _numbered-steps.scss
│ │ │ ├── _pagination.scss
│ │ │ ├── _progress-stages.scss
│ │ │ ├── _ranges.scss
│ │ │ ├── _segment-terms.scss
│ │ │ ├── _selects.scss
│ │ │ ├── _switches.scss
│ │ │ ├── _tables.scss
│ │ │ ├── _tabs.scss
│ │ │ ├── _text-inputs.scss
│ │ │ ├── _textareas.scss
│ │ │ └── _tooltips.scss
│ │ ├── global/
│ │ │ ├── _grid.scss
│ │ │ ├── _main.scss
│ │ │ ├── _mixins.scss
│ │ │ ├── _reset.scss
│ │ │ ├── _typography.scss
│ │ │ ├── _utilities.scss
│ │ │ └── _variables.scss
│ │ └── style-guide.scss
│ └── templates/
│ ├── category.jsx
│ ├── category.scss
│ ├── doc.jsx
│ ├── doc.scss
│ └── syntax-highlighting.scss
├── static/
│ ├── assets/
│ │ ├── TwilioSendGrid_Sample_Dashboard_NoSubusers.json
│ │ ├── TwilioSendGrid_Sample_Dashboard_WithSubusers.json
│ │ ├── example.csv
│ │ ├── global-ca466351408fcb1dae4bdec742db56d2.js
│ │ └── global-ecc286f800632a989058f964b0d52b7a.css
│ ├── config.json
│ ├── images/
│ │ ├── RT_1.0.html
│ │ ├── RT_2.0.html
│ │ ├── RT_3.0.html
│ │ ├── code.txt
│ │ └── sg-devguide002.png.bak
│ └── img/
│ └── Scream750.psd
├── styleguide.md
└── travis/
├── after_deploy.sh
├── build.sh
├── deploy.sh
└── deploy_open_source.sh
SYMBOL INDEX (306 symbols across 46 files)
FILE: plugins/sendgrid-remark-headers/index.js
function patch (line 5) | function patch(context, key, value) {
FILE: src/components/About/index.jsx
function About (line 4) | function About() {
FILE: src/components/AsideMenu/index.jsx
class AsideMenu (line 4) | class AsideMenu extends Component {
method constructor (line 5) | constructor(props) {
method componentDidMount (line 18) | componentDidMount() {
method componentWillUnmount (line 23) | componentWillUnmount() {
method scrollSpy (line 27) | scrollSpy() {
method render (line 54) | render() {
FILE: src/components/BreadCrumbs/index.jsx
class BreadCrumbs (line 5) | class BreadCrumbs extends Component {
method constructor (line 6) | constructor(props) {
method getPathParts (line 15) | getPathParts() {
method getSubPaths (line 23) | getSubPaths() {
method getTitle (line 56) | getTitle() {
method getJSONLD (line 72) | getJSONLD() {
method render (line 96) | render() {
FILE: src/components/Footer/index.jsx
class Footer (line 4) | class Footer extends Component {
method render (line 5) | render() {
FILE: src/components/FooterCallout/index.jsx
function FooterCallout (line 5) | function FooterCallout() {
FILE: src/components/GlossaryPartial/glossaryPartial.jsx
class GlossaryPartial (line 6) | class GlossaryPartial extends Component {
method getLinks (line 7) | static getLinks(anchors) {
method render (line 11) | render() {
FILE: src/components/Group/index.jsx
function Group (line 5) | function Group(props) {
FILE: src/components/Libaries/index.jsx
function Libaries (line 5) | function Libaries() {
FILE: src/components/NavMain/index.jsx
class NavMain (line 7) | class NavMain extends Component {
method constructor (line 8) | constructor(props) {
method toggleMenu (line 18) | toggleMenu() {
method closeMenu (line 22) | closeMenu() {
method render (line 26) | render() {
FILE: src/components/Rating/index.js
class Rating (line 5) | class Rating extends React.Component {
method constructor (line 6) | constructor(props) {
method componentDidMount (line 19) | componentDidMount() {
method getStars (line 39) | getStars() {
method render (line 54) | render() {
FILE: src/components/ReleaseNotes/ReleaseKey.jsx
function ReleaseKey (line 3) | function ReleaseKey() {
FILE: src/components/SEO/index.jsx
class SEO (line 5) | class SEO extends Component {
method capitalizeFirstLetter (line 6) | static capitalizeFirstLetter(str) {
method render (line 16) | render() {
FILE: src/components/Search/index.jsx
class Search (line 7) | class Search extends Component {
method componentDidMount (line 8) | componentDidMount() {
method render (line 48) | render() {
FILE: src/components/SocialLinks/index.jsx
function SocialLinks (line 4) | function SocialLinks() {
FILE: src/components/StatusPage/index.jsx
class MainLayout (line 4) | class MainLayout extends Component {
method constructor (line 5) | constructor(props) {
method componentWillMount (line 13) | componentWillMount() {
method render (line 23) | render() {
FILE: src/components/layout/NoHeaderFooter.jsx
class NoHeaderFooter (line 3) | class NoHeaderFooter extends React.Component {
method render (line 4) | render() {
FILE: src/components/layout/index.jsx
function MainLayout (line 9) | function MainLayout(props) {
FILE: src/components/withUser/index.jsx
function withUser (line 6) | function withUser(WrappedComponent) {
FILE: src/componentsMarkdown/Callout.jsx
function Callout (line 3) | function Callout(props) {
FILE: src/componentsMarkdown/CalloutLink.jsx
class CalloutLink (line 4) | class CalloutLink extends React.Component {
method componentDidMount (line 5) | componentDidMount() {
method render (line 18) | render() {
FILE: src/componentsMarkdown/CodeGroup.jsx
class CodeGroup (line 4) | class CodeGroup extends React.Component {
method constructor (line 5) | constructor(props) {
method toggleLang (line 16) | toggleLang(e) {
method renderTabs (line 22) | renderTabs() {
method renderCodeBlocks (line 36) | renderCodeBlocks() {
method render (line 55) | render() {
FILE: src/componentsMarkdown/Gist.jsx
class Gist (line 3) | class Gist extends React.PureComponent {
method componentDidMount (line 4) | componentDidMount() {
method componentDidUpdate (line 8) | componentDidUpdate() {
method defineUrl (line 12) | defineUrl() {
method updateIframeContent (line 20) | updateIframeContent() {
method render (line 41) | render() {
FILE: src/componentsMarkdown/PageAnchor.jsx
class PageAnchor (line 3) | class PageAnchor extends React.Component {
method getContent (line 4) | getContent() {
method render (line 28) | render() {
FILE: src/constants/categories.js
constant CATEGORIES (line 2) | const CATEGORIES = {
FILE: src/constants/footerLinks.js
constant FOOTER_LINKS (line 1) | const FOOTER_LINKS = [];
FILE: src/constants/forDevelopersCards.js
constant FOR_DEVS_CARDS (line 6) | const FOR_DEVS_CARDS = [
FILE: src/constants/glossaryTerms.js
constant GLOSSARY_TERMS_HOME (line 4) | const GLOSSARY_TERMS_HOME = {
constant GLOSSARY_TERMS_DEVS (line 14) | const GLOSSARY_TERMS_DEVS = {
FILE: src/constants/groups.js
constant GROUPS (line 2) | const GROUPS = {
FILE: src/constants/homeCallouts.js
constant HOME_CALLOUTS (line 1) | const HOME_CALLOUTS = [
FILE: src/constants/homeCards.js
constant HOME_CARDS (line 6) | const HOME_CARDS = [
FILE: src/constants/libraries.js
constant LIBRARIES (line 9) | const LIBRARIES = [
FILE: src/constants/pageLinks.js
constant LINKS (line 1) | const LINKS = {
FILE: src/constants/socialLinks.js
constant SOCIAL_LINKS (line 1) | const SOCIAL_LINKS = [
FILE: src/constants/starWars.js
constant STARWARS (line 1) | const STARWARS = {
FILE: src/html.jsx
class HTML (line 6) | class HTML extends React.Component {
method render (line 7) | render() {
FILE: src/pages/404.jsx
function NotFound (line 6) | function NotFound({ location }) {
FILE: src/pages/api-reference.jsx
function stopLight (line 5) | function stopLight({ location }) {
FILE: src/pages/for-developers.jsx
class ForDevelopers (line 12) | class ForDevelopers extends Component {
method renderFeaturedCards (line 13) | static renderFeaturedCards() {
method render (line 28) | render() {
FILE: src/pages/glossary.jsx
class Glossary (line 8) | class Glossary extends React.Component {
method constructor (line 9) | constructor(props) {
method alphaEdges (line 14) | alphaEdges() {
method render (line 32) | render() {
FILE: src/pages/index.jsx
class Index (line 14) | class Index extends React.Component {
method renderCards (line 15) | static renderCards() {
method renderCallouts (line 30) | static renderCallouts() {
method render (line 54) | render() {
FILE: src/pages/release-notes.jsx
class ReleaseNotes (line 12) | class ReleaseNotes extends React.Component {
method getAsideLinks (line 13) | getAsideLinks() {
method render (line 33) | render() {
FILE: src/pages/site-map.jsx
class siteMap (line 6) | class siteMap extends React.Component {
method render (line 7) | render() {
FILE: src/templates/category.jsx
class CategoryTemplate (line 11) | class CategoryTemplate extends React.Component {
method sortGroups (line 12) | static sortGroups(groupEdges) {
method renderGroups (line 22) | renderGroups() {
method render (line 37) | render() {
FILE: src/templates/doc.jsx
class DocTemplate (line 28) | class DocTemplate extends React.Component {
method getLinks (line 29) | getLinks() {
method getRepoLink (line 41) | getRepoLink() {
method render (line 56) | render() {
FILE: static/assets/global-ca466351408fcb1dae4bdec742db56d2.js
function bE (line 2) | function bE(c,b,f){var a,d=(b=b||bx).createElement("script");if(d.text=c...
function bp (line 2) | function bp(a){return null==a?a+"":"object"==typeof a||"function"==typeo...
function cu (line 2) | function cu(b){var a=!!b&&"length" in b&&b.length,c=bp(b);return !bL(b)&...
function dh (line 2) | function dh(u,y,a,k){var b,z,g,w,p,n,x,d=y&&y.ownerDocument,j=y?y.nodeTy...
function dX (line 2) | function dX(){var b=[];function a(d,c){return b.push(d+" ")>c3.cacheLeng...
function d0 (line 2) | function d0(a){return a[dp]=!0,a}
function dn (line 2) | function dn(b){var a=dl.createElement("fieldset");try{return !!b(a)}catc...
function d5 (line 2) | function d5(c,b){var d=c.split("|"),a=d.length;while(a--){c3.attrHandle[...
function c4 (line 2) | function c4(c,a){var d=a&&c,b=d&&1===c.nodeType&&1===a.nodeType&&c.sourc...
function d4 (line 2) | function d4(a){return function(b){return"input"===b.nodeName.toLowerCase...
function cT (line 2) | function cT(a){return function(b){var c=b.nodeName.toLowerCase();return(...
function ct (line 2) | function ct(a){return function(b){return"form" in b?b.parentNode&&!1===b...
function dF (line 2) | function dF(a){return d0(function(b){return b=+b,d0(function(g,e){var d,...
function dY (line 2) | function dY(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}
function d2 (line 2) | function d2(){}
function cU (line 2) | function cU(c){for(var a=0,d=c.length,b="";a<d;a++){b+=c[a].value}return b}
function dZ (line 2) | function dZ(h,d,k){var g=d.dir,c=d.next,j=c||g,b=k&&"parentNode"===j,f=d...
function d7 (line 2) | function d7(a){return a.length>1?function(c,e,d){var b=a.length;while(b-...
function dz (line 2) | function dz(d,b,f){for(var c=0,a=b.length;c<a;c++){dh(d,b[c],f)}return f}
function bt (line 2) | function bt(h,m,d,b,g){for(var c,j=[],p=0,k=h.length,f=null!=m;p<k;p++){...
function d3 (line 2) | function d3(d,b,g,c,a,f){return c&&!c[dp]&&(c=d3(c)),a&&!a[dp]&&(a=d3(a,...
function dH (line 2) | function dH(k){for(var v,g,h,d=k.length,m=c3.relative[k[0].type],w=m||c3...
function cS (line 2) | function cS(c,b){var f=b.length>0,a=c.length>0,d=function(g,A,H,F,p){var...
function cd (line 2) | function cd(b,a){return b.nodeName&&b.nodeName.toLowerCase()===a.toLower...
function bH (line 2) | function bH(b,a,c){return bL(a)?bq.grep(b,function(f,d){return !!a.call(...
function ca (line 2) | function ca(b,a){while((b=b[a])&&1!==b.nodeType){}return b}
function b7 (line 2) | function b7(b){var a={};return bq.each(b.match(cf)||[],function(c,d){a[d...
function ck (line 2) | function ck(a){return a}
function b0 (line 2) | function b0(a){throw a}
function cH (line 2) | function cH(d,b,f,c){var a;try{d&&bL(a=d.promise)?a.call(d).done(b).fail...
function f (line 2) | function f(m,p,o,l){return function(){var r=this,n=arguments,i=function(...
function bU (line 2) | function bU(){bx.removeEventListener("DOMContentLoaded",bU),bO.removeEve...
function b1 (line 2) | function b1(b,a){return a.toUpperCase()}
function cm (line 2) | function cm(a){return a.replace(bZ,"ms-").replace(b3,b1)}
function b9 (line 2) | function b9(){this.expando=bq.expando+b9.uid++}
function aM (line 2) | function aM(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""...
function cy (line 2) | function cy(c,a,d){var b;if(void 0===d&&1===c.nodeType){if(b="data-"+a.r...
function aE (line 2) | function aE(j,v,f,b){var h,d,m=20,w=b?function(){return b.cur()}:functio...
function bI (line 2) | function bI(d){var b,f=d.ownerDocument,c=d.nodeName,a=cR[c];return a||(b...
function a1 (line 2) | function a1(g,d){for(var j,f,c=[],h=0,b=g.length;h<b;h++){(f=g[h]).style...
function cL (line 2) | function cL(b,a){var c;return c="undefined"!=typeof b.getElementsByTagNa...
function aw (line 2) | function aw(c,a){for(var d=0,b=c.length;d<b;d++){cj.set(c[d],"globalEval...
function ac (line 2) | function ac(y,D,k,b,v){for(var j,B,E,C,m,A,x=D.createDocumentFragment(),...
function ar (line 2) | function ar(){return !0}
function ak (line 2) | function ak(){return !1}
function ab (line 2) | function ab(){try{return bx.activeElement}catch(a){}}
function aB (line 2) | function aB(h,d,k,g,c,j){var b,f;if("object"==typeof d){"string"!=typeof...
function bb (line 2) | function bb(b,a){return cd(b,"table")&&cd(11!==a.nodeType?a:a.firstChild...
function cI (line 2) | function cI(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}
function aL (line 2) | function aL(a){return"true/"===(a.type||"").slice(0,5)?a.type=a.type.sli...
function aD (line 2) | function aD(h,m){var d,b,g,c,j,p,k,f;if(1===m.nodeType){if(cj.hasData(h)...
function a3 (line 2) | function a3(b,a){var c=a.nodeName.toLowerCase();"input"===c&&bl.test(b.t...
function al (line 2) | function al(w,D,h,a){D=bS.apply([],D);var k,g,E,C,j,z,m=0,b=w.length,x=b...
function cw (line 2) | function cw(d,b,g){for(var c,a=b?bq.filter(b,d):d,f=0;null!=(c=a[f]);f++...
function k (line 2) | function k(){if(g){e.style.cssText="position:absolute;left:-11111px;widt...
function d (line 2) | function d(a){return Math.round(parseFloat(a))}
function aj (line 2) | function aj(h,d,k){var g,c,j,b,f=h.style;return(k=k||cs(h))&&(""!==(b=k....
function ag (line 2) | function ag(b,a){return{get:function(){if(!b()){return(this.get=a).apply...
function av (line 2) | function av(b){if(b in a6){return b}var a=b[0].toUpperCase()+b.slice(1),...
function bT (line 2) | function bT(b){var a=bq.cssProps[b];return a||(a=bq.cssProps[b]=av(b)||b...
function bk (line 2) | function bk(c,a,d){var b=aC.exec(a);return b?Math.max(0,b[2]-(d||0))+(b[...
function aX (line 2) | function aX(g,k,d,b,f,c){var h="width"===k?1:0,l=0,j=0;if(d===(b?"border...
function a5 (line 2) | function a5(g,d,j){var f=cs(g),c=aj(g,d,f),h="border-box"===bq.css(g,"bo...
function aI (line 2) | function aI(d,b,f,c,a){return new aI.prototype.init(d,b,f,c,a)}
function cz (line 2) | function cz(){aZ&&(!1===bx.hidden&&bO.requestAnimationFrame?bO.requestAn...
function aQ (line 2) | function aQ(){return bO.setTimeout(function(){cc=void 0}),cc=Date.now()}
function aA (line 2) | function aA(d,b){var f,c=0,a={height:d};for(b=b?1:0;c<4;c+=2-b){a["margi...
function cN (line 2) | function cN(g,d,j){for(var f,c=(bh.tweeners[d]||[]).concat(bh.tweeners["...
function bo (line 2) | function bo(B,H,m){var b,w,k,F,I,G,v,D,A="width" in H||"height" in H,j=t...
function aW (line 2) | function aW(g,d){var j,f,c,h,b;for(j in g){if(f=cm(j),c=d[f],h=g[j],Arra...
function bh (line 2) | function bh(j,v,f){var b,h,d=0,m=bh.prefilters.length,w=bq.Deferred().al...
function aq (line 2) | function aq(a){return(a.match(cf)||[]).join(" ")}
function cD (line 2) | function cD(a){return a.getAttribute&&a.getAttribute("class")||""}
function cP (line 2) | function cP(a){return Array.isArray(a)?a:"string"==typeof a?a.match(cf)|...
function ao (line 2) | function ao(d,b,f,c){var a;if(Array.isArray(b)){bq.each(b,function(g,e){...
function ad (line 2) | function ad(a){return function(c,f){"string"!=typeof c&&(f=c,c="*");var ...
function aa (line 2) | function aa(g,d,j,f){var c={},h=g===bj;function b(e){var a;return c[e]=!...
function cq (line 2) | function cq(d,b){var f,c,a=bq.ajaxSettings.flatOptions||{};for(f in b){v...
function ba (line 2) | function ba(g,k,d){var b,f,c,h,l=g.contents,j=g.dataTypes;while("*"===j[...
function cn (line 2) | function cn(j,v,f,b){var h,d,m,w,p,g={},k=j.dataTypes.slice();if(k[1]){f...
function M (line 2) | function M(m,f,a,o){var g,e,i,k,h,c=f;U||(U=!0,A&&R.clearTimeout(A),N=vo...
function b (line 2) | function b(c){return function(f){if(!f){f=window.event}var d=(f.target?f...
function a (line 2) | function a(d){var g=d.className.match(/(^| )collapsibleListClosed( |$)/)...
function K (line 2) | function K(){var g="{}";if("userDataBehavior"==S){R.load("jStorage");try...
function l (line 2) | function l(){var c;clearTimeout(k);k=setTimeout(function(){if("localStor...
function H (line 2) | function H(g,f){g=[].concat(g||[]);var r,h,m,p;if("flushed"==f){g=[];for...
function j (line 2) | function j(){var f=(+new Date).toString();if("localStorage"==S||"globalS...
function I (line 2) | function I(){if(Q.jStorage){try{T=O.parse(String(Q.jStorage))}catch(c){Q...
function e (line 2) | function e(){if(T.__jstorage_meta.PubSub){for(var g=+new Date-2000,c=0,f...
function M (line 2) | function M(c){if("string"!=typeof c&&"number"!=typeof c){throw new TypeE...
function d (line 2) | function d(){var g,c,f,h,p=Infinity,r=!1,m=[];clearTimeout(i);if(T.__jst...
function o (line 2) | function o(){var h;if(T.__jstorage_meta.PubSub){var c,f=N,m=[];for(h=T._...
function c (line 2) | function c(){}
function checkSize (line 2) | function checkSize(){var a=$("#js-sidebar-links").children("nav"),b=$("#...
function gtmEvent (line 2) | function gtmEvent(){if(typeof arguments[0]==="object"){var a=arguments[0...
function gaPushEvent (line 2) | function gaPushEvent(b){var a={hitType:"event",eventCategory:b[1],eventA...
function O (line 10) | function O(Q,S){S=S||c.createElement(P[Q]||"div");Q="on"+Q;var R=Q in S;...
function E (line 10) | function E(O){F.cssText=O}
function v (line 10) | function v(P,O){return E(j.join(P+";")+(O||""))}
function s (line 10) | function s(P,O){return typeof P===O}
function u (line 10) | function u(P,O){return !!~(""+P).indexOf(O)}
function A (line 10) | function A(Q,O){for(var P in Q){var R=Q[P];if(!u(R,"-")&&F[R]!==g){retur...
function r (line 10) | function r(P,S,R){for(var O in P){var Q=S[P[O]];if(Q!==g){if(R===false){...
function m (line 10) | function m(S,O,R){var P=S.charAt(0).toUpperCase()+S.slice(1),Q=(S+" "+G....
function C (line 10) | function C(){x.input=(function(Q){for(var P=0,O=Q.length;P<O;P++){f[Q[P]...
function T (line 10) | function T(ah,aj){var ak=ah.createElement("p"),ai=ah.getElementsByTagNam...
function Z (line 10) | function Z(){var ah=X.elements;return typeof ah=="string"?ah.split(" "):ah}
function ad (line 10) | function ad(ah){var ai=ac[ah[W]];if(!ai){ai={};O++;ah[W]=O;ac[O]=ai}retu...
function ab (line 10) | function ab(ak,ah,aj){if(!ah){ah=aa}if(S){return ah.createElement(ak)}if...
function af (line 10) | function af(aj,al){if(!aj){aj=aa}if(S){return aj.createDocumentFragment(...
function ag (line 10) | function ag(ah,ai){if(!ai.cache){ai.cache={};ai.createElem=ah.createElem...
function P (line 10) | function P(ah){if(!ah){ah=aa}var ai=ad(ah);if(X.shivCSS&&!ae&&!ai.hasCSS...
function c (line 16) | function c(){var f=document.createElement("bootstrap"),e={WebkitTransiti...
function l (line 16) | function l(){i.trigger("closed.bs.alert").remove()}
function h (line 16) | function h(a){i(m).remove(),i(l).each(function(){var c=n(i(this)),b={rel...
function n (line 16) | function n(a){var f=a.attr("data-target");f||(f=a.attr("href"),f=f&&/#[A...
function a (line 16) | function a(){"in"!=i.hoverState&&h.detach(),i.$element.trigger("hidden.b...
function d (line 16) | function d(h,g){var b,a=e.proxy(this.process,this);this.$element=e(e(h)....
function j (line 16) | function j(){i.removeClass("active").find("> .dropdown-menu > .active")....
function search (line 16) | function search(d){var c=$(".nav-link > a")[0].pathname.replace("/index....
function search_send_ga (line 16) | function search_send_ga(b,a){if(search_verify_ga()){ga(b,a)}}
function search_verify_ga (line 16) | function search_verify_ga(){if(typeof(ga)=="function"){return true}retur...
function getDerivedMethod (line 20) | function getDerivedMethod(baseMethod,method){return function(){var ret,t...
function getMethod (line 20) | function getMethod(baseMethod,method){if($isFunction(method)){method=get...
function tagHandlersFromProps (line 20) | function tagHandlersFromProps(tag,tagCtx){for(var prop in tagCtx.props){...
function retVal (line 20) | function retVal(val){return val}
function noop (line 20) | function noop(){return""}
function dbgBreak (line 20) | function dbgBreak(val){try{;throw"dbg breakpoint"}catch(e){}return this....
function dbgMode (line 20) | function dbgMode(debugMode){$viewsSettings._dbgMode=debugMode!==false}
function JsViewsError (line 20) | function JsViewsError(message){this.name=($.link?"JsViews":"JsRender")+"...
function $extend (line 20) | function $extend(target,source){var name;for(name in source){target[name...
function $viewsDelimiters (line 20) | function $viewsDelimiters(openChars,closeChars,link){if(this!==0||openCh...
function getView (line 20) | function getView(inner,type){if(!type){type=inner;inner=undefined}var vi...
function getNestedIndex (line 20) | function getNestedIndex(){var view=this.get("item");return view?view.ind...
function getIndex (line 20) | function getIndex(){return this.index}
function getHelper (line 20) | function getHelper(helper){var wrapped,view=this,ctx=view.linkCtx,res=(v...
function convertVal (line 20) | function convertVal(converter,view,tagCtx,onError){var tag,value,boundTa...
function convertArgs (line 20) | function convertArgs(converter){var tag=this,tagCtx=tag.tagCtx,view=tagC...
function getResource (line 20) | function getResource(resourceType,itemName){var res,store,view=this;whil...
function renderTag (line 20) | function renderTag(tagName,parentView,tmpl,tagCtxs,isUpdate,onError){par...
function View (line 20) | function View(context,type,parentView,data,template,key,contentTmpl,onRe...
function compileChildResources (line 20) | function compileChildResources(parentTmpl){var storeName,resources,resou...
function compileTag (line 20) | function compileTag(name,tagDef,parentTmpl){var tmpl,baseTag,prop,compil...
function baseApply (line 20) | function baseApply(args){return this.base.apply(this,args)}
function compileTmpl (line 20) | function compileTmpl(name,tmpl,parentTmpl,options){function lookupTempla...
function dataMap (line 20) | function dataMap(mapDef){function Map(source,options){this.tgt=mapDef.ge...
function tmplObject (line 20) | function tmplObject(markup,options){var htmlTag,wrapMap=$viewsSettings.w...
function registerStore (line 20) | function registerStore(storeName,storeSettings){function theStore(name,i...
function renderContent (line 20) | function renderContent(data,context,noIteration,parentView,key,onRender)...
function renderWithViews (line 20) | function renderWithViews(tmpl,data,context,noIteration,view,key,onRender...
function error (line 20) | function error(e,view,fallback){var message=$viewsSettings.onError(e,vie...
function syntaxError (line 20) | function syntaxError(message){error("Syntax error\n"+message)}
function tmplFn (line 20) | function tmplFn(markup,tmpl,isLinkExpr,convertBack,hasElse){function pus...
function setPaths (line 20) | function setPaths(fn,pathsArr){var key,paths,i=0,l=pathsArr.length;fn.de...
function parsedParam (line 20) | function parsedParam(args,props,ctx){return[args.slice(0,-1),props.slice...
function paramStructure (line 20) | function paramStructure(parts,type){return"\n\t"+(type?type+":{":"")+"ar...
function parseParams (line 20) | function parseParams(params,pathBindings,tmpl){function parseTokens(all,...
function buildCode (line 20) | function buildCode(ast,tmpl,isLinkExpr){var i,node,tagName,converter,tag...
function extendCtx (line 20) | function extendCtx(context,parentContext){return context&&context!==pare...
function getCharEntity (line 20) | function getCharEntity(ch){return charEntities[ch]||(charEntities[ch]="&...
function getTargetProps (line 20) | function getTargetProps(source){var key,prop,props=[];if(typeof source==...
function $fnRender (line 20) | function $fnRender(data,context,noIteration){var tmplElem=this.jquery&&(...
function htmlEncode (line 20) | function htmlEncode(text){return text!=undefined?rIsHtml.test(text)&&(""...
function getNav (line 20) | function getNav(){var b=$("ul.main-navigation, ul[role=main-navigation]"...
function testFeatures (line 20) | function testFeatures(){var a=["maskImage"];$(a).map(function(c,b){if(Mo...
function addCodeLineNumbers (line 20) | function addCodeLineNumbers(){if(navigator.appName==="Microsoft Internet...
function flashVideoFallback (line 20) | function flashVideoFallback(){var b="/assets/jwplayer/player.swf",a="/as...
function wrapFlashVideos (line 20) | function wrapFlashVideos(){$("object").each(function(b,a){if($(a).find("...
function renderDeliciousLinks (line 20) | function renderDeliciousLinks(c){var b="<ul>";for(var d=0,a=c.length;d<a...
function a (line 20) | function a(){d.content="width=device-width,minimum-scale="+f[0]+",maximu...
function w (line 26) | function w(t,s,n){var g,i=b(n);if(h.wk&&h.wk<312){return g}if(i){if(type...
function b (line 26) | function b(i){var g=null;try{g=f.getElementById(i)}catch(j){}return g}
function r (line 26) | function r(i){var g=h.pv,i=i.split(".");i[0]=parseInt(i[0],10);i[1]=pars...
function p (line 26) | function p(g){return/[\\\"<>\.;]/.exec(g)!=null&&typeof encodeURICompone...
function F (line 26) | function F(a){return a.replace(/&/gm,"&").replace(/</gm,"<").repl...
function w (line 26) | function w(a){return a.nodeName.toLowerCase()}
function H (line 26) | function H(b,a){var c=b&&b.exec(a);return c&&c.index==0}
function M (line 26) | function M(a){return Array.prototype.map.call(a.childNodes,function(b){i...
function y (line 26) | function y(a){var b=(a.className+" "+(a.parentNode?a.parentNode.classNam...
function B (line 26) | function B(a,d){var c={};for(var b in a){c[b]=a[b]}if(d){for(var b in d)...
function v (line 26) | function v(a){var c=[];(function b(f,e){for(var d=f.firstChild;d;d=d.nex...
function z (line 26) | function z(h,f,b){var g=0;var j="";var e=[];function c(){if(!h.length||!...
function D (line 26) | function D(d){function c(e){return(e&&e.source)||e}function b(e,f){retur...
function N (line 26) | function N(a,h,l,b){function s(R,Q){for(var S=0;S<Q.c.length;S++){if(H(Q...
function J (line 26) | function J(d,a){a=a||O.languages||Object.keys(K);var c={r:0,value:F(d)};...
function I (line 26) | function I(a){if(O.tabReplace){a=a.replace(/^((<[^>]+>|\t)+)/gm,function...
function A (line 26) | function A(e){var f=M(e);var b=y(e);if(b=="no-highlight"){return}var d=b...
function x (line 26) | function x(a){O=B(O,a)}
function E (line 26) | function E(){if(E.called){return}E.called=true;var a=document.querySelec...
function P (line 26) | function P(){addEventListener("DOMContentLoaded",E,false);addEventListen...
function L (line 26) | function L(c,a){var b=K[c]=a(this);if(b.aliases){b.aliases.forEach(funct...
function G (line 26) | function G(a){return K[a]||K[C[a]]}
function d (line 34) | function d(i){return b.raw?i:encodeURIComponent(i)}
function g (line 34) | function g(i){return b.raw?i:decodeURIComponent(i)}
function h (line 34) | function h(i){return d(b.json?JSON.stringify(i):String(i))}
function c (line 34) | function c(i){if(i.indexOf('"')===0){i=i.slice(1,-1).replace(/\\"/g,'"')...
function e (line 34) | function e(j,i){var k=b.raw?j:c(j);return f.isFunction(i)?i(k):k}
function apidocs_iframe (line 34) | function apidocs_iframe(){if(window.location.pathname=="/docs/API_Refere...
Condensed preview — 627 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,198K chars).
[
{
"path": ".browserslistrc",
"chars": 16,
"preview": "Last 2 versions\n"
},
{
"path": ".eslintignore",
"chars": 28,
"preview": "public\nstatic\n.cache\ncontent"
},
{
"path": ".eslintrc.json",
"chars": 454,
"preview": "{\n \"extends\": [\"airbnb\"],\n \"plugins\": [\"react\", \"jsx-a11y\", \"import\"],\n \"rules\": {\n \"react/prefer-stateless-functi"
},
{
"path": ".github/CONTRIBUTING.md",
"chars": 7956,
"preview": "Hello! Thank you for choosing to help contribute to one of the SendGrid open source libraries. There are many ways you c"
},
{
"path": ".github/ISSUE_TEMPLATE",
"chars": 564,
"preview": "\n<!-- \nPlease avoid submitting support questions here. You can contact our support team at https://support.sendgrid.com."
},
{
"path": ".github/PULL_REQUEST_TEMPLATE",
"chars": 305,
"preview": "### Checklist\n**Required**\n- [x] I acknowledge that all my contributions will be made under the project's license.\n\n### "
},
{
"path": ".gitignore",
"chars": 356,
"preview": ".vagrant/\n.jekyll_indextank/\n.rvmrc\n_config.yml\n_config.dev.yml\n_config.deploy.yml\n.bundle\n.DS_Store\n.sass-cache\n.gist-c"
},
{
"path": ".nvmrc",
"chars": 4,
"preview": "12.*"
},
{
"path": ".prettierrc",
"chars": 69,
"preview": "{\n \"semi\": false,\n \"singleQuote\": true,\n \"trailingComma\": \"es5\"\n}\n"
},
{
"path": ".stylelintrc",
"chars": 492,
"preview": "{\n \"extends\": \"stylelint-config-standard\",\n \"plugins\": [\n \"stylelint-selector-bem-pattern\"\n ],\n \"rules\": {\n \"i"
},
{
"path": ".travis.yml",
"chars": 659,
"preview": "sudo: required\ndist: focal\nlanguage: node_js\nbranches:\n only:\n - main\n - develop\nnode_js:\n - 12.16.*\ncache:\n - "
},
{
"path": ".vscode/settings.json",
"chars": 246,
"preview": "{\n \"editor.codeActionsOnSave\": {\n \"source.fixAll.eslint\": true\n },\n \"eslint.enable\": true,\n \"editor.tabSize\": 2,\n"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 4440,
"preview": "# SendGrid Community Code of Conduct\n\nThe SendGrid open source community is made up of members from around the globe wit"
},
{
"path": "README.md",
"chars": 4389,
"preview": "\n\n\n**THIS REPOSITORY WILL NO LONGER BE MON"
},
{
"path": "content/docs/examples.md",
"chars": 2698,
"preview": "---\ntitle: Markdown Examples\nslug: markdown-examples\nnavigation:\n show: true\n---\n\n## Callout Link\n\n```html\n<call-out-li"
},
{
"path": "content/docs/for-developers/parsing-email/inbound-email.md",
"chars": 2943,
"preview": "---\nlayout: page\nweight: 0\ntitle: Inbound Email Parse Webhook\ngroup: inbound-parse\nnavigation:\n show: true\n---\n\nSendGri"
},
{
"path": "content/docs/for-developers/parsing-email/setting-up-the-inbound-parse-webhook.md",
"chars": 25170,
"preview": "---\nseo:\n title: Setting Up The Inbound Parse Webhook\n description: How to set up the Inbound Parse Webhook to process"
},
{
"path": "content/docs/for-developers/partners/account-migration.md",
"chars": 5669,
"preview": "---\nseo:\n title: Migrating from a partner account\n description: Sometimes if a SendGrid partner no longer supports Sen"
},
{
"path": "content/docs/for-developers/partners/amazon-marketplace.md",
"chars": 5927,
"preview": "---\nlayout: page\nweight: 90\ntitle: Amazon Marketplace\ngroup: platform-partners\nnavigation:\n show: true\n---\nSendGrid has"
},
{
"path": "content/docs/for-developers/partners/azure.md",
"chars": 14239,
"preview": "---\nlayout: page\nweight: 0\ngroup: platform-partners\ntitle: Building an iOS App on Windows Azure\nnavigation:\n show: true"
},
{
"path": "content/docs/for-developers/partners/google.md",
"chars": 1401,
"preview": "---\nlayout: page\nweight: 0\ngroup: platform-partners\ntitle: Google\nnavigation:\n show: true\n---\n\nIf you are using Google’"
},
{
"path": "content/docs/for-developers/partners/jelastic.md",
"chars": 441,
"preview": "---\nlayout: page\nweight: 0\ngroup: platform-partners\ntitle: Jelastic\nnavigation:\n show: true\n---\n\nSendGrid can be implem"
},
{
"path": "content/docs/for-developers/partners/microsoft-azure-2021.md",
"chars": 13262,
"preview": "---\nseo:\n title: Sending Email with Microsoft Azure\n description: Learn how to send email with Twilio SendGrid's newes"
},
{
"path": "content/docs/for-developers/partners/microsoft-azure.md",
"chars": 1899,
"preview": "---\nlayout: page\nweight: 0\ngroup: platform-partners\ntitle: Microsoft Azure\nnavigation:\n show: true\n---\n\nIf you are usin"
},
{
"path": "content/docs/for-developers/sending-email/api-getting-started.md",
"chars": 5046,
"preview": "---\nseo:\n title: Getting started with the SendGrid API\n description: Sending your first email using the SendGrid REST "
},
{
"path": "content/docs/for-developers/sending-email/applemail.md",
"chars": 2512,
"preview": "---\nlayout: page\nweight: 0\ntitle: Apple Mail\ngroup: plugins\nnavigation:\n show: true\n---\n\nThese instructions show how to"
},
{
"path": "content/docs/for-developers/sending-email/authentication.md",
"chars": 3883,
"preview": "---\nseo:\n title: Authentication\n description: Authenticating with the SendGrid API.\n keywords: getting started, Authe"
},
{
"path": "content/docs/for-developers/sending-email/automating-subusers.md",
"chars": 13906,
"preview": "---\nseo:\n title: Automate Adding Subusers with the SendGrid API\n description: Use the SendGrid API to add Subusers to "
},
{
"path": "content/docs/for-developers/sending-email/brite-verify.md",
"chars": 3350,
"preview": "---\nseo:\n title: Using SendGrid with BriteVerify\n description: Verify your SendGrid email list with Briteverify\n keyword"
},
{
"path": "content/docs/for-developers/sending-email/building-an-x-smtpapi-header.md",
"chars": 14088,
"preview": "---\nseo:\n title: Building an X-SMTPAPI Header\n description: Learn how to build email content, add recipients and sched"
},
{
"path": "content/docs/for-developers/sending-email/cakephp.md",
"chars": 2353,
"preview": "---\nlayout: page\nweight: 0\ngroup: frameworks\ntitle: CakePHP\nseo:\n title: Send Email with CakePHP & SendGrid\n descripti"
},
{
"path": "content/docs/for-developers/sending-email/categories.md",
"chars": 2221,
"preview": "---\nlayout: page\nweight: 0\ntitle: Categories\ngroup: x-smtpapi\nnavigation:\n show: true\n---\n\n<call-out type=\"warning\">\n\nT"
},
{
"path": "content/docs/for-developers/sending-email/cloud-rail.md",
"chars": 3054,
"preview": "---\nlayout: page\nweight: 0\ntitle: Using CloudRail to integrate SendGrid into your application\ngroup: plugins\nnavigation:"
},
{
"path": "content/docs/for-developers/sending-email/codeigniter.md",
"chars": 1265,
"preview": "---\nlayout: page\nweight: 0\ngroup: frameworks\ntitle: CodeIgniter\nseo:\n title: Send Email with CodeIgniter & SendGrid\n d"
},
{
"path": "content/docs/for-developers/sending-email/cors.md",
"chars": 1800,
"preview": "---\nlayout: page\nweight: 0\ntitle: Cross Origin Resource Sharing (CORS)\ngroup: api-v3\nnavigation:\n show: true\nseo:\n tit"
},
{
"path": "content/docs/for-developers/sending-email/curl-examples.md",
"chars": 4106,
"preview": "---\nseo:\n title: cURL Examples for Common Use Cases\n description:\n keywords: cURL, v3 mail send\ntitle: cURL Examples "
},
{
"path": "content/docs/for-developers/sending-email/django.md",
"chars": 1255,
"preview": "---\nlayout: page\nweight: 0\ngroup: frameworks\ntitle: Django\nseo:\n title: Send SMTP Email with Django\n description: View"
},
{
"path": "content/docs/for-developers/sending-email/drupal.md",
"chars": 3027,
"preview": "---\nlayout: page\nweight: 0\ntitle: Drupal\ngroup: plugins\nnavigation:\n show: true\n---\nTo send emails from Drupal using Se"
},
{
"path": "content/docs/for-developers/sending-email/enforced-tls.md",
"chars": 1849,
"preview": "---\nlayout: page\nweight: 0\ntitle: Enforced TLS\ngroup: sending-email\nnavigation:\n show: true\n---\n\nThe Enforced TLS setti"
},
{
"path": "content/docs/for-developers/sending-email/exchange-2010.md",
"chars": 3769,
"preview": "---\nlayout: page\nweight: 0\ntitle: Exchange 2010\ngroup: mail-servers\nnavigation:\n show: true\n---\n\nIf your organization i"
},
{
"path": "content/docs/for-developers/sending-email/exim.md",
"chars": 3053,
"preview": "---\nlayout: page\nweight: 0\ntitle: Exim 4\ngroup: mail-servers\nnavigation:\n show: true\nseo:\n title: Exim 4 configuration"
},
{
"path": "content/docs/for-developers/sending-email/formio.md",
"chars": 5211,
"preview": "---\nseo:\n title: Form.io Integration\n description: How to integrate Form.io with SendGrid.\n keywords: Form.io, integr"
},
{
"path": "content/docs/for-developers/sending-email/getting-started-email-activity-api.md",
"chars": 8851,
"preview": "---\nseo:\n title: Getting Started with the Email Activity Feed API\n description: Use the Email Activity Feed query lang"
},
{
"path": "content/docs/for-developers/sending-email/getting-started-smtp.md",
"chars": 10489,
"preview": "---\r\nseo:\r\n title: How to Send an SMTP Email\r\n description: Use Telnet to send your first SMTP email. SendGrid’s SMTP "
},
{
"path": "content/docs/for-developers/sending-email/getting-started-with-transactional-emails.md",
"chars": 2108,
"preview": "---\nseo:\n title: Getting Started with Transactional Email\n description: Using SendGrid to send Transactional Email.\n "
},
{
"path": "content/docs/for-developers/sending-email/how-to-create-a-subuser-with-the-api.md",
"chars": 7714,
"preview": "---\nseo:\n title: How to Create a Subuser with the API\n description: How to Create a Subuser with the API\n keywords: s"
},
{
"path": "content/docs/for-developers/sending-email/how-to-use-a-transactional-template-with-smtp-or-v2.md",
"chars": 6337,
"preview": "---\nseo:\n title: Sending a Legacy Transactional Template Email over SMTP or v2\n description: Learn how to send a legac"
},
{
"path": "content/docs/for-developers/sending-email/iis75.md",
"chars": 5939,
"preview": "---\nlayout: page\nweight: 0\ntitle: Microsoft IIS 7.5\ngroup: mail-servers\nnavigation:\n show: true\n---\n\n<call-out>\n\nThis d"
},
{
"path": "content/docs/for-developers/sending-email/integrating-with-the-smtp-api.md",
"chars": 2547,
"preview": "---\nseo:\n title: Integrating with the SMTP API\n description: Set your systems up to use SendGrid's SMTP API\n keywords"
},
{
"path": "content/docs/for-developers/sending-email/interspire.md",
"chars": 3798,
"preview": "---\nseo:\n title: Interspire Integration\n description: Interspire Integration\n keywords: marketing, interspire, integr"
},
{
"path": "content/docs/for-developers/sending-email/joomla.md",
"chars": 512,
"preview": "---\nlayout: page\nweight: 0\ntitle: Joomla\ngroup: open-source\nnavigation:\n show: true\n---\n\nJoomla supports sending email "
},
{
"path": "content/docs/for-developers/sending-email/laravel.md",
"chars": 5960,
"preview": "---\nlayout: page\nweight: 0\ngroup: frameworks\ntitle: Laravel\nseo:\n title: Send Email with Laravel & SendGrid\n descripti"
},
{
"path": "content/docs/for-developers/sending-email/libraries.md",
"chars": 13426,
"preview": "---\nlayout: page\nweight: 0\ntitle: API Libraries\ngroup: open-source\nseo:\n title: API Libraries & Clients - SendGrid Docu"
},
{
"path": "content/docs/for-developers/sending-email/mailpoet.md",
"chars": 617,
"preview": "---\nseo:\n title: How to integrate with MailPoet\n description: How to integrate with MailPoet\n keywords: deliverabilit"
},
{
"path": "content/docs/for-developers/sending-email/migrating-from-v2-to-v3-mail-send.md",
"chars": 5975,
"preview": "---\nseo:\n title: How To Migrate From v2 to v3 Mail Send\n description:\n keywords: migration, v2 mail send, v3 mail sen"
},
{
"path": "content/docs/for-developers/sending-email/modx.md",
"chars": 620,
"preview": "---\nlayout: page\nweight: 0\ntitle: MODX\ngroup: open-source\nnavigation:\n show: true\n---\n\nMODX supports sending email over"
},
{
"path": "content/docs/for-developers/sending-email/outlook-2013.md",
"chars": 2055,
"preview": "---\nlayout: page\nweight: 0\ntitle: Outlook 2013\ngroup: mail-clients\nnavigation:\n show: true\n---\n\nThese instructions will"
},
{
"path": "content/docs/for-developers/sending-email/outlook.md",
"chars": 2126,
"preview": "---\nlayout: page\nweight: 0\ntitle: Outlook 2007\ngroup: mail-clients\nnavigation:\n show: true\n---\n\nThese instructions will"
},
{
"path": "content/docs/for-developers/sending-email/personalizations.md",
"chars": 11220,
"preview": "---\nseo:\n title: Personalizations\n description: Learn how to use personalizations to customize your messages sent over"
},
{
"path": "content/docs/for-developers/sending-email/phpbb.md",
"chars": 502,
"preview": "---\nlayout: page\nweight: 0\ntitle: phpBB\ngroup: open-source\nnavigation:\n show: true\n---\n\nphpBB supports sending email ov"
},
{
"path": "content/docs/for-developers/sending-email/piesync.md",
"chars": 3081,
"preview": "---\nlayout: page\nweight: 0\ngroup: plugins\ntitle: Sync your SendGrid contacts using PieSync\nnavigation:\n show: true\nseo:"
},
{
"path": "content/docs/for-developers/sending-email/postfix.md",
"chars": 2727,
"preview": "---\nlayout: page\nweight: 0\ntitle: Postfix\ngroup: mail-servers\nseo:\n title: Integrate SendGrid with Postfix - SendGrid D"
},
{
"path": "content/docs/for-developers/sending-email/qmail.md",
"chars": 789,
"preview": "---\nlayout: page\nweight: 0\ntitle: Qmail\ngroup: mail-servers\nnavigation:\n show: true\n---\n\nQmail does not come with SMTP "
},
{
"path": "content/docs/for-developers/sending-email/quickstart-go.md",
"chars": 14146,
"preview": "---\nlayout: page\nweight: 0\ntitle: Email API Quickstart for Go\ngroup: api-v3\nnavigation:\n show: true\nseo:\n title: Email"
},
{
"path": "content/docs/for-developers/sending-email/quickstart-nodejs.md",
"chars": 13120,
"preview": "---\nlayout: page\nweight: 0\ntitle: Email API Quickstart for Node.js\ngroup: api-v3\nnavigation:\n show: true\nseo:\n title: "
},
{
"path": "content/docs/for-developers/sending-email/quickstart-php.md",
"chars": 14448,
"preview": "---\nlayout: page\nweight: 0\ntitle: Email API Quickstart for PHP\ngroup: api-v3\nnavigation:\n show: true\nseo:\n title: Emai"
},
{
"path": "content/docs/for-developers/sending-email/quickstart-python.md",
"chars": 14993,
"preview": "---\nlayout: page\nweight: 0\ntitle: Email API Quickstart for Python\ngroup: api-v3\nnavigation:\n show: true\nseo:\n title: E"
},
{
"path": "content/docs/for-developers/sending-email/quickstart-ruby.md",
"chars": 14005,
"preview": "---\nlayout: page\nweight: 0\ntitle: Email API Quickstart for Ruby\ngroup: api-v3\nnavigation:\n show: true\nseo:\n title: Ema"
},
{
"path": "content/docs/for-developers/sending-email/rubyonrails.md",
"chars": 3555,
"preview": "---\nlayout: page\nweight: 0\ngroup: frameworks\ntitle: Ruby on Rails\nseo:\n title: Send Email with Ruby on Rails\n descript"
},
{
"path": "content/docs/for-developers/sending-email/sandbox-mode.md",
"chars": 2737,
"preview": "---\nseo:\n title: Sandbox Mode\n description: Learn how to use Sandbox Mode when sending mail over SendGrid's Web API v3"
},
{
"path": "content/docs/for-developers/sending-email/scheduling-email.md",
"chars": 2501,
"preview": "---\nseo:\n title: Scheduling Email\n description: How can I schedule emails to send at specific times?\n keywords: drip,"
},
{
"path": "content/docs/for-developers/sending-email/scheduling-parameters.md",
"chars": 3754,
"preview": "---\nseo:\n title: Scheduling Parameters\n description: Scheduling an email with SMTP\n keywords: SMTP, send email, sched"
},
{
"path": "content/docs/for-developers/sending-email/section-tags.md",
"chars": 4683,
"preview": "---\nseo:\n title: Section Tags\n description: Section tags allow you to substitute in content in an SMTP message.\n keyw"
},
{
"path": "content/docs/for-developers/sending-email/segmentation-query-language.md",
"chars": 7362,
"preview": "---\nlayout: page\nweight: 0\ntitle: Segmentation Query Language Reference\ngroup: sending-email\nnavigation:\n show: true\nse"
},
{
"path": "content/docs/for-developers/sending-email/send-mime-messages-with-sendgrid.md",
"chars": 2496,
"preview": "---\nlayout: page\nweight: 10\ntitle: Send Mime Messages With SendGrid\ngroup: api-v3\nnavigation:\n show: true\n---\n\n## Sendi"
},
{
"path": "content/docs/for-developers/sending-email/sender-identity.md",
"chars": 2831,
"preview": "---\nlayout: page\ntitle: Sender Identity\ngroup: sending-email\nnavigation:\n show: false\nseo:\n title: Sender Identity\n o"
},
{
"path": "content/docs/for-developers/sending-email/sendmail.md",
"chars": 1726,
"preview": "---\nlayout: page\nweight: 0\ntitle: Sendmail\ngroup: mail-servers\nnavigation:\n show: true\n---\n\n<call-out type=\"warning\">\n\n"
},
{
"path": "content/docs/for-developers/sending-email/single-sends-2020-update.md",
"chars": 14444,
"preview": "---\nlayout: page\nweight: 0\ntitle: Single Sends 2020 Update\ngroup: sending-email\nnavigation:\n show: false\nseo:\n title: "
},
{
"path": "content/docs/for-developers/sending-email/smtp-errors-and-troubleshooting.md",
"chars": 7680,
"preview": "---\nseo:\n title: SMTP Errors and Troubleshooting\n description: SMTP Response codes and troubleshooting tips\n keywords"
},
{
"path": "content/docs/for-developers/sending-email/smtp-filters.md",
"chars": 13070,
"preview": "---\nlayout: page\nweight: 0\ntitle: SMTP Filters\ngroup: x-smtpapi\nnavigation:\n show: true\n---\n\nFollowing are the settings"
},
{
"path": "content/docs/for-developers/sending-email/smtp-go-code-example.md",
"chars": 347,
"preview": "---\nlayout: page\nweight: 0\ntitle: SMTP Go Code Example\ngroup: x-smtpapi\nnavigation:\n show: true\n---\n\n\nSendGrid recommen"
},
{
"path": "content/docs/for-developers/sending-email/smtp-nodejs-code-example.md",
"chars": 369,
"preview": "---\nlayout: page\nweight: 0\ntitle: SMTP Node.js Code Example\ngroup: x-smtpapi\nnavigation:\n show: true\n---\nSendGrid recom"
},
{
"path": "content/docs/for-developers/sending-email/smtp-perl-code-example.md",
"chars": 5249,
"preview": "---\nlayout: page\nweight: 0\ntitle: SMTP Perl Code Example\ngroup: x-smtpapi\nnavigation:\n show: true\n---\n\n<call-out type=\""
},
{
"path": "content/docs/for-developers/sending-email/smtp-php-code-example.md",
"chars": 350,
"preview": "---\nlayout: page\nweight: 0\ntitle: SMTP PHP Code Example\ngroup: x-smtpapi\nnavigation:\n show: true\n---\nSendGrid recommend"
},
{
"path": "content/docs/for-developers/sending-email/smtp-python-code-example.md",
"chars": 366,
"preview": "---\nlayout: page\nweight: 0\ntitle: SMTP Python Code Example\ngroup: x-smtpapi\nnavigation:\n show: true\n---\nSendGrid recomm"
},
{
"path": "content/docs/for-developers/sending-email/smtp-ruby-code-example.md",
"chars": 3142,
"preview": "---\nlayout: page\nweight: 0\ntitle: SMTP Ruby Code Example\ngroup: x-smtpapi\nnavigation:\n show: true\n---\n\nThese examples r"
},
{
"path": "content/docs/for-developers/sending-email/ssmtp.md",
"chars": 373,
"preview": "---\nlayout: page\nweight: 0\ntitle: ssmtp\ngroup: mail-servers\nnavigation:\n show: true\n---\n\nAdding SendGrid as a SMTP rela"
},
{
"path": "content/docs/for-developers/sending-email/stopping-a-scheduled-send.md",
"chars": 5402,
"preview": "---\nseo:\n title: Canceling a scheduled send\n description: Can I stop a scheduled email or campaign?\n keywords: pause,"
},
{
"path": "content/docs/for-developers/sending-email/stopping-an-in-progress-send.md",
"chars": 4145,
"preview": "---\nseo:\n title: Stopping an in-progress send\n description: Can I stop a send in progress?\n keywords: pause, halt, de"
},
{
"path": "content/docs/for-developers/sending-email/substitution-tags.md",
"chars": 5593,
"preview": "---\nseo:\n title: Substitution Tags\n description: Section tags allow you to substitute in content for individual recipi"
},
{
"path": "content/docs/for-developers/sending-email/sugarcrm.md",
"chars": 2534,
"preview": "---\nseo:\n title: SugarCRM Integration\n description: SugarCRM Integration\n keywords: CRM, sugarCRM, integration, smtp\n"
},
{
"path": "content/docs/for-developers/sending-email/suppressions.md",
"chars": 2673,
"preview": "---\nseo:\n title: Suppression Groups\n description: Suppression groups allow you to set up unsubscribe lists and options"
},
{
"path": "content/docs/for-developers/sending-email/symfony.md",
"chars": 5965,
"preview": "---\nlayout: page\nweight: 0\ngroup: frameworks\ntitle: Symfony\nseo:\n title: Send Email with Symfony & SendGrid\n descripti"
},
{
"path": "content/docs/for-developers/sending-email/thunderbird.md",
"chars": 2165,
"preview": "---\nlayout: page\nweight: 0\ntitle: Thunderbird\ngroup: mail-clients\nnavigation:\n show: true\n---\n\nTo send email using Thun"
},
{
"path": "content/docs/for-developers/sending-email/unique-arguments.md",
"chars": 3253,
"preview": "---\nseo:\n title: Unique Arguments\n description: Add unique arguments to customize your SMTP emails event tracking\n ke"
},
{
"path": "content/docs/for-developers/sending-email/upgrade-your-authentication-method-to-api-keys.md",
"chars": 6195,
"preview": "---\nseo:\n title: Upgrade your authentication method to API keys\n description: How to upgrade your authentication metho"
},
{
"path": "content/docs/for-developers/sending-email/using-handlebars.md",
"chars": 27290,
"preview": "---\nlayout: page\nweight: 50\ntitle: Using Handlebars\ngroup: api-v3\nnavigation:\n show: true\nseo:\n title: Using Handlebar"
},
{
"path": "content/docs/for-developers/sending-email/v2-csharp-code-example.md",
"chars": 3348,
"preview": "---\nlayout: page\nweight: 0\ntitle: v2 API C# Code Example\ngroup: api-v2\nnavigation:\n show: true\n---\n\n<call-out>\n\nWe reco"
},
{
"path": "content/docs/for-developers/sending-email/v2-go-code-example.md",
"chars": 1021,
"preview": "---\nlayout: page\nweight: 0\ntitle: v2 API Go Code Example\ngroup: api-v2\nnavigation:\n show: true\n---\n<call-out>\n\nWe recom"
},
{
"path": "content/docs/for-developers/sending-email/v2-java-code-example.md",
"chars": 1126,
"preview": "---\nlayout: page\nweight: 0\ntitle: v2 API Java Code Example\ngroup: api-v2\nnavigation:\n show: true\n---\n<call-out>\n\nWe rec"
},
{
"path": "content/docs/for-developers/sending-email/v2-nodejs-code-example.md",
"chars": 1070,
"preview": "---\nlayout: page\nweight: 0\ntitle: v2 API Node.js Code Example\ngroup: api-v2\nnavigation:\n show: true\n---\n<call-out>\n\nWe "
},
{
"path": "content/docs/for-developers/sending-email/v2-perl-code-example.md",
"chars": 3369,
"preview": "---\nlayout: page\nweight: 0\ntitle: v2 API Perl Code Example\ngroup: api-v2\nseo:\n title: Send Email with Perl and SendGrid"
},
{
"path": "content/docs/for-developers/sending-email/v2-php-code-example.md",
"chars": 5971,
"preview": "---\nlayout: page\nweight: 0\ntitle: v2 API PHP Code Example\ngroup: api-v2\nseo:\n override: true\n title: Send Email with P"
},
{
"path": "content/docs/for-developers/sending-email/v2-python-code-example.md",
"chars": 987,
"preview": "---\nlayout: page\nweight: 0\ntitle: v2 API Python Code Example\ngroup: api-v2\nnavigation:\n show: true\n---\n\n<call-out>\n\nWe "
},
{
"path": "content/docs/for-developers/sending-email/v2-ruby-code-example.md",
"chars": 2050,
"preview": "---\nlayout: page\nweight: 0\ntitle: v2 API Ruby Code Example\ngroup: api-v2\nnavigation:\n show: true\n---\n\n<call-out>\n\nWe re"
},
{
"path": "content/docs/for-developers/sending-email/v3-csharp-code-example.md",
"chars": 1557,
"preview": "---\nlayout: page\nweight: 0\ntitle: v3 API C# Code Example\ngroup: api-v3\nnavigation:\n show: true\n---\n\n<call-out>\n\nWe re"
},
{
"path": "content/docs/for-developers/sending-email/v3-go-code-example.md",
"chars": 1311,
"preview": "---\nlayout: page\nweight: 0\ntitle: v3 API Go Code Example\ngroup: api-v3\nnavigation:\n show: true\n---\n\n<call-out>\n\nWe reco"
},
{
"path": "content/docs/for-developers/sending-email/v3-java-code-example.md",
"chars": 1463,
"preview": "---\nlayout: page\nweight: 0\ntitle: v3 API Java Code Example\ngroup: api-v3\nnavigation:\n show: true\n---\n<call-out>\n\nWe rec"
},
{
"path": "content/docs/for-developers/sending-email/v3-kotlin-code-example.md",
"chars": 1003,
"preview": "---\nlayout: page\nweight: 0\ntitle: v3 API Kotlin Code Example\ngroup: api-v3\nnavigation:\n show: true\n---\n<call-out>\n\nWe r"
},
{
"path": "content/docs/for-developers/sending-email/v3-mail-send-faq.md",
"chars": 5852,
"preview": "---\nseo:\n title: v3 Mail Send FAQ\n description:\n keywords: v2 mail send, v3 mail send, faq, frequently asked question"
},
{
"path": "content/docs/for-developers/sending-email/v3-php-code-example.md",
"chars": 1081,
"preview": "---\nlayout: page\nweight: 0\ntitle: v3 API PHP Code Example\ngroup: api-v3\nseo:\n override: true\n title: Send Email with P"
},
{
"path": "content/docs/for-developers/sending-email/v3-python-code-example.md",
"chars": 1104,
"preview": "---\nlayout: page\nweight: 0\ntitle: v3 API Python Code Example\ngroup: api-v3\nnavigation:\n show: true\n---\n\n<call-out>\n\nWe "
},
{
"path": "content/docs/for-developers/sending-email/v3-ruby-code-example.md",
"chars": 1093,
"preview": "---\nlayout: page\nweight: 0\ntitle: v3 API Ruby Code Example\ngroup: api-v3\nnavigation:\n show: true\n---\n\n<call-out>\n\nWe re"
},
{
"path": "content/docs/for-developers/sending-email/wordpress-faq.md",
"chars": 6588,
"preview": "---\nseo:\n title: Wordpress FAQ\n description: Learn how to send your WordPress email through SendGrid.\n keywords: WordPre"
},
{
"path": "content/docs/for-developers/sending-email/wordpress-plugin.md",
"chars": 10256,
"preview": "---\nst:\n published_at: 2016-07-25\n type: [integrate]\nseo:\n title: SendGrid's WordPress Plugin\n description: Learn ho"
},
{
"path": "content/docs/for-developers/sending-email/wordpress-subscription-widget.md",
"chars": 14544,
"preview": "---\nst:\n published_at: 2016-07-25\n type: [integrate]\nseo:\n title: WordPress Subscription Widget\n description: Learn "
},
{
"path": "content/docs/for-developers/sending-email/zapier-sending-for-gravity-forms-submissions.md",
"chars": 3272,
"preview": "---\nseo:\n title: Sending New Emails via SendGrid For New Gravity Forms Submissions\n description: Learn how to send an "
},
{
"path": "content/docs/for-developers/sending-email/zapier-sending-for-new-webhook-data.md",
"chars": 2994,
"preview": "---\nseo:\n title: Send Emails Through SendGrid For New Caught Webhook Data\n description: Learn how to receive a SendGri"
},
{
"path": "content/docs/for-developers/sending-email/zapier-sending-for-postgre-sql-row-matches.md",
"chars": 3935,
"preview": "---\nseo:\n title: Sending SendGrid Emails For New PostgreSQL Custom Query Row Matches\n description: Learn how to use Za"
},
{
"path": "content/docs/for-developers/sending-email/zapier-sending-from-google-sheet-rows.md",
"chars": 3205,
"preview": "---\nseo:\n title: Sending SendGrid Emails From New Google Sheets Rows\n description: Learn how to use Zapier to automati"
},
{
"path": "content/docs/for-developers/sending-email/zapier-sending-to-tagged-infusionsoft-contacts.md",
"chars": 3399,
"preview": "---\nseo:\n title: Sending Emails From SendGrid to Tagged Infusionsoft Contacts\n description: Learn how to use Zapier to"
},
{
"path": "content/docs/for-developers/sending-email/zapier-sending-when-new-firebase-child-records-added.md",
"chars": 3560,
"preview": "---\nseo:\n title: Sending SendGrid Email When New Firebase Child Records Are Added\n description: Learn how to use Zapie"
},
{
"path": "content/docs/for-developers/sending-email/zend.md",
"chars": 1205,
"preview": "---\nlayout: page\nweight: 0\ngroup: frameworks\ntitle: Zend\nseo:\n title: Send Email with Zend & SendGrid\n description: Vi"
},
{
"path": "content/docs/for-developers/tracking-events/analytics-with-keen-io.md",
"chars": 9385,
"preview": "---\nseo:\n title: Keen Integration\n description: Analyze, Visualize, and Store SendGrid Email Event Data\n keywords: Ke"
},
{
"path": "content/docs/for-developers/tracking-events/csharp-code-example.md",
"chars": 3637,
"preview": "---\nlayout: page\nweight: 10\ntitle: Event Webhook C# Code Example\ngroup: code-examples\nnavigation:\n show: true\n---\n\n## \t"
},
{
"path": "content/docs/for-developers/tracking-events/event-kit.md",
"chars": 1723,
"preview": "---\nseo:\n title: SendGrid EventKit\n description: Learn how to better track your data with the open source SendGrid Eve"
},
{
"path": "content/docs/for-developers/tracking-events/event.md",
"chars": 32969,
"preview": "---\nseo:\n title: Event Webhook Reference\n description: Full Event Webhook event list and descriptions, event examples,"
},
{
"path": "content/docs/for-developers/tracking-events/getting-started-event-webhook-security-features.md",
"chars": 16983,
"preview": "---\nlayout: page\nweight: 0\ntitle: Getting Started with the Event Webhook Security Features\ngroup: getting-started\nnaviga"
},
{
"path": "content/docs/for-developers/tracking-events/getting-started-event-webhook.md",
"chars": 6843,
"preview": "---\nseo:\n title: Getting started with the Event Webhook\n description: Use RequestBin to get started or to troubleshoot"
},
{
"path": "content/docs/for-developers/tracking-events/go-code-example.md",
"chars": 1768,
"preview": "---\nlayout: page\nweight: 10\ntitle: Event Webhook Go Code Example\ngroup: code-examples\nnavigation:\n show: true\n---\n\n## \t"
},
{
"path": "content/docs/for-developers/tracking-events/google-amp-for-email.md",
"chars": 3213,
"preview": "---\nlayout: page\nweight: 0\ngroup: partners\ntitle: SendGrid and Google AMP for Email\nseo:\n title: SendGrid and Google AM"
},
{
"path": "content/docs/for-developers/tracking-events/nodejs-code-example.md",
"chars": 2128,
"preview": "---\nlayout: page\nweight: 10\ntitle: Event Webhook Node.js Code Example\ngroup: code-examples\nnavigation:\n show: true\n---\n"
},
{
"path": "content/docs/for-developers/tracking-events/php-code-example.md",
"chars": 1640,
"preview": "---\nlayout: page\nweight: 10\ntitle: Event Webhook PHP Code Example\ngroup: code-examples\nnavigation:\n show: true\n---\n\n## "
},
{
"path": "content/docs/for-developers/tracking-events/python-code-example.md",
"chars": 1831,
"preview": "---\nlayout: page\nweight: 10\ntitle: Event Webhook Python Code Example\ngroup: code-examples\nnavigation:\n show: true\n---\n\n"
},
{
"path": "content/docs/for-developers/tracking-events/segment-sendgrid-source.md",
"chars": 8203,
"preview": "---\nlayout: page\nweight: 100\ntitle: SendGrid Source\ngroup: partners\nseo:\n description: Learn how to integrate your Send"
},
{
"path": "content/docs/for-developers/tracking-events/troubleshooting.md",
"chars": 3127,
"preview": "---\nseo:\n title: Troubleshooting the Event Webhook\n description: Tips and tricks to troubleshoot your SendGrid Event W"
},
{
"path": "content/docs/glossary/7-bit-encoding.md",
"chars": 1002,
"preview": "---\nseo:\n title: ASCII Encoding\n description: 7 bit encoding is the same as ASCII encoding, which is used for storing "
},
{
"path": "content/docs/glossary/a-record.md",
"chars": 771,
"preview": "---\nseo:\n title: A Record\n description: The A record links an IP address to a domain\n keywords: A record, DNS, domain"
},
{
"path": "content/docs/glossary/account-reputation-dashboard.md",
"chars": 4314,
"preview": "---\nseo:\n title: Account Reputation Dashboard\n description: We base your email monitoring reputation on your bounces, "
},
{
"path": "content/docs/glossary/ad-exchange.md",
"chars": 332,
"preview": "---\nlayout: page\nweight: 0\ntitle: Ad Exchange\ngroup: glossary\nseo:\n title: Ad Exchange\n description: Definition of an "
},
{
"path": "content/docs/glossary/ad-impression.md",
"chars": 286,
"preview": "---\nlayout: page\nweight: 0\ntitle: Ad Impression\ngroup: glossary\nseo:\n title: Ad Impression\n description: Definition of"
},
{
"path": "content/docs/glossary/ad-unit.md",
"chars": 279,
"preview": "---\nlayout: page\nweight: 0\ntitle: Ad Unit\ngroup: glossary\nseo:\n title: Ad Unit\n description: Definition of an Ad Unit\n"
},
{
"path": "content/docs/glossary/affiliate-marketing.md",
"chars": 407,
"preview": "---\nlayout: page\nweight: 0\ntitle: Affiliate Marketing\ngroup: glossary\nseo:\n title: Affiliate Marketing\n description: D"
},
{
"path": "content/docs/glossary/allow-list.md",
"chars": 1119,
"preview": "---\nseo:\n title: Allow list\n description: Allow listing refers to granting IPs access to a server or system.\n keyword"
},
{
"path": "content/docs/glossary/automated-email.md",
"chars": 1653,
"preview": "---\nlayout: page\nweight: 0\ntitle: Automated Email\nnavigation:\n show: false\nseo:\n title: Automated Email\n override: tr"
},
{
"path": "content/docs/glossary/autoresponder.md",
"chars": 1339,
"preview": "---\nseo:\n title: Autoresponder\n description: Autoresponders generate email responses to actions and events.\n keywords"
},
{
"path": "content/docs/glossary/bayesian-filter.md",
"chars": 1221,
"preview": "---\nseo:\n title: Bayesian Filter\n description: Bayesian Filtering is a technique for detecting spam.\n keywords: Bayes"
},
{
"path": "content/docs/glossary/blocks.md",
"chars": 1409,
"preview": "---\nseo:\n title: Blocks\n description: Blocked emails happen when your IP address has been added to a deny list or has "
},
{
"path": "content/docs/glossary/bounces.md",
"chars": 2162,
"preview": "---\nseo:\n title: Bounces\n description: Bounced emails are emails that are returned to the server that sent them.\n key"
},
{
"path": "content/docs/glossary/bulk-email-service.md",
"chars": 2455,
"preview": "---\nseo:\n title: Bulk Email Service\n description: Bulk email service is a way to send an email, or multiple emails, to"
},
{
"path": "content/docs/glossary/bulk-mail-folder.md",
"chars": 816,
"preview": "---\nseo:\n title: Spam Folder\n description: Bulk Mail folder is also called “spam” or “junk” folder, the folder where q"
},
{
"path": "content/docs/glossary/campaigns.md",
"chars": 641,
"preview": "---\nseo:\n title: Campaigns\n description: Campaigns are used to send custom emails to targeted recipient segments.\n ke"
},
{
"path": "content/docs/glossary/can-spam.md",
"chars": 1742,
"preview": "---\nlayout: page\nweight: 0\ntitle: CAN-SPAM\nnavigation:\n show: false\nseo:\n title: CAN-SPAM\n override: true\n descripti"
},
{
"path": "content/docs/glossary/categories.md",
"chars": 2515,
"preview": "---\nlayout: page\nweight: 0\ntitle: Categories\nnavigation:\n show: false\nseo:\n title: Categories\n override: true\n descr"
},
{
"path": "content/docs/glossary/challenge-response.md",
"chars": 922,
"preview": "---\nseo:\n title: Challenge Response\n description: An automated reply to a sender to filter out spammers.\n keywords: r"
},
{
"path": "content/docs/glossary/clicks.md",
"chars": 1676,
"preview": "---\nlayout: page\nweight: 0\ntitle: Clicks and Unique Clicks\nnavigation:\n show: false\nseo:\n title: Clicks and Unique Cli"
},
{
"path": "content/docs/glossary/cname.md",
"chars": 1111,
"preview": "---\nlayout: page\nweight: 0\ntitle: CNAME\nseo:\n title: CNAME\n override: true\n description: The CNAME record creates an "
},
{
"path": "content/docs/glossary/complaint.md",
"chars": 903,
"preview": "---\nseo:\n title: Complaint\n description: When an email recipient identifies an email message as spam or junk by clicki"
},
{
"path": "content/docs/glossary/ctr.md",
"chars": 4217,
"preview": "---\nseo:\n title: Click-Through Rate (CTR)\n description: What is CTR?\n keywords: CTR, click, rate, tctr, clicks, throu"
},
{
"path": "content/docs/glossary/custom-fields.md",
"chars": 815,
"preview": "---\nseo:\n title: Custom Fields\n description: Custom fields allow you add extra information about your contacts to your"
},
{
"path": "content/docs/glossary/deferrals.md",
"chars": 1187,
"preview": "---\nseo:\n title: Deferral\ntitle: Deferral\nweight: 0\nlayout: page\nnavigation:\n show: false\n---\n\nA deferred status can o"
},
{
"path": "content/docs/glossary/deliverability.md",
"chars": 2407,
"preview": "---\nseo:\n title: Deliverability\n description: Email deliverability is a critical component for all email communication"
},
{
"path": "content/docs/glossary/deliveries.md",
"chars": 1607,
"preview": "---\nseo:\n title: Delivery\n description: A delivery is recorded when a request to send an email results in the delivery"
},
{
"path": "content/docs/glossary/demand-side-platform.md",
"chars": 460,
"preview": "---\nlayout: page\nweight: 0\ntitle: Demand-Side Platform (DSP)\ngroup: glossary\nseo:\n title: Demand-Side Platform (DSP)\n "
},
{
"path": "content/docs/glossary/deny-list.md",
"chars": 5344,
"preview": "---\nseo:\n title: Deny list\n description: A list of IP addresses that are known to send unsolicited or unwanted emails\n"
},
{
"path": "content/docs/glossary/direct-response-advertising.md",
"chars": 541,
"preview": "---\nlayout: page\nweight: 0\ntitle: Direct Response Advertising\ngroup: glossary\nseo:\n title: Direct Response Advertising "
},
{
"path": "content/docs/glossary/dkim.md",
"chars": 3058,
"preview": "---\nseo:\n title: DKIM\n description: DKIM is an email authentication protocol that helps ISPs better identify legitimat"
},
{
"path": "content/docs/glossary/dmarc.md",
"chars": 2062,
"preview": "---\nlayout: page\nweight: 0\ntitle: DMARC\nnavigation:\n show: false\nseo:\n title: DMARC \n override: true\n---\n\nDomain-base"
},
{
"path": "content/docs/glossary/dns.md",
"chars": 2060,
"preview": "---\nlayout: page\nweight: 0\ntitle: DNS\nnavigation:\n show: false\nseo:\n title: Domain Name System (DNS)\n override: true\n"
},
{
"path": "content/docs/glossary/domain-authentication.md",
"chars": 2292,
"preview": "---\nseo:\n title: Domain authentication\ntitle: Domain authentication\nweight: 0\nlayout: page\nnavigation:\n show: false\n--"
},
{
"path": "content/docs/glossary/domain.md",
"chars": 951,
"preview": "---\nseo:\n title: Domain\n description: A named internet address that resolves to an IP address\n keywords: domain, url,"
},
{
"path": "content/docs/glossary/drip-campaign.md",
"chars": 1250,
"preview": "---\nlayout: page\nweight: 0\ntitle: Drip Campaign\nnavigation:\n show: false\nseo:\n title: Drip Campaign\n override: true\n "
},
{
"path": "content/docs/glossary/drops.md",
"chars": 3907,
"preview": "---\nseo:\n title: Drops\ntitle: Drops\nweight: 0\nlayout: page\nnavigation:\n show: false\n---\n\nIn certain cases, SendGrid wi"
},
{
"path": "content/docs/glossary/email-api-integration.md",
"chars": 3769,
"preview": "---\nseo:\n title: Email API Integration\n description: Email API integration allows senders to easily sync their email s"
},
{
"path": "content/docs/glossary/email-authentication.md",
"chars": 638,
"preview": "---\nseo:\n title: Email Authentication\n description: Technical standards to help ISPs and other receivers validate the "
},
{
"path": "content/docs/glossary/email-harvesting.md",
"chars": 1081,
"preview": "---\nseo:\n title: Email Harvesting\n description: Email harvesting is the process of obtaining lists, either by purchase"
},
{
"path": "content/docs/glossary/email-marketing.md",
"chars": 2744,
"preview": "---\nseo:\n title: Email Marketing\n description: Email Marketing represent the email communications sent to promote a co"
},
{
"path": "content/docs/glossary/email-service-provider.md",
"chars": 1201,
"preview": "---\nseo:\n title: Email Service Provider\n description: An email service provider provides transactional and marketing e"
},
{
"path": "content/docs/glossary/event-webhook.md",
"chars": 4236,
"preview": "---\nseo:\n title: Event Webhook\n description: Event Webhooks provides data about the email you send when the user takes"
},
{
"path": "content/docs/glossary/expandable-banner.md",
"chars": 306,
"preview": "---\nlayout: page\nweight: 0\ntitle: Expandable Banner\ngroup: glossary\nseo:\n title: Expandable Banner\n description: Defin"
},
{
"path": "content/docs/glossary/expired.md",
"chars": 1037,
"preview": "---\nseo:\n title: Expired\n description: Bounced - Expired emails are emails that are unable to be delivered within 72 h"
},
{
"path": "content/docs/glossary/feedback-loop.md",
"chars": 426,
"preview": "---\nseo:\n title: Feedback Loop\n override: true\n description: A feedback loop is the process by which an ISP forwards "
},
{
"path": "content/docs/glossary/flighting-in-advertising.md",
"chars": 334,
"preview": "---\nlayout: page\nweight: 0\ntitle: Flighting in Advertising\ngroup: glossary\nseo:\n title: Flighting in Advertising\n desc"
},
{
"path": "content/docs/glossary/fqdn.md",
"chars": 1210,
"preview": "--\nseo:\n title: Fully Qualified Domain Name (FQDN)\n description: Definition of a fully qualified domain name as it rel"
},
{
"path": "content/docs/glossary/frequency-capping.md",
"chars": 353,
"preview": "---\nlayout: page\nweight: 0\ntitle: Frequency Capping\ngroup: glossary\nseo:\n title: Frequency Capping\n description: Defin"
},
{
"path": "content/docs/glossary/gdpr.md",
"chars": 6234,
"preview": "---\nseo:\n title: General Data Protection Regulation (GDPR)\n description: The General Data Protection Regulation (GDPR)"
},
{
"path": "content/docs/glossary/header.md",
"chars": 895,
"preview": "---\nlayout: page\nweight: 0\ntitle: Header\nnavigation:\n show: false\nseo:\n title: Header\n override: true\n description: "
},
{
"path": "content/docs/glossary/imap.md",
"chars": 824,
"preview": "---\nlayout: page\nweight: 0\ntitle: IMAP\nnavigation:\n show: false\nseo:\n title: IMAP - Internet Message Access Protocol\n "
},
{
"path": "content/docs/glossary/invalid-email.md",
"chars": 663,
"preview": "---\nlayout: page\nweight: 0\ntitle: Invalid Email\nnavigation:\n show: false\nseo:\n title: Invalid Email\n override: true\n "
},
{
"path": "content/docs/glossary/ip-address.md",
"chars": 1329,
"preview": "---\nseo:\n title: IP Address\n description: A unique numerical address that defines an internet location.\n keywords:\nti"
},
{
"path": "content/docs/glossary/ip-warmup.md",
"chars": 1998,
"preview": "---\nlayout: page\nweight: 0\ntitle: IP Warmup\nnavigation:\n show: false\nseo:\n title: IP Warmup\n override: true\n descrip"
},
{
"path": "content/docs/glossary/link-branding.md",
"chars": 1794,
"preview": "---\nseo:\n title: Link branding\ntitle: Link branding\nweight: 0\nlayout: page\nnavigation:\n show: false\n---\n\nEmail link br"
},
{
"path": "content/docs/glossary/lists.md",
"chars": 695,
"preview": "---\nseo:\n title: Lists\n description: Lists are simply static collections of Marketing Campaigns contacts.\n keywords:\n"
},
{
"path": "content/docs/glossary/mail-merge.md",
"chars": 1339,
"preview": "---\nlayout: page\nweight: 0\ntitle: Mail Merge\nnavigation:\n show: false\nseo:\n title: Mail Merge\n override: true\n descr"
},
{
"path": "content/docs/glossary/mailbox-provider.md",
"chars": 531,
"preview": "---\nseo:\n title: Mailbox Provider\n description: An email service provider provides transactional and marketing email s"
},
{
"path": "content/docs/glossary/message-id.md",
"chars": 1333,
"preview": "---\nlayout: page\nweight: 0\ntitle: SendGrid Message ID\nnavigation:\n show: false\nseo:\n title: Message ID\n override: tru"
},
{
"path": "content/docs/glossary/mta.md",
"chars": 803,
"preview": "---\nseo:\n title: MTA\n description: MTA stands for Mail Transfer Agent. It is software that transfers electronic mail m"
},
{
"path": "content/docs/glossary/mx-record.md",
"chars": 526,
"preview": "---\nlayout: page\nweight: 0\ntitle: MX Record\nnavigation:\n show: false\nseo:\n title: MX Record\n override: true\n descrip"
},
{
"path": "content/docs/glossary/native-advertising.md",
"chars": 527,
"preview": "---\nlayout: page\nweight: 0\ntitle: Native Advertising\ngroup: glossary\nseo:\n title: Native Advertising\n description: Def"
},
{
"path": "content/docs/glossary/open-rate.md",
"chars": 1335,
"preview": "---\nlayout: page\nweight: 0\ntitle: Open Rate\nnavigation:\n show: false\nseo:\n title: Open Rate\n override: true\n descrip"
}
]
// ... and 427 more files (download for full content)
About this extraction
This page contains the full source code of the sendgrid/docs GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 627 files (40.7 MB), approximately 789.3k tokens, and a symbol index with 306 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.