diff --git a/.gitattributes b/.gitattributes index 0d97623..f64fcd6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,11 +1,13 @@ -/tests export-ignore -/docs export-ignore -/client/src export-ignore -/.gitattributes export-ignore -/.gitignore export-ignore -/.php_cs.dist -/phpcs.xml.dist -/phpstan.neon.dist -/phpunit.xml.dist -/.waratah export-ignore -/README.md export-ignore +/tests export-ignore +/docs export-ignore +/client/src export-ignore +/.editorconfig export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore +/.php-cs-fixer.dist.php export-ignore +/phpunit.xml.dist export-ignore +/.waratah export-ignore +/code-of-conduct.md export-ignore +/CONTRIBUTING.md export-ignore +/README.md export-ignore +/thirdparty/postmark-templates export-ignore diff --git a/.gitignore b/.gitignore index 3fe0b45..5a6b194 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,5 @@ /client/node_modules /vendor/ .DS_Store -/.php_cs.cache -/resources/ -/_resources/ -/public/ -/assets/ +/.php-cs-fixer.cache /tests/__output/ diff --git a/.php_cs.dist b/.php-cs-fixer.dist.php similarity index 91% rename from .php_cs.dist rename to .php-cs-fixer.dist.php index 4faac27..f9b7107 100644 --- a/.php_cs.dist +++ b/.php-cs-fixer.dist.php @@ -7,8 +7,8 @@ $finder = PhpCsFixer\Finder::create() ->in(__DIR__); -return PhpCsFixer\Config::create() - ->setRules([ +$config = new PhpCsFixer\Config(); +return $config->setRules([ '@PSR2' => true, 'array_indentation' => true, 'array_syntax' => ['syntax' => 'short'], diff --git a/README.md b/README.md index 8719dbd..2968428 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,8 @@ ## Structured email handling for Silverstripe -The goal of this module is to produce simple and easy-to-digest emails ([more](./docs/en/001_index.md)). The templates used are based on the [Postmark Transactional Email Templates](https://github.com/wildbit/postmark-templates). +The goal of this module is to produce simple and easy-to-digest emails ([more](./docs/en/001_index.md)). The templates used are based on the [Postmark Transactional Email Templates](https://github.com/ActiveCampaign/postmark-templates). -> :warning: This module is under active development and shouldn't be used in production just yet as there are probably bugs. Test results, pull requests and feedback are welcome. - -The `StructuredEmail` extends the `Email` class. You can use it standalone or you may wish to inject StructuredEmail as the Email class for your project using `Injector`. +The `StructuredEmail` class extends the `Email` class. You can use it standalone or you may wish to inject StructuredEmail as the Email class for your project using `Injector`. For specific core emails, it will attempt to detect the purpose of the email based on the template name: @@ -20,7 +18,7 @@ TODO: ### Existing templates -If the class encounters a complete HTML document in the email, it will use HTML contained within the `` tag as the email content. +If the class encounters a complete HTML document in the email, it will use HTML contained within the `` tag of that document as the email content. ## Schema.org @@ -29,7 +27,7 @@ If the class encounters a complete HTML document in the email, it will use HTML ## Resources + E-mail support across clients: https://www.caniemail.com -+ Postmark templates: https://github.com/wildbit/postmark-templates ++ Postmark templates: https://github.com/ActiveCampaign/postmark-templates ## Quick example @@ -75,7 +73,7 @@ composer require nswdpc/silverstripe-structured-email + [dpcdigital@NSWDPC:~$](https://dpc.nsw.gov.au) -The source of the HTML email templates is the [Postmark templates project](https://github.com/wildbit/postmark-templates) +The source of the HTML email templates is the [Postmark templates project](https://github.com/ActiveCampaign/postmark-templates) ## Bugtracker diff --git a/composer.json b/composer.json index 0bae02e..c374dd9 100644 --- a/composer.json +++ b/composer.json @@ -17,20 +17,18 @@ } ], "require": { - "silverstripe/framework": "^4", + "silverstripe/framework": "^4.10", "league/html-to-markdown": "^5", - "spatie/schema-org": "^3.4", - "nswdpc/silverstripe-taggable-notifications": "dev-master" + "spatie/schema-org": "^3.5", + "nswdpc/silverstripe-taggable-notifications": "^0.3" }, "suggest": { "ext-xml": "Use DOMDocument to process HTML documents", "ext-tidy": "Use tidy to process HTML documents" }, "require-dev": { - "phpunit/phpunit": "^5.7", - "squizlabs/php_codesniffer": "^3.0", - "friendsofphp/php-cs-fixer": "^2.18", - "symbiote/silverstripe-phpstan": "^4", + "phpunit/phpunit": "^9.5", + "friendsofphp/php-cs-fixer": "^3", "silverstripe/sqlite3": "^2" } } diff --git a/docs/en/001_index.md b/docs/en/001_index.md index 2846f37..e3db372 100644 --- a/docs/en/001_index.md +++ b/docs/en/001_index.md @@ -10,15 +10,15 @@ This module handles the templating of the email, leaving you to figure out what We add: -+ Standard, proven email templates based on https://github.com/wildbit/postmark-templates ++ Standard, proven email templates based on https://github.com/ActiveCampaign/postmark-templates + A Structured Email class + An Injectable email decorator containing standard CSS values + Structured template parts allowing you to override as required ++ 🧫 Automated text/plain content creation (as markdown) ### Planned features -+ ⚠️ 🧫 Schema.org support -+ ⚠️ 🧫 Automated text/plain content creation (as markdown) ++ ⚠️ 🧫 improved Schema.org support ### Stretch goals diff --git a/docs/en/003_decorator.md b/docs/en/003_decorator.md index 6b0b026..8d73906 100644 --- a/docs/en/003_decorator.md +++ b/docs/en/003_decorator.md @@ -67,7 +67,7 @@ print get_class($decorator); ### Set the layout type -A layout type allows you some control over the HTML width ([more](https://github.com/wildbit/mailmason/wiki/Project-Structure#layouts)) +A layout type allows you some control over the HTML width ([more](https://github.com/ActiveCampaign/mailmason/wiki/Project-Structure#layouts)) + basic-full = full width + basic = single centred column diff --git a/docs/en/004_schemaorg.md b/docs/en/004_schemaorg.md index be11ef9..5adc54b 100644 --- a/docs/en/004_schemaorg.md +++ b/docs/en/004_schemaorg.md @@ -22,6 +22,7 @@ $email->setViewAction( 'https://confirm.example.com?token=suitably-long-token' ); ``` +Internally, a `\Spatie\SchemaOrg\ViewAction` will be created using the name and URL provided. This will result in the following HTML snippet in the template: @@ -50,6 +51,7 @@ You can also define a generic action: ```php name('Carry out this action') ->handler( diff --git a/phpcs.xml.dist b/phpcs.xml.dist deleted file mode 100644 index fe58f6f..0000000 --- a/phpcs.xml.dist +++ /dev/null @@ -1,11 +0,0 @@ - - - CodeSniffer ruleset for SilverStripe coding conventions. - - - - - - - - diff --git a/phpstan.neon.dist b/phpstan.neon.dist deleted file mode 100644 index 4eff0b7..0000000 --- a/phpstan.neon.dist +++ /dev/null @@ -1,6 +0,0 @@ -parameters: - autoload_directories: - - src - - tests -includes: - - vendor/symbiote/silverstripe-phpstan/phpstan.neon diff --git a/templates/NSWDPC/StructuredEmail/Includes/WithThanks.ss b/templates/NSWDPC/StructuredEmail/Includes/WithThanks.ss index 8596811..7538f89 100644 --- a/templates/NSWDPC/StructuredEmail/Includes/WithThanks.ss +++ b/templates/NSWDPC/StructuredEmail/Includes/WithThanks.ss @@ -1,14 +1 @@ -

-<%t StructuredEmail.THANKS 'Thanks '%> -
-<% if $SiteConfig %> -
-{$SiteConfig.Title} -<% end_if %> -<% with $Top.EmailDecorator %> -<% if $SignOffLink %> -
-{$SignOffLink.XML} -<% end_if %> -<% end_with %> -

+<%-- override this template in your project to provide a generic sign-off to the email, if required --%> diff --git a/tests/EmailTemplateTest.php b/tests/EmailTemplateTest.php index f7b57db..49fbc06 100644 --- a/tests/EmailTemplateTest.php +++ b/tests/EmailTemplateTest.php @@ -14,7 +14,7 @@ class EmailTemplateTest extends SapphireTest { Member::class => '*', ]; - protected $usesDatabase = false; + protected $usesDatabase = null; private function saveOutput($html, $template, $ext = ".html") { $full = dirname(__FILE__) . '/__output/' . $template; @@ -29,13 +29,15 @@ public function testTemplate() { 'Body' => file_get_contents(dirname(__FILE__) . '/data/template.html') ]; + $subject = 'Welcome to the show'; + $email = StructuredEmail::create(); $email->setTo("to@example.com"); $email->setCc("cc@example.com"); $email->setBcc("bcc@example.com"); $email->setFrom(["from@example.com" => "Jiminy Crickets", "another@example.com" => "Bob Pokemon"]); $email->addFrom("secondary@example.com"); - $email->setSubject('Welcome to the show'); + $email->setSubject($subject); $email->setPreheader('Test generic email that needs your attention'); $email->setData($data); $email->setViewAction('Confirm your identify', 'https://confirm.example.com?token=suitably-long-token'); @@ -48,6 +50,14 @@ public function testTemplate() { $message = $email->getSwiftMessage(); $this->saveOutput($message, "StructuredEmail", ".txt"); + + // assert email contains subject + $this->assertStringContainsString( + "Subject: " . $subject, + $message + ); + + } /** @@ -57,16 +67,18 @@ public function testForgotEmail() { $template = 'SilverStripe/Control/Email/ForgotPasswordEmail'; $token = "really-bad-token"; $member = $this->objFromFixture(Member::class, 'forgotpassword'); + $resetPasswordLink = Security::getPasswordResetLink($member, $token); + $subject = _t( + 'SilverStripe\\Security\\Member.SUBJECTPASSWORDRESET', + "Your password reset link", + 'Email subject' + ); /** @var StructuredEmail $email */ $email = StructuredEmail::create() ->setHTMLTemplate($template) ->setData($member) - ->setSubject(_t( - 'SilverStripe\\Security\\Member.SUBJECTPASSWORDRESET', - "Your password reset link", - 'Email subject' - )) - ->addData('PasswordResetLink', Security::getPasswordResetLink($member, $token)) + ->setSubject($subject) + ->addData('PasswordResetLink', $resetPasswordLink) ->setTo($member->Email); // test preheader $email->setPreHeader( @@ -81,31 +93,52 @@ public function testForgotEmail() { $message = $email->getSwiftMessage(); $this->saveOutput($message, "ForgotPasswordEmail", ".txt"); - // test that email is rendered with link and in structured email + // test that email is rendered with reset link and in structured email + $this->assertStringContainsString( + htmlspecialchars($resetPasswordLink), // entitised link + $html // in the HTML + ); + + // assert email contains subject + $this->assertStringContainsString( + "Subject: " . $subject, + $message + ); + } public function testChangePassword() { $member = $this->objFromFixture(Member::class, 'forgotpassword'); + $subject = _t( + 'SilverStripe\\Security\\Member.SUBJECTPASSWORDCHANGED', + "Your password has been changed", + 'Email subject' + ); $email = StructuredEmail::create() ->setHTMLTemplate('SilverStripe\\Control\\Email\\ChangePasswordEmail') ->setData($member) ->setTo($member->Email) ->setFrom('from@example.com') - ->setSubject(_t( - 'SilverStripe\\Security\\Member.SUBJECTPASSWORDCHANGED', - "Your password has been changed", - 'Email subject' - )); + ->setSubject($subject); $email->send(); $this->saveOutput($email->getBody(), "ChangePasswordEmail"); $message = $email->getSwiftMessage(); $this->saveOutput($message, "ChangePasswordEmail", ".txt"); + + // assert email contains subject + $this->assertStringContainsString( + "Subject: " . $subject, + $message + ); + + } public function testStandardEmail() { $member = $this->objFromFixture(Member::class, 'forgotpassword'); + $subject = 'Subject of an important message'; $email = StructuredEmail::create() ->setHTMLTemplate('SilverStripe\\Control\\Email\\Email') ->setData([ @@ -114,13 +147,21 @@ public function testStandardEmail() { ->setPreHeader('An important message') ->setTo($member->Email) ->setFrom('from@example.com') - ->setSubject('Subject of an important message'); + ->setSubject($subject); $email->send(); $this->saveOutput($email->getBody(), "StandardEmail"); $message = $email->getSwiftMessage(); $this->saveOutput($message, "StandardEmail", ".txt"); + + // assert email contains subject + $this->assertStringContainsString( + "Subject: " . $subject, + $message + ); + + } } diff --git a/thirdparty/postmark-templates/README.md b/thirdparty/postmark-templates/README.md index f3eb979..73c9c22 100644 --- a/thirdparty/postmark-templates/README.md +++ b/thirdparty/postmark-templates/README.md @@ -1,8 +1,8 @@ -Postmark Transactional Email Templates +Postmark Transactional Email Templates # Postmark Transactional Email Templates Brought to you by -Postmark +Postmark **Content ready, mobile friendly, and beautiful across all major email clients.** @@ -10,7 +10,7 @@ Brought to you by *Postmark Transactional Email Templates* are rock-solid email templates that render beautifully in tons of email clients. They provide the foundation of our [Postmark Templates](https://postmarkapp.com/blog/special-delivery-postmark-templates) feature, and we're glad to provide them as Open Source to the wider community. -These templates are built and maintained using [MailMason](https://github.com/wildbit/mailmason), a grunt-based framework to help streamline the process of developing, testing, and maintaining a set of related transactional email templates. If you want to create or customize your own set of email templates, you can use MailMason to extend the existing emails or start from scratch to build an entirely new set. +These templates are built and maintained using [MailMason](https://github.com/activecampaign/mailmason), a grunt-based framework to help streamline the process of developing, testing, and maintaining a set of related transactional email templates. If you want to create or customize your own set of email templates, you can use MailMason to extend the existing emails or start from scratch to build an entirely new set. ## CSS & Inlining @@ -19,7 +19,7 @@ There are two sets of templates here. The first set is in the `/templates` folde ### Inline the CSS For client compatibility, HTML emails should always be inlined before sending. Here are a couple of tools for doing that: -* [Postmark Style Merge](https://github.com/wildbit/style-merge) +* [Postmark Style Merge](https://github.com/activecampaign/style-merge) * [Premailer](https://github.com/premailer/premailer) If you choose to send your emails with [Postmark](http://postmarkapp.com), each time you send we will automagically inline the CSS for you. @@ -28,73 +28,80 @@ If you choose to send your emails with [Postmark](http://postmarkapp.com), each Each template comes in three different generic layout variations: Basic, Basic full, and Plain. This gives you a starting point so that you can customize your templates to match your brand. -Starter templates side-by-side: Basic, basic full, and plain -Dark mode compatibility +Starter templates side-by-side: Basic, basic full, and plain +Dark mode compatibility ### Welcome Send a welcome email to users after they sign up. - * 💌 Preview with layout: [Basic](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic/welcome/content.html), [Basic full](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic-full/welcome/content.html), [Plain](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/plain/welcome/content.html) + * 💌 Preview with layout: [Basic](https://newsletter.postmarkapp.com/assets/templates/dist/basic/welcome/content.html), [Basic full](https://newsletter.postmarkapp.com/assets/templates/dist/basic-full/welcome/content.html), [Plain](https://newsletter.postmarkapp.com/assets/templates/dist/plain/welcome/content.html) * 📔 [Welcome email best practices guide](https://postmarkapp.com/guides/welcome-email-best-practices) ### Reset Password Send users a link to reset their password. - * 💌 Preview with layout: [Basic](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic/password-reset/content.html), [Basic full](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic-full/password-reset/content.html), [Plain](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/plain/password-reset/content.html) + * 💌 Preview with layout: [Basic](https://newsletter.postmarkapp.com/assets/templates/dist/basic/password-reset/content.html), [Basic full](https://newsletter.postmarkapp.com/assets/templates/dist/basic-full/password-reset/content.html), [Plain](https://newsletter.postmarkapp.com/assets/templates/dist/plain/password-reset/content.html) * 📔 [Reset password best practices guide](https://postmarkapp.com/guides/password-reset-email-best-practices) ### Reset Password Help Help users reset their password if they can’t remember their email. - * 💌 Preview with layout: [Basic](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic/password-reset-help/content.html), [Basic full](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic-full/password-reset-help/content.html), [Plain](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/plain/password-reset-help/content.html) + * 💌 Preview with layout: [Basic](https://newsletter.postmarkapp.com/assets/templates/dist/basic/password-reset-help/content.html), [Basic full](https://newsletter.postmarkapp.com/assets/templates/dist/basic-full/password-reset-help/content.html), [Plain](https://newsletter.postmarkapp.com/assets/templates/dist/plain/password-reset-help/content.html) * 📔 [Reset password best practices guide](https://postmarkapp.com/guides/password-reset-email-best-practices) ### Receipt Send a receipt to users after they made a purchase. - * 💌 Preview with layout: [Basic](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic/receipt/content.html), [Basic full](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic-full/receipt/content.html), [Plain](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/plain/receipt/content.html) + * 💌 Preview with layout: [Basic](https://newsletter.postmarkapp.com/assets/templates/dist/basic/receipt/content.html), [Basic full](https://newsletter.postmarkapp.com/assets/templates/dist/basic-full/receipt/content.html), [Plain](https://newsletter.postmarkapp.com/assets/templates/dist/plain/receipt/content.html) * 📔 [Receipt and invoices best practices guide](https://postmarkapp.com/guides/receipt-and-invoice-email-best-practices) ### Invoice Request payment from a user. - * 💌 Preview with layout: [Basic](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic/invoice/content.html), [Basic full](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic-full/invoice/content.html), [Plain](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/plain/invoice/content.html) + * 💌 Preview with layout: [Basic](https://newsletter.postmarkapp.com/assets/templates/dist/basic/invoice/content.html), [Basic full](https://newsletter.postmarkapp.com/assets/templates/dist/basic-full/invoice/content.html), [Plain](https://newsletter.postmarkapp.com/assets/templates/dist/plain/invoice/content.html) * 📔 [Receipt and invoices best practices guide](https://postmarkapp.com/guides/receipt-and-invoice-email-best-practices) +### Dunning + +Let users know about a failed payment + +* 💌 Preview with layout: [Basic](https://newsletter.postmarkapp.com/assets/templates/dist/basic/dunning/content.html), [Basic full](https://newsletter.postmarkapp.com/assets/templates/dist/basic-full/dunning/content.html), [Plain](https://newsletter.postmarkapp.com/assets/templates/dist/plain/dunning/content.html) +* 📔 [Dunning best practices guide](https://postmarkapp.com/guides/dunning) + ### Comment notification Notify users of new comments by other users. -**Note:** Comment notification isn't the prettiest preview because it's just [Mustachio](https://github.com/wildbit/mustachio). Since almost all content in this email is dynamic, it won't look good without real content. Don't worry though, that's how it's supposed to look. +**Note:** Comment notification isn't the prettiest preview because it's just [Mustachio](https://github.com/activecampaign/mustachio). Since almost all content in this email is dynamic, it won't look good without real content. Don't worry though, that's how it's supposed to look. - * 💌 Preview with layout: [Basic](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic/comment-notification/content.html), [Basic full](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic-full/comment-notification/content.html), [Plain](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/plain/comment-notification/content.html) + * 💌 Preview with layout: [Basic](https://newsletter.postmarkapp.com/assets/templates/dist/basic/comment-notification/content.html), [Basic full](https://newsletter.postmarkapp.com/assets/templates/dist/basic-full/comment-notification/content.html), [Plain](https://newsletter.postmarkapp.com/assets/templates/dist/plain/comment-notification/content.html) * 📔 [Comment notification best practices guide](https://postmarkapp.com/guides/comment-notification-email-best-practices) ### Trial Expiring Let users know when their trial is about to expire. - * 💌 Preview with layout: [Basic](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic/trial-expiring/content.html), [Basic full](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic-full/trial-expiring/content.html), [Plain](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/plain/trial-expiring/content.html) + * 💌 Preview with layout: [Basic](https://newsletter.postmarkapp.com/assets/templates/dist/basic/trial-expiring/content.html), [Basic full](https://newsletter.postmarkapp.com/assets/templates/dist/basic-full/trial-expiring/content.html), [Plain](https://newsletter.postmarkapp.com/assets/templates/dist/plain/trial-expiring/content.html) * 📔 [Trial expiration email best practices](https://postmarkapp.com/guides/trial-expiration-email-best-practices) ### Trial Expired Let users know when their expired trial. - * 💌 Preview with layout: [Basic](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic/trial-expired/content.html), [Basic full](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic-full/trial-expired/content.html), [Plain](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/plain/trial-expired/content.html) - * 📔 [Trial expiration email best pracitces](https://postmarkapp.com/guides/trial-expiration-email-best-practices) + * 💌 Preview with layout: [Basic](https://newsletter.postmarkapp.com/assets/templates/dist/basic/trial-expired/content.html), [Basic full](https://newsletter.postmarkapp.com/assets/templates/dist/basic-full/trial-expired/content.html), [Plain](https://newsletter.postmarkapp.com/assets/templates/dist/plain/trial-expired/content.html) + * 📔 [Trial expiration email best practices](https://postmarkapp.com/guides/trial-expiration-email-best-practices) ### User Invitation Help users invite others to use your software. - * 💌 Preview with layout: [Basic](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic/user-invitation/content.html), [Basic full](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/basic-full/user-invitation/content.html), [Plain](https://s3.amazonaws.com/assets.wildbit.com/postmark/templates/dist/plain/user-invitation/content.html) + * 💌 Preview with layout: [Basic](https://newsletter.postmarkapp.com/assets/templates/dist/basic/user-invitation/content.html), [Basic full](https://newsletter.postmarkapp.com/assets/templates/dist/basic-full/user-invitation/content.html), [Plain](https://newsletter.postmarkapp.com/assets/templates/dist/plain/user-invitation/content.html) * 📔 [User invitation email best practices](https://postmarkapp.com/guides/user-invitation-email-best-practices) diff --git a/thirdparty/postmark-templates/templates-inlined/basic-full/comment-notification/content.html b/thirdparty/postmark-templates/templates-inlined/basic-full/comment-notification/content.html index 0f51761..aa7f6ca 100644 --- a/thirdparty/postmark-templates/templates-inlined/basic-full/comment-notification/content.html +++ b/thirdparty/postmark-templates/templates-inlined/basic-full/comment-notification/content.html @@ -1,5 +1,5 @@ - + @@ -103,6 +103,10 @@ .align-center { text-align: center; } + + .u-margin-bottom-none { + margin-bottom: 0; + } /* Buttons ------------------------------ */ .button { @@ -468,7 +472,7 @@ - + @@ -504,7 +508,6 @@ - @@ -533,7 +537,7 @@

- Default button + Default button @@ -580,12 +584,12 @@

Example Closing

Thanks, -
[Sender Name] and the [Product Name] Team

+
[Sender Name] and the [Product Name] team

P.S. Need help getting started? Check out our help documentation. Or, just reply to this email with any questions or issues you have. The [Product Name] support team is always excited to help you.


Discount Code

- + @@ -628,7 +632,6 @@

-

© 2021 [Product Name]. All rights reserved.

[Company Name, LLC]
1234 Street Rd. diff --git a/thirdparty/postmark-templates/templates-inlined/basic-full/example/content.txt b/thirdparty/postmark-templates/templates-inlined/basic-full/example/content.txt index b21497d..7858957 100644 --- a/thirdparty/postmark-templates/templates-inlined/basic-full/example/content.txt +++ b/thirdparty/postmark-templates/templates-inlined/basic-full/example/content.txt @@ -6,7 +6,7 @@ This is example text for the preheader set via the YAML front-matter for each em Escaped Handlebars Brackets *************************** -Working with templates, you'll occasionally need to put some Mustachio ( https://github.com/wildbit/mustachio ) code in your Handlebars templates. To prevent the Handlebars processing from attempting to process your Mustachio code, you'll need to escape the curly braces by adding a backslash just before the opening curly braces. +Working with templates, you'll occasionally need to put some Mustachio ( https://github.com/activecampaign/mustachio ) code in your Handlebars templates. To prevent the Handlebars processing from attempting to process your Mustachio code, you'll need to escape the curly braces by adding a backslash just before the opening curly braces. \{{ something }} will turn into {{ something }} @@ -81,7 +81,7 @@ Example Closing *************** Thanks, -[Sender Name] and the [Product Name] Team +[Sender Name] and the [Product Name] team P.S. Need help getting started? Check out our help documentation. Or, just reply to this email with any questions or issues you have. The [Product Name] support team is always excited to help you. @@ -111,8 +111,6 @@ If you’re having trouble clicking the confirm account button, copy and paste t {{action_url}} ( {{ action_url }} ) -© 2021 [Product Name]. All rights reserved. - [Company Name, LLC] 1234 Street Rd. diff --git a/thirdparty/postmark-templates/templates-inlined/basic-full/invoice/content.html b/thirdparty/postmark-templates/templates-inlined/basic-full/invoice/content.html index 15c0d52..f9160d9 100644 --- a/thirdparty/postmark-templates/templates-inlined/basic-full/invoice/content.html +++ b/thirdparty/postmark-templates/templates-inlined/basic-full/invoice/content.html @@ -1,5 +1,5 @@ - + @@ -103,6 +103,10 @@ .align-center { text-align: center; } + + .u-margin-bottom-none { + margin-bottom: 0; + } /* Buttons ------------------------------ */ .button { @@ -469,7 +473,7 @@ - + @@ -508,7 +512,7 @@

@@ -555,7 +559,7 @@

If you have any questions about this invoice, simply reply to this email or reach out to our support team for help.

Cheers, -
The [Product Name] Team

+
The [Product Name] team

@@ -576,7 +580,6 @@ -

If you do not use [Product Name] or did not request a password reset, please ignore this email or contact support if you have questions.

Thanks, -
The [Product Name] Team

+
The [Product Name] team

@@ -516,7 +520,6 @@ -