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: ## 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. ## Improvements to the Codebase We welcome direct contributions to the SendGrid docs code base. Thank you! ## Local Setup ### Dependencies * Required: * Git * Rvm * Homebrew * npm * Gatsby ### 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) ## 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. ### 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. #### 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 `
CssMinify.yml. Preprocessing and options can be specified
via `_plugins/jekyll_asset_pipeline.rb`.
## 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 | headers | The raw headers of the email. |
|---|---|
| dkim | A string containing the verification results of any DKIM and domain keys signatures in the message. |
| content-ids | A string containing the number of attachments. |
| to | Email recipient field, as taken from the message headers. |
| Text | Email body in plaintext formatting. |
| html | HTML body of email. If not set, email did not have an HTML body. |
| from | Email sender, as taken from the message headers. |
| sender_ip | A string of the sender’s ip address. |
| spam_report | Spam Assassin’s spam report. |
| envelope | A string containing the SMTP envelope. This will have 2 variables: to, which is a single-element array containing the address that we received the email to, and from, which is the return path for the message. |
| attachments | Number of attachments included in email. |
| subject | Email Subject. |
| spam_score | Spam Assassin’s rating for whether or not this is spam. |
| attachment-info | A JSON map where the keys are named attachment{X}. Each attachment key points to a JSON object containing three fields, filename, type, and content-id. The filename field is the name of the file (if it was provided). The type field is the media type of the file. X |
| charsets | A string containing the character sets of the fields extracted from the message. |
| SPF | The results of the Sender Policy Framework verification of the message sender and receiving IP address. |
| dkim | A string containing the verification results of any DKIM and domain keys signatures in the message. |
|---|---|
| A string containing the email headers, date, body, and attachments | |
| To | Email recipient field as taken from the message headers. |
| cc | Email cc field, as taken from the message headers. |
| From | Email sender, as taken from the message headers. |
| Text | Email body in plaintext formatting. |
| html | HTML body of email. If not set, email did not have an HTML body. |
| Sender IP | Email sender IP address. |
| Spam Report | Spam Assassin’s spam report. |
| Envelope | A string containing the SMTP envelope. This will have 2 variables: to, which is an single-element array containing the addresses that received the email, and from, which is the return path for the message. |
| Subject | Email subject. |
| Spam_Score | Spam Assassin’s rating for whether or not this is spam. |
| Charsets | A string containing the character sets of the fields extracted from the message. |
| SPF | The results of the Sender Policy Framework verification of the message sender and receiving IP address. |
Hello {{name}},
The body of your email would go here...
I'm an HTML body
", 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", "I'm an HTML body
", 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).| URI Parameter | Required | Requirements | Description |
|---|---|---|---|
| require_tls | False | true or false | Require recipient TLS support |
| require_valid_cert | False | true or false | Require certificates to be valid |
| Query | Unencoded example |
|---|---|
msg_id |
msg_id="filter0307p1las1-16816-5A023E36-1.0" |
from_email |
from_email="testing@sendgrid.net" |
subject |
subject="This is a subject test" |
to_email |
to_email="example@example.com" |
status |
status="processed" |
template_id |
template_id="8f0d27bc-cf8f-42d3-b951-3990af7d0619" |
template_name |
template_name="example_template" |
campaign_name |
campaign_name="example_campaign" |
campaign_id |
campaign_id="1453849" |
api_key_id |
api_key_id="SG.xxxxxxxxxxxxxxxx" (everything before the middle dot in the API key) |
events |
(Contains(events,"processed")) |
categories - custom tags that you create |
(Contains(categories,"categories_example")) |
unique_args - custom tracking arguments that you can attach to SMTP API calls |
unique_args="example argument" |
outbound_ip - this is the SendGrid dedicated IP address used to send the email |
outbound_ip="4.77.777.77" |
last_event_time |
last_event_time="2017-11-07T23:13:58Z" |
clicks |
clicks="0" |
asm_group_id |
asm_group_id="1041" |
teammate - teammates username |
teammate="my_username" |








