{"id":2974,"date":"2020-07-03T12:11:33","date_gmt":"2020-07-03T19:11:33","guid":{"rendered":"https:\/\/www.wellgolly.com\/?p=2974"},"modified":"2020-07-06T16:48:45","modified_gmt":"2020-07-06T23:48:45","slug":"sending-bulk-email","status":"publish","type":"post","link":"https:\/\/www.wellgolly.com\/?p=2974","title":{"rendered":"Sending Bulk  Email"},"content":{"rendered":"<p>I have a new product that I want to notify my customers of and since it has been a while since I last sent an email blast and I have moved to a new server, I wanted to make sure I was conforming to the latest best practices. And when they sign up I want to make sure that confirmation and billing emails get delivered.<\/p>\n<p><strong>Return Path<\/strong><br \/>\nThe first thing I noticed is that my Return-path and envelope-from were set to the server name rather than the domain of the user that I was sending the email from. There is a way to configure Exim4 to automatically use the domain of the user when sending email, but I couldn\u2019t figure out how to do it. I found this <a href='https:\/\/forums.cpanel.net\/threads\/formats-for-etc-mailhelo-mailips-etc.111977\/'>article<\/a> that explains how to change it. However, since all of the mail I send from that server comes from the same domain, I fixed the problem by changing the \/etc\/mailname file so that it has the sending domain rather than the server\u2019s domain.<\/p>\n<p>I also updated my SSL config with certbot to set up <i>mail.wellgolly.com<\/i> as part of the SSL configuration. You need to do this separately from the website using <code class=\"preserve-code-formatting\">sudo certbot certonly --standalone -d mail.wellgolly.com<\/code>. However, since I changed the sending domain from <i>mail.wellgolly.com<\/i> to <i>wellgolly.com<\/i> this didn\u2019t matter in the end for my bulk email but since my confirmation and billing emails still send out from <i>mail.wellgolly.com<\/i>. (I\u2019m working on figuring out why they do that\u2014the code uses PHP and was written by my guys 25 years ago, so I haven\u2019t quite figured it out yet.)<\/p>\n<p>Then I added a text file to my DNS. This spf file is not supposed to have a HOSTNAME label. The validator couldn\u2019t find the spf file when it had a label but finds it when I removed the label.<br \/>\n<code class=\"preserve-code-formatting\">v=spf1 mx a ip4:173.255.194.220 ip6:2600:3c00::f03c:91ff:fe70:bc93 include:charter.net include:wellgolly.com include:mail.wellgolly.com -all<\/code><\/p>\n<p>Note that you include all of the servers that you use to send mail. In my case I use an ISP to send mail from my computers and wellgolly.com for the bulk email. As I mentioned earlier, I still haven\u2019t figured out why my order confirmation emails use mail.wellgolly.com so I put that in as well. If you send email from your phone, you\u2019d include that server as well.<\/p>\n<p><strong>DKIM<\/strong><br \/>\nI found these two links that were useful for setting up DKIM with Exim4. <a href='https:\/\/www.softaculous.com\/board\/index.php?tid=7522&#038;tpg=all&#038;title=Guide_-_How_to_setup_DKIM_and_SPF_with_Exim'>myleen<\/a> and a concise explanation from <a href='https:\/\/mikepultz.com\/2010\/02\/using-dkim-in-exim\/'>Mike Pultz<\/a>.<br \/>\n<pre><code class=\"preserve-code-formatting\">\nremote_smtp:\n&nbsp;&nbsp;debug_print = &quot;T: remote_smtp for $local_part@$domain&quot;\n&nbsp;&nbsp;driver = smtp\n&nbsp;&nbsp;dkim_domain = wellgolly.com\n&nbsp;&nbsp;dkim_selector = x\n&nbsp;&nbsp;dkim_private_key = \/etc\/exim4\/dkim.private.key\n&nbsp;&nbsp;dkim_canon = relaxed<\/code><\/pre><\/p>\n<p>The forum post from myleen says that you can use <code class=\"preserve-code-formatting\">dkim_domain = ${lc:${domain:$h_from:}}<\/code> but I didn\u2019t try it.<\/p>\n<p>One thing that I forgot was that the my Exim configuration on my machine is not set up in separate files but is in one large config file, exim4.conf.template. To have the changes take effect you need to run sudo update-exim4.conf and then restart Exim.<\/p>\n<p>Notice that the line <i>dkim_selector = x<\/i>. The x can be anything but when you add the DKIM key you need to use the same label. In my case, <i>x._domainkey<\/i>.<\/p>\n<p>Generate the public and private keys as described in the article and add two TXT files<\/p>\n<p><code class=\"preserve-code-formatting\">x._domainkey.example.com.&nbsp;&nbsp; TXT v=DKIM1; t=y; k=rsa; p=&lt;public key&gt;<\/code><br \/>\n _domainkey.example.com. t=y; o=~;<\/code><\/p>\n<p>These are the TXT files I created so that the validator is happy.<br \/>\n<img src='\/images\/EmailVerification\/TXT_Records.png' alt='TXT_Records' \/><\/p>\n<p><strong>Verification<\/strong><br \/>\nYou can send an email to check-auth@verifier.port25.com and it will respond with cryptic summary of results. This is good if you understand all the terms and how to fix things. I didn\u2019t, so I used <a href='https:\/\/www.mail-tester.com\/'>Mail Tester<\/a> to check my mailings. It\u2019s free for the first three but since I was fixing and testing based on their feedback I ponied up the 25\u20ac ($27.50 with conversion fee of .15) and got 25 tests.<\/p>\n<p>Make sure that Exim has permission to read the dkim.private.key file. This caused some validation errors. I don\u2019t know who the user is that is sending the mail, so I couldn\u2019t add them to a group. What I did instead was make everyone able to read the file using <code class=\"preserve-code-formatting\">chmod o+rx<\/code>.<\/p>\n<p><strong>Reverse DNS<\/strong><br \/>\nI was getting this error:<br \/>\n<pre><code class=\"preserve-code-formatting\">\nYour IP address 173.255.194.220 is associated with the domain wellgolly.com.\nNevertheless your message appears to be sent from mail.wellgolly.com.\nYou may want to change the host name of your server to wellgolly.com.<\/code><\/pre><\/p>\n<p>So to fix this I edited \/etc\/hosts to remove the <i>mail.<\/i> prefix.<\/p>\n<p><strong>List Unsubscribe<\/strong><br \/>\nThis is recommended for newsletters so I added it. I can\u2019t see it in the mail readers that I use, but it got rid of some negative scoring on the validator so I added it. I think Spark uses it to indicate that the message is a <i>Newsletter<\/i>.<br \/>\n<a href='https:\/\/help.returnpath.com\/hc\/en-us\/articles\/222445367-How-to-implement-the-List-Unsubscribe-header'>Unsubscribe<\/a><\/p>\n<p><code class=\"preserve-code-formatting\">List-Unsubscribe: &lt;mailto: unsubrequests@exampledomain.com?subject=unsubscribe&gt;, &lt;http:\/\/www.exampledomain.com\/unsubscribe.html&gt;<\/code><\/p>\n<p>This is what the mail validator says now and I score 10\/10. Unfortunately, that didn\u2019t prevent Gmail from marking my email as spam, but at least it didn\u2019t get rejected entirely.<\/p>\n<p><img src='\/images\/EmailVerification\/Authenticated.png' alt='Authenticated' \/><br \/>\n<img src='\/images\/EmailVerification\/Misc.png' alt='Misc' \/><br \/>\n<img src='\/images\/EmailVerification\/SpamAssasin.png' alt='SpamAssasin' \/><br \/>\n<img src='\/images\/EmailVerification\/WellFormatted.png' alt='WellFormatted' \/><\/p>\n<p>I couldn\u2019t track down what the T_SPF_PERMERROR means but it doesn\u2019t seem to have any effect on my score.<\/p>\n<p>One thing that paradoxically did have an effect on my score was a ratio of text to graphics that was too high. I added a paragraph of text and that issue was resolved.<\/p>\n<p>The results from verifier.port25.com are encouraging as well. Unlike Mail Tester, they don\u2019t tell you how to fix the problems or even really what the results mean. They are free however, and now that I know a bit about what everything means, I\u2019ll probably use them for checking things when I make changes.<br \/>\n<pre><code class=\"preserve-code-formatting\">\n==========================================================\nSummary of Results\n==========================================================\nSPF check:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass\n&quot;iprev&quot; check:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass\nDKIM check:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass\nSpamAssassin check: ham\n\n==========================================================\nDetails:\n==========================================================\n\nHELO hostname:&nbsp;&nbsp;wellgolly.com\nSource IP:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2600:3c00::f03c:91ff:fe70:bc93\nmail-from:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sales-support@wellgolly.com\n\n----------------------------------------------------------\nSPF check details:\n----------------------------------------------------------\nResult:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass\nID(s) verified: smtp.mailfrom=sales-support@wellgolly.com\n\nDNS record(s):\n&nbsp;&nbsp; wellgolly.com. 300 IN TXT &quot;v=spf1 mx a ip4:173.255.194.220 ip6:2600:3c00::f03c:91ff:fe70:bc93 include:charter.net include:wellgolly.com include:mail.wellgolly.com-all&quot;\n&nbsp;&nbsp; wellgolly.com. 300 IN MX 1 mail.wellgolly.com.\n&nbsp;&nbsp; mail.wellgolly.com. 300 IN AAAA 2600:3c00::f03c:91ff:fe70:bc93\n\n----------------------------------------------------------\n&quot;iprev&quot; check details:\n----------------------------------------------------------\nResult:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass (matches wellgolly.com)\nID(s) verified: policy.iprev=&quot;2600:3c00::f03c:91ff:fe70:bc93&quot;\n\nDNS record(s):\n&nbsp;&nbsp; 3.9.c.b.0.7.e.f.f.f.1.9.c.3.0.f.0.0.0.0.0.0.0.0.0.0.c.3.0.0.6.2.ip6.arpa. 300 IN PTR wellgolly.com.\n&nbsp;&nbsp; wellgolly.com. 300 IN AAAA 2600:3c00::f03c:91ff:fe70:bc93\n\n----------------------------------------------------------\nDKIM check details:\n----------------------------------------------------------\nResult:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass (matches From: sales-support@wellgolly.com)\nID(s) verified: header.d=wellgolly.com<\/code><\/pre><\/p>\n<p>The simple verifier has some options that you can find at their <a href='https:\/\/www.sparkpost.com\/email-tools\/authentication-checker\/'>website<\/a>. I also used it to check what\u2019s happening with my other mail by sending a command-line email.<br \/>\n<pre><code class=\"preserve-code-formatting\">\n\/usr\/sbin\/exim -v check-auth@verifier.port25.com\nFrom: sales-support@wellgolly.com\nTo: check-auth@verifier.port25.com\nSubject: DKIM Test\ntest message<\/code><\/pre><\/p>\n<p>In case you\u2019ve forgotten, when you send a multi-line command you terminate it with ctl-d.<\/p>\n<p><strong>The Result<\/strong><br \/>\nI sent out my mass mailing to customers today and, unlike previous years, I did not get any bounces for missing SPF record, line length exceeded, or spam filters. So the couple of days figuring this out was worth it.<\/p>\n<p>I did get a lot of bounces since many people do not keep the same address forever like I do. Many of them are from schools and companies so it makes sense that the email address is deactivated after a while when employees leave. Lots of bounces for mailbox full so most of them are also probably old email addresses.<\/p>\n<p>I dumped all of the undeliverable mail into a file so I can make a list of bad addresses and the first one in the list also has a bunch of diagnostic stuff in it. An interesting bit was this section:<br \/>\n<pre><code class=\"preserve-code-formatting\">\nX-Barracuda-Spam-Score: 0.62\nX-Barracuda-Spam-Status: No, SCORE=0.62 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=5.0 tests=ANY_BOUNCE_MESSAGE, BOUNCE_MESSAGE, BSF_SC0_SA074b, BSF_SC0_SA590, EMPTY_ENV_FROM, NO_REAL_NAME, SH_BIG5_05413_BODY_104\nX-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.83021\n&nbsp;&nbsp;Rule breakdown below\n&nbsp;&nbsp; pts rule name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;description\n&nbsp;&nbsp;---- ---------------------- --------------------------------------------------\n&nbsp;&nbsp;0.00 EMPTY_ENV_FROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Empty Envelope From Address\n&nbsp;&nbsp;0.00 NO_REAL_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; From: does not include a real name\n&nbsp;&nbsp;0.21 SH_BIG5_05413_BODY_104 BODY: Body: contain &quot;UNSUBSCRIBE&quot;\n&nbsp;&nbsp;0.20 BSF_SC0_SA590&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Custom Rule SA590\n&nbsp;&nbsp;0.20 BSF_SC0_SA074b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Custom Rule SA074b\n&nbsp;&nbsp;0.00 BOUNCE_MESSAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MTA bounce message\n&nbsp;&nbsp;0.00 ANY_BOUNCE_MESSAGE&nbsp;&nbsp;&nbsp;&nbsp; Message is some kind of bounce message\n<\/code><\/pre><\/p>\n<p>According to the <a href='https:\/\/campus.barracuda.com\/product\/emailsecuritygateway\/doc\/3866633\/how-spam-scoring-works\/'>Barracuda website<\/a> my score if .62 is great since<em> The score ranges from 0 (definitely not spam) to 10 or higher (definitely spam).<\/em> That program is fairly popular and there were 52 other messages that I got back 35 had a score of 0, 6 had a score of 1.09, two had a score of 2.02 and the rest were between .21 and .91. I\u2019m not sure I can do anything about the high scores since the report doesn\u2019t make a lot of sense to me. My embedded URLs use HTTPS and are really short\u2014just the domain name followed by exercises\/overview.html. Most of the points come from their custom rules so there\u2019s not much I can do about that.<\/p>\n<p><pre><code class=\"preserve-code-formatting\">\n&nbsp;&nbsp;Rule breakdown below\n&nbsp;&nbsp; pts rule name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;description\n&nbsp;&nbsp;---- ---------------------- --------------------------------------------------\n&nbsp;&nbsp;0.00 NORMAL_HTTP_TO_IP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uses a dotted-decimal IP address in URL\n&nbsp;&nbsp;0.00 NO_REAL_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; From: does not include a real name\n&nbsp;&nbsp;0.00 MIME_BOUND_MANY_HEX&nbsp;&nbsp;&nbsp;&nbsp;Spam tool pattern in MIME boundary\n&nbsp;&nbsp;0.00 EMPTY_ENV_FROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Empty Envelope From Address\n&nbsp;&nbsp;0.32 URI_HEX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URI: URI hostname has long hexadecimal sequence\n&nbsp;&nbsp;0.00 IP_LINK_PLUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URI: Dotted-decimal IP address followed by CGI\n&nbsp;&nbsp;0.50 WEIRD_PORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URI: Uses non-standard port number for HTTP\n&nbsp;&nbsp;0.00 HTML_MESSAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BODY: HTML included in message\n&nbsp;&nbsp;0.20 BSF_SC0_SA590&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Custom Rule SA590\n&nbsp;&nbsp;0.50 BSF_RULE7568M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Custom Rule 7568M\n&nbsp;&nbsp;0.50 BSF_RULE_7582B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Custom Rule 7582B\n&nbsp;&nbsp;0.00 BOUNCE_MESSAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MTA bounce message\n&nbsp;&nbsp;0.00 ANY_BOUNCE_MESSAGE&nbsp;&nbsp;&nbsp;&nbsp; Message is some kind of bounce message&gt;\/code&gt;\n \n\nThere were only five messages checked with SpamAssassin and this was the result:\n&lt;code&gt;\nX-Spam-Status: No, score=0.0 required=9.9 tests=HTML_MESSAGE\n&nbsp;&nbsp;&nbsp;&nbsp;autolearn=disabled version=3.3.2\nX-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) <\/code><\/pre><\/p>\n<p>One message had this report which makes no sense to me, but maybe it will be useful to someone else.<br \/>\n<pre><code class=\"preserve-code-formatting\">\nX-ENA-MailScanner-SpamCheck: not spam, SpamAssassin (not cached, score=3.554,\n&nbsp;&nbsp;required 4, BAYES_00 -2.20, DATE_IN_PAST_06_12 1.54,\n&nbsp;&nbsp;DKIM_SIGNED 0.10, DKIM_VALID -0.10, DKIM_VALID_AU -0.10,\n&nbsp;&nbsp;DKIM_VALID_EF -0.10, DMARC_PASS -0.00, ENA_BAD_OPTOUT 2.20,\n&nbsp;&nbsp;ENA_BAD_OPTOUT5 0.00, ENA_BAYES_OFFSET 2.20, HTML_MESSAGE 0.00,\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENA_BAD_OPTOUT5 0.00, ENA_BAYES_OFFSET 2.20, HTML_MESSAGE 0.00,\n&nbsp;&nbsp;SPF_HELO_PASS -0.20, SPF_PERMERROR 0.20, T_SPF_PERMERROR 0.01)<\/code><\/pre><\/p>\n<p>There were 36 of these:<br \/>\n<pre><code class=\"preserve-code-formatting\">\nX-Forefront-Antispam-Report:\n&nbsp;&nbsp;CIP:134.197.10.234;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:UC-Exchange1.unr.edu;PTR:InfoDomainNonexistent;CAT:NONE;SFTY:;SFS:(50650200002)(4636009)(136003)(396003)(346002)(376002)(39860400002)(1930700014)(46966005)(30864003)(78352004)(42882007)(336012)(26005)(7696005)(498600001)(45080400002)(2876002)(31686004)(8936002)(8676002)(2906002)(83380400001)(6916009)(55016002)(786003)(316002)(31696002)(82310400002)(70586007)(70206006)(66576008)(82740400003)(956004)(47076004)(81166007)(5660300002)(356005)(53652003)(559001)(579004)(299355004);DIR:OUT;SFP:1501;<\/code><\/pre><\/p>\n<p>You can try to decipher it at the Microsoft website but I think the good part for me is CAT:NONE; since all of the listed categories are bad and NONE appears to be the default that indicates that the message is not spam.<\/p>\n<p>One of the things that you need to do to keep off the spam lists is remove old email addresses. I don\u2019t plan on sending bulk emails to my customers very often but if I do I want to stay off the spammer list. So I created a list of bad addresses. The first thing I did was to search for <code class=\"preserve-code-formatting\">X-Failed-Recipients:<\/code>. This provided me with a clean list of 86% of the bounces.<\/p>\n<p>I then looked for <code class=\"preserve-code-formatting\">To: &quot;<\/code>. This gave me more lines than bounced messages but by filtering out every line that didn\u2019t end in >, sorting the remainder and removing duplicate lines, I got it down to one line per address. 94% of the bounces.<\/p>\n<p>Combining the two gives me slightly fewer addresses than using the <code class=\"preserve-code-formatting\">To: &quot;<\/code> method alone. This probably happened because I had people in the database multiple times with slightly different name fields.<\/p>\n<p>There were a handful of <code class=\"preserve-code-formatting\">Unknown address error<\/code> messages that didn\u2019t fit any pattern for automatic filtering. They were only 1% of the total so I cleaned them up by hand. Nothing else popped out to me so I think I\u2019ll leave it at that.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I have a new product that I want to notify my customers of and since it has been a while since I last sent an email blast and I have moved to a new server, I wanted to make sure I was conforming to the latest best practices. And when they sign up I want &hellip; <a href=\"https:\/\/www.wellgolly.com\/?p=2974\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Sending Bulk  Email<\/span><\/a><\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-2974","post","type-post","status-publish","format-standard","hentry","category-coding"],"_links":{"self":[{"href":"https:\/\/www.wellgolly.com\/index.php?rest_route=\/wp\/v2\/posts\/2974","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wellgolly.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wellgolly.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wellgolly.com\/index.php?rest_route=\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wellgolly.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2974"}],"version-history":[{"count":20,"href":"https:\/\/www.wellgolly.com\/index.php?rest_route=\/wp\/v2\/posts\/2974\/revisions"}],"predecessor-version":[{"id":2994,"href":"https:\/\/www.wellgolly.com\/index.php?rest_route=\/wp\/v2\/posts\/2974\/revisions\/2994"}],"wp:attachment":[{"href":"https:\/\/www.wellgolly.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2974"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wellgolly.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2974"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wellgolly.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2974"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}