{{ $test_message }}
``` ## Sending an email Now that we have our Mailable Class created, all we need to do is run this code: ```php 'This is a test!']; Mail::to('john@example.com')->send(new TestEmail($data)); ``` ## Adding a category or custom field Categories in SendGrid allow you to split your statistics into sections. Another useful tool is event notifications. If you want to complete the feedback loop for your product you can pass identifiers as a header which relate to a record in your database which you can then parse the notifications against that record to track deliveries/opens/clicks/bounces. The `withSwiftMessage` method of the `Mailable` base class allows you to register the callback that is invoked with the raw SwiftMailer message instance before sending the message. This knowledge allows you to customize the message before delivery. To customize your message, use something similar to this: ```php data = $data; } public function build() { $address = 'janeexampexample@example.com'; $subject = 'This is a demo!'; $name = 'Jane Doe'; $headerData = [ 'category' => 'category', 'unique_args' => [ 'variable_1' => 'abc' ] ]; $header = $this->asString($headerData); $this->withSwiftMessage(function ($message) use ($header) { $message->getHeaders() ->addTextHeader('X-SMTPAPI', $header); }); return $this->view('emails.test') ->from($address, $name) ->cc($address, $name) ->bcc($address, $name) ->replyTo($address, $name) ->subject($subject) ->with([ 'data' => $this->data ]); } private function asJSON($data) { $json = json_encode($data); $json = preg_replace('/(["\]}])([,:])(["\[{])/', '$1$2 $3', $json); return $json; } private function asString($data) { $json = $this->asJSON($data); return wordwrap($json, 76, "\n "); } } ``` ================================================ FILE: content/docs/for-developers/sending-email/libraries.md ================================================ --- layout: page weight: 0 title: API Libraries group: open-source seo: title: API Libraries & Clients - SendGrid Documentation | SendGrid override: true description: Send email and interact with SendGrid using your favorite language including Python, Go, Node.js, Ruby, PHP, Java, C#, Perl, Objective-C, and more. navigation: show: true --- These libraries allow quick integration between SendGrid and your project, and are available for a variety of languages and frameworks. ## Official libraries SendGrid maintains the following official libraries for mail sending. - [sendgrid-csharp](https://github.com/sendgrid/sendgrid-csharp) - Official C\# Library - [sendgrid-go](https://github.com/sendgrid/sendgrid-go) - Official Go Library - [sendgrid-java](https://github.com/sendgrid/sendgrid-java) - Official Java Library - [sendgrid-nodejs](https://github.com/sendgrid/sendgrid-nodejs) - Official NodeJS Library - [sendgrid-php](https://github.com/sendgrid/sendgrid-php) - Official PHP Library - [sendgrid-python](https://github.com/sendgrid/sendgrid-python) - Official Python Library - [sendgrid-ruby](https://github.com/sendgrid/sendgrid-ruby) - Official Ruby Library The following official libraries are maintained by SendGrid to create [SMTP API Headers]({{root_url}}/for-developers/sending-email/building-an-smtp-email/), they are included in the above official libraries. - [smtpapi-csharp](https://github.com/sendgrid/smtpapi-csharp) - Official C\# SMTP API library - [smtpapi-go](https://github.com/sendgrid/smtpapi-go) - Official Go SMTP API library - [smtpapi-java](https://github.com/sendgrid/smtpapi-java) - Official Java SMTP API library - [smtpapi-nodejs](https://github.com/sendgrid/smtpapi-nodejs) - Official NodeJS SMTP API library - [smtpapi-php](https://github.com/sendgrid/smtpapi-php) - Official PHP SMTP API library - [smtpapi-python](https://github.com/sendgrid/smtpapi-python) - Official Python SMTP API library - [smtpapi-ruby](https://github.com/sendgrid/smtpapi-ruby) - Official Ruby SMTP API library The following official library is maintained by SendGrid to use the [Event Webhook]({{root_url}}/for-developers/tracking-events/event/): - [EventKit](https://github.com/sendgrid/eventkit-rails) *by SendGrid* - An app to consume and store SendGrid Events.Thanks for joining and have a great day! Now sign in and do awesome things!
``` If you don't have a user model quite yet, generate one quickly. ``` bash $ rails generate scaffold user name email login $ rake db:migrate ``` Now in the controller for the user model `app/controllers/users_controller.rb`, add a call to `UserNotifierMailer.send_signup_email` when a user is saved. ``` ruby class UsersController < ApplicationController def create # Create the user from params @user = User.new(user_params) if @user.save # Deliver the signup email UserNotifierMailer.send_signup_email(@user).deliver redirect_to(@user, :notice => 'User created') else render :action => 'new' end end private def user_params params.require(:user).permit(:name, :email, :login) end end ``` Alright, now we're cooking! Let's get it all going through SendGrid. ## Configure ActionMailer to Use SendGrid In `config/environment.rb` specify your ActionMailer settings to point to SendGrid's servers. ``` ruby ActionMailer::Base.smtp_settings = { :user_name => 'apikey', # This is the string literal 'apikey', NOT the ID of your API key :password => '
You have registered for the following event:
:event_details.
You have registered for the following event:
New User Event on Jan 1.
You have registered for the following event:
Veteran User Appreciation on Feb 14.
You have registered for the following event:
New User Event on Aug 11.
| Operator | Associativity | Operands |
|---|---|---|
| AND | Left | 2 |
| OR | Left | 2 |
| NOT | Right | 2 (binary) |
| NOT | Right | 1 (unary) |
| Operator | Associativity | Operands | Supported Types |
|---|---|---|---|
| - | Left | 2 (binary) | Numeric - Numeric DateTime - Interval |
| + | Left | 2 | Numeric + Numeric DateTime + Interval String + String (concatenation) |
| / | Left | 2 | Numeric / Numeric |
| * | Left | 2 | Numeric * Numeric |
| % | Left | 2 | Numeric % Numeric (modulo) |
| - | Left | 1 (unary) | - Numeric |
| Operator | Supported Types (T represents any type) |
|---|---|
| = | T = T |
| != | T != T |
| < | Numeric < Numeric DateTime < DateTime String < String |
| > | Numeric < Numeric DateTime < DateTime String < String |
| <= | Numeric < Numeric DateTime < DateTime String < String |
| >= | Numeric < Numeric DateTime < DateTime String < String |
| LIKE/ NOT LIKE | String (NOT) LIKE String |
| IS (NOT) | T is (NOT) NULL |
| (NOT) IN | T IN (T) |
| (NOT) BETWEEN | Numeric (NOT) BETWEEN Numeric AND Numeric DateTime (NOT) BETWEEN DateTime AND DateTime String (NOT) BETWEEN String AND String |
|
Field: Existing Single Sends API |
Field: Updated Single Sends API |
Notes |
Response or Request Field |
Data Type |
|
|
|
Both |
|
|
|
|
|
Both |
|
|
|
|
|
Moved to |
Both |
|
|
|
|
Response |
|
|
|
|
|
Moved to |
Both |
|
|
|
|
Response |
|
|
|
|
|
Moved to |
Both |
|
|
|
|
Moved to |
Both |
|
|
|
|
Moved to |
Both |
|
|
|
|
Both |
|
|
|
|
NA |
|
||
|
|
|
Response |
|
|
|
|
|
Response |
|
|
|
|
|
Moved to |
Both |
|
|
NA |
|
Both |
|
|
|
NA |
|
Both |
|
|
|
NA |
|
Both |
|
|
|
NA |
|
Both |
string |
|
|
NA |
|
Both |
|
|
|
NA |
|
Request |
|
|
|
NA |
|
Both |
|
| Error | Message | Explanation |
|---|---|---|
| 250 | `Queued mail for delivery` | Your mail has been successfully queued! This response indicates that the recipient server has accepted the message. |
| 403 | `You are not authorized to send from that email address` | This means the "from" address does not match a verified Sender Identity. Mail cannot be sent until this error is resolved. To learn how to resolve this error, see our [Sender Identity requirements]({{root_url}}for-developers/sending-email/sender-identity/). |
| 421 | `Message from (X.X.X.X) temporarily deferred` | Messages are temporarily deferred because of recipient server policy - often it's because of too many messages or connections in too short of a timeframe. We continue to retry deferred messages for up to 72 hours. Consider temporarily sending less messages to a domain that is returning this code because this could further delay your messages currently being tried. |
| 450 | `too frequent connects from 198.37.147.135, please try again later.` | The message failed because the recipient's mailbox was unavailable, perhaps because it was locked or was not routable at the time. We continue to retry messages for up to 72 hours. Consider temporarily sending less messages to a domain that is returning this code because this could further delay your messages currently being tried. |
| 451 | `Temporary local problem - please try later` | The message simply failed, usually due to a far-end server error. We continue to retry messages for up to 72 hours. |
| 451 | `Authentication failed: Maximum credits exceeded` | There is a credit limit of emails per day enforced in error. Contact support to remove that limit. |
| 452 | `Too many recipients received this hour (throttled)` | The message has been deferred due to insufficient system storage. We continue to retry messages for up to 72 hours. |
| 550 | `Requested action not taken: mailbox unavailable` | The user’s mailbox was unavailable. Usually because it could not be found, or because of incoming policy reasons. Remove these address from your list - it is likely a fake, or it was mistyped. |
| 551 | `User does not exist.` | The intended mailbox does not exist on this recipient server. Remove these addresses from your list. |
| 552 | `This message is larger than the current system limit or the recipient’s mailbox is full. Create a shorter message body or remove attachments and try sending it again.` | The recipients mailbox has exceeded its storage limits. We don't resend messages with this error code because this is usually a sign this is an abandoned email. |
| 553 | `Invalid/inactive user.` | The message was refused because the mailbox name is either malformed or does not exist. Remove these addresses from your list. |
| 554 | `ERROR: Mail refused` | This is a default response that can be caused by a lot of issues. There is often a human readable portion of this error that gives more detailed information, but if not, remove these addresses from your list. |
| Other | `Delayed Bounce - Unable to Parse Server Reason` | This is what SendGrid displays when the reciepients server returns a blank reason code. |
Sends a BCC copy of the email created in this transaction to the address specified.
| Parameter Name | Parameter Value | Parameter Description |
|---|---|---|
| enable | 0 | 1 |
Disable or enable this Setting |
email |
email address destination for the bcc message |
| Parameter Name | Parameter Value | Parameter Description |
|---|---|---|
| enable | 0 | 1 |
Disable or enable this Setting |
| Parameter Name | Parameter Value | Parameter Description |
|---|---|---|
| enable | 0 | 1 |
Disable or enable this Setting |
| enable_text | true | false |
Enable or Disable click-tracking links in the Plain-Text portion of the message. |
| Parameter Name | Parameter Value | Parameter Description |
|---|---|---|
| domain | domain |
The domain you would like your DKIM certification signed with |
| use_from | 0 | 1 |
If enabled, the domain in the From: header of the email will be used to sign your DKIM |
| Parameter Name | Parameter Value | Parameter Description |
|---|---|---|
| enable | 0 | 1 |
Disable or enable this Setting |
| text/html | string |
String containing html body |
| text/plain | string |
String containing text body |
Thanks,
The SendGrid Team
", "text/plain": "Thanks,\n The SendGrid Team" } } } } ``` ## Filter: ganalytics Re-writes links to integrate with Google Analytics.
| Parameter Name | Parameter Value | Parameter Description |
|---|---|---|
| enable | 0 | 1 |
Disable or enable this Setting |
| utm_source | string |
Value for the utm_source field |
| utm_medium | string |
Value for the utm_medium field |
| utm_term | string |
Value for the utm_term field |
| utm_content | string |
Value for the utm_content field |
| utm_campaign | string |
Value for the utm_campaign field |
<img> tag at the bottom of the html section of an email which will be used to track if an email is opened. If you choose to use 'replace', you can put the tracking pixel wherever you would like in the email and SendGrid will replace it at send time.
| Parameter Name | Parameter Value | Parameter Description |
|---|---|---|
| enable | 0 | 1 |
Disable or enable this Setting |
| replace | string | A string to be replaced by SendGrid with the tracking image at send time. |
| Parameter Name | Parameter Value | Parameter Description |
|---|---|---|
| enable | 0 | 1 |
Disable or enable this Setting |
| maxscore | 1 to 10.0 |
Score after which the message will be dropped (default is 5.0, higher scores indicate higher likelihood of spam) |
| url | url |
an optional url to POST the email and a copy of the report to. Refer to the Spam Checker documentation for POST details. |
text/html and text/plain parameters. However, if you wish to have the link replace a tag (such as [unsubscribe]), use the replace parameter.
| Parameter Name | Parameter Value | Parameter Description |
|---|---|---|
| enable | 0 | 1 |
Disable or enable this App |
| text/html | string |
HTML to be appended to the email, with the subscription tracking link. You may control where the link is by using a tag like so: <% link text %> |
| text/plain | string |
Text to be appended to the email, with the subscription tracking link. You may control where the link is by using a tag like so: <% %> |
| replace | string |
A tag that will be replaced with the unsubscribe URL (e.g. [unsubscribe_url]). If this parameter is included, it will override text/html and text/plain The URL of the link will be placed at the replace tag's location, with no html or other formatting. |
| Parameter Name | Parameter Value | Parameter Description |
|---|---|---|
| enable | 0 | 1 |
Disable or enable this Setting |
| template_id | string |
The ID of the template to use when sending a message, represented by a string. |
Wraps a template around your email content. Useful for sending out marketing email and other nicely formatted messages.
| Parameter Name | Parameter Value | Parameter Description |
|---|---|---|
| enable | 0 | 1 |
Disable or enable this Setting |
| text/html | string |
String containing html content for the template (must contain a <% body %> tag) |
The following code builds a MIME mail message demonstrating all the portions of the SMTP API protocol. To use this example, you will need to have the following perl modules installed:
#!/usr/bin/perl
use strict;
use SmtpApiHeader;
use MIME::Entity;
use Net::SMTP;
my $hdr = SmtpApiHeader->new;
# The list of addresses this message will be sent to
my @toList = ('isaac@example', 'tim@example', 'jose@example');
# The names of the recipients
my @nameList = ('Isaac', 'Tim', 'Jose');
# Another substitution variable
my @timeList = ('4pm', '1pm', '2pm');
# Set all of the above variables
$hdr->addTo(@toList);
$hdr->addSubVal('-name-', @nameList);
$hdr->addSubVal('-time-', @timeList);
# Specify that this is an initial contact message
$hdr->setCategory("initial");
# Enable a text footer and set it
$hdr->addFilterSetting('footer', 'enable', 1);
$hdr->addFilterSetting('footer', "text/plain", "Thank you for your business");
my $from = 'you@yourdomain.com';
# For multiple recipient emails, the 'to' address is irrelevant
my $to = 'example@example.com';
my $plain = <
Hello -name-,
Thank you for your interest in our products. We have set up an appointment
to call you at -time- EST to discuss your needs in more detail.
Regards,
Fred