{"id":1963,"date":"2022-04-08T00:00:00","date_gmt":"2022-04-08T00:00:00","guid":{"rendered":"http:\/\/kocerroxy-homepage.staging.ideatocode.tech\/sending-email-notifications-in-python\/"},"modified":"2026-01-27T15:56:37","modified_gmt":"2026-01-27T15:56:37","slug":"sending-email-notifications-in-python","status":"publish","type":"post","link":"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/","title":{"rendered":"Sending Email Notifications in Python"},"content":{"rendered":"\n<p>With <a href=\"https:\/\/99firms.com\/research\/mobile-email-statistics\/\" target=\"_blank\" rel=\"noreferrer noopener\">58% of adults checking email first thing in the morning<\/a> before social media or web browsing, email remains the fastest way to catch time-sensitive alerts. So, let&#8217;s go over sending email notifications in Python. This way, you&#8217;ll immediately get the alert on your phone and any other devices that you check your email with.<\/p>\n\n\n\n<p>This article is going to cover how to send emails to either one or multiple recipients. We\u2019ll also implement a check to make sure it doesn\u2019t bomb you with a ton of emails simultaneously.<\/p>\n\n\n\n<p>This same Python email notification setup works for a lot more than PS5 stock checks. You can use it for price monitors, uptime checks, web scraping alerts, security monitoring, or cron job notifications that need to ping you when something changes. The rest of this tutorial shows a simple, reusable pattern you can adapt to any automated alert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-you-ll-need\"><span class=\"ez-toc-section\" id=\"What_Youll_Need\"><\/span>What You\u2019ll Need<span class=\"ez-toc-section-end\"><\/span><\/h2><div id=\"ez-toc-container\" class=\"ez-toc-v2_0_76 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #ffffff;color:#ffffff\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #ffffff;color:#ffffff\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#What_Youll_Need\" >What You\u2019ll Need<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#Email_Address_for_the_Bot\" >Email Address for the Bot<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#Import_Commands\" >Import Commands<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#Sending_Email_Notifications_in_Python\" >Sending Email Notifications in Python<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#Declare_Variables\" >Declare Variables<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#Send_Email_Function\" >Send Email Function<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#SMTP_vs_Email_API\" >SMTP vs Email API<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#Deliverability_Basics\" >Deliverability Basics<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#Debugging_Locally\" >Debugging Locally<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#Option_A_aiosmtpd_recommended_for_modern_Python\" >Option A: aiosmtpd (recommended for modern Python)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#Option_B_MailHog_nice_web_UI_great_for_teams\" >Option B: MailHog (nice web UI, great for teams)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#Conclusion\" >Conclusion<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#FAQs_About_Email_Notifications_in_Python\" >FAQs About Email Notifications in Python<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#Q1_Why_do_I_need_an_App_Password_for_Gmail_in_Python\" >Q1. Why do I need an App Password for Gmail in Python?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#Q2_Whats_the_difference_between_SMTP_and_Email_API_for_Python\" >Q2. What&#8217;s the difference between SMTP and Email API for Python?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#Q3_How_do_I_prevent_my_Python_bot_from_spamming_emails\" >Q3. How do I prevent my Python bot from spamming emails?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#Q4_What_port_should_I_use_for_Python_SMTP_email\" >Q4. What port should I use for Python SMTP email?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#Q5_What_are_SPF_DKIM_and_DMARC_for_email_deliverability\" >Q5. What are SPF, DKIM, and DMARC for email deliverability?<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n\n\n\n\n<p>There are two things you\u2019ll need: an email account for the bot to use, and two more imports at the start of the code.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Email_Address_for_the_Bot\"><\/span>Email Address for the Bot<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Google no longer supports Less Secure App Access for signing in with just a username + password. Instead, for a personal Gmail account, the simplest reliable approach is to:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Turn ON 2-Step Verification<\/strong> on the bot\u2019s Google account<\/li>\n\n\n\n<li><strong>Create an App Password<\/strong> (Google requires 2-Step Verification to create one)<\/li>\n\n\n\n<li>Use that <strong>App Password<\/strong> in your Python script instead of the normal Gmail password<\/li>\n<\/ol>\n\n\n\n<p>This keeps your real password out of the code, and it matches Google\u2019s recommended path for apps that can\u2019t do Sign in with Google or OAuth.<\/p>\n\n\n\n<p>If you don\u2019t see App passwords, it may be unavailable for your account\/security setup. In that case, use an email provider\/API that supports OAuth or an email-sending service (SendGrid\/SES\/Mailgun\/Postmark).<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Error \/ symptom (copy-paste)<\/th><th>What it usually means<\/th><th>Exact fix<\/th><\/tr><\/thead><tbody><tr><td><strong>535-5.7.8 Username and Password not accepted<\/strong><\/td><td>Wrong credentials or Gmail rejected password auth<\/td><td>Use an <strong>App Password<\/strong> (not your normal Gmail password). Confirm you\u2019re logging in with the <strong>full Gmail address<\/strong> as the username.<\/td><\/tr><tr><td><strong>App password required \/ 534-5.7.9 Application-specific password required<\/strong><\/td><td>Gmail requires an app-specific password for SMTP<\/td><td>Create an <strong>App Password<\/strong> in the Google account security settings (<strong>requires 2-Step Verification<\/strong>), then use that <strong>16-digit app password<\/strong> in your script.<\/td><\/tr><tr><td><strong>smtplib.SMTPAuthenticationError (Python exception)<\/strong><\/td><td>Python is surfacing the underlying Gmail auth error<\/td><td>Check the embedded SMTP error code\/message, then apply the matching fix above (most often: switch to an <strong>App Password<\/strong>).<\/td><\/tr><tr><td><strong>Daily sending limit reached \/ \u201cYou have reached a limit for sending mail\u201d<\/strong><\/td><td>Gmail rate-limited or blocked sending temporarily<\/td><td>Reduce volume, slow down sends, and wait for the sending window to reset (often within <strong>1\u201324 hours<\/strong>). If you need reliable volume, use an <strong>email API provider<\/strong> instead of Gmail SMTP.<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">Common Gmail SMTP failures<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Import_Commands\"><\/span>Import Commands<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>There are two more things that you\u2019ll need to import,, in addition to Requests and BeautifulSoup from the scraper portion. They are <strong>time<\/strong> and <a href=\"https:\/\/docs.python.org\/3\/library\/smtplib.html\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>smtplib<\/strong><\/a>. They\u2019re both modules that are already built into Python, so there are no additional installations required before using them.<\/p>\n\n\n\n<p>Time should be pretty self-explanatory.<\/p>\n\n\n\n<p>SMTPlib is Python\u2019s module for handling emails, which is important for what we\u2019re about to do.<\/p>\n\n\n\n<p>This means that for everything covered in the previous <a href=\"https:\/\/kocerroxy.com\/blog\/diy-ps5-availability-tracker\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>DIY PS5 Availability Tracker<\/strong><\/a> article, plus what we\u2019re about to go over, you\u2019re going to be looking at:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from bs4 import BeautifulSoup\nimport time, smtplib, requests\nfrom email.message import EmailMessage<\/code><\/pre>\n\n\n\n<p>Now, let&#8217;s get started!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Sending_Email_Notifications_in_Python\"><\/span>Sending Email Notifications in Python<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>You have a few options regarding connection security. You could use SMTP_SSL() through port 465 for your connection. However, let\u2019s use SSL\u2019s more secure successor, TLS, via .starttls() through the modern standardized port 587.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"has-text-align-center\">Port 587 should be your default choice. It was designed for email client submission and supports StartTLS. Most email service providers, including Gmail, Outlook, and Twilio SendGrid, recommend port 587 as the primary choice for message submission.<\/p>\n<cite>Source: Twilio, Major Email Service Provider<\/cite><\/blockquote>\n\n\n\n<p>The variables could be hardcoded into the main function of the bot\u2019s code if you\u2019re only sending notifications to yourself. However, let\u2019s aim for the goal of easier scalability and being able to adjust for other purposes.&nbsp;<\/p>\n\n\n\n<p>If the variables are made inside a function, their values don\u2019t carry over between loops. Therefore, we should declare them beforehand and adjust the values as needed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Declare_Variables\"><\/span>Declare Variables<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>The server and port information are filled in under the assumption that you\u2019ll use a Gmail account as recommended. Other service providers have different identifiers, such as AT&amp;T\u2019s SMTP server address being Outbound.att.net.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sender_name = \"The_bots_Google_account@gmail.com\"\nsender_password = \"sender_app_password\"\nsmtp_port = 587\nsmtp_server = \"smtp.gmail.com\"<\/code><\/pre>\n\n\n\n<p>We\u2019ll set two receiving accounts that\u2019ll be called in a for loop to demonstrate the skeleton needed for upward scalability. If you\u2019re unfamiliar, loops will step through a list or range in sequence, executing the code once per item.<\/p>\n\n\n\n<p>Most email clients will auto-link plain URLs, but if you want guaranteed clickable links and nicer formatting, build the email using <a href=\"https:\/\/docs.python.org\/3\/library\/email.message.html\" target=\"_blank\" rel=\"noreferrer noopener\">Python\u2019s <code>email<\/code> package<\/a> and include an HTML alternative part (<code>multipart\/alternative<\/code>).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>email_recipients = &#91;\"1st_Receiving_Email@gmail.com\",\"2nd_Receiving_Email@gmail.com\"]\nemail_subject = \"PS5 in stock on Amazon!\"\nemail_body_text = \"PS5 in stock on Amazon: https:\/\/www.amazon.com\/PlayStation-5-Console\/dp\/B09DFCB66S\/\"\n\nemail_body_html = \"\"\"\n&lt;p>&lt;strong>PS5 in stock on Amazon!&lt;\/strong>&lt;\/p>\n&lt;p>&lt;a href=\"https:\/\/www.amazon.com\/PlayStation-5-Console\/dp\/B09DFCB66S\/\">Open the listing&lt;\/a>&lt;\/p>\n\"\"\"<\/code><\/pre>\n\n\n\n<p>Finally, we also need to declare the variables to track an internal timer to prevent email spam.&nbsp;<\/p>\n\n\n\n<p>The bot could theoretically detect that the PS5 is available a few hundred times within a very short timeframe. At least, it might be easier after you have the scraper fleshed out to use rotating proxies to repeatedly check availability. The bot would then end up aggressively flooding your mailbox if you don\u2019t have any failsafes in place.<\/p>\n\n\n\n<p>Monitor responsibly:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Don\u2019t hammer retailers with rapid-fire requests.<\/li>\n\n\n\n<li>Respect each site\u2019s Terms of Service and robots\/policies.<\/li>\n\n\n\n<li>Use cooldowns, backoff, and retry delays to reduce load.<\/li>\n\n\n\n<li>If using proxies, rotate responsibly to avoid bursty spikes that look abusive.<\/li>\n<\/ul>\n\n\n\n<p>Let\u2019s use the time.time() command to get the current time. The output is a floating point value equivalent to the number of seconds since a fixed starting point.&nbsp;<\/p>\n\n\n\n<p>We\u2019ll save a timestamp whenever an email is successfully sent out. We can then determine how much time has passed by comparing the saved value to the current time. It\u2019s then a simple formula of current time &#8211; last time &gt; cooldown to ensure enough time has passed between emails.<\/p>\n\n\n\n<p>If you\u2019re thinking of the cooldown in minutes, remember to multiply by 60 to convert it into seconds. In this instance, we\u2019ll set a 1-minute cooldown between emails.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>last_email_sent = 0\nemail_cooldown = 60<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Send_Email_Function\"><\/span>Send Email Function<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>The function we\u2019re using for sending email notifications in Python will operate under the assumption that you are only calling it if the desired conditions are met. In this example, that means that Amazon has PS5s in stock.&nbsp;<\/p>\n\n\n\n<p>First up, we&#8217;ll define the send_email function. It will start with a check to see if any emails were sent out recently. It will get to work as long as it has been longer than the internal cooldown since the last one. The default value of 0 will ensure that there aren&#8217;t any issues when an email hasn&#8217;t been sent yet.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def send_email():\n    global last_email_sent  # (or handle state differently; this matches your current pattern)\n\n    if time.time() - last_email_sent &lt;= email_cooldown:\n        return\n\n    with smtplib.SMTP(smtp_server, smtp_port) as server:\n        server.starttls()\n        server.login(sender_name, sender_password)\n\n        for recipient in email_recipients:\n            msg = EmailMessage()\n            msg&#91;\"From\"] = sender_name\n            msg&#91;\"To\"] = recipient\n            msg&#91;\"Subject\"] = email_subject\n\n            # Plain text part (fallback)\n            msg.set_content(email_body_text)\n\n            # HTML part (clickable link + formatting)\n            msg.add_alternative(email_body_html, subtype=\"html\")\n\n            server.send_message(msg)\n\n    last_email_sent = time.time()\n    print(\"Email sent successfully!\")<\/code><\/pre>\n\n\n\n<p>Once the bot is all done sending out emails, remember to log out.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.quit()<\/code><\/pre>\n\n\n\n<p class=\"has-text-align-center\">Also read: <strong><a href=\"https:\/\/kocerroxy.com\/blog\/high-scale-bot-automation-succeed-in-competitive-markets\/\" target=\"_blank\" rel=\"noreferrer noopener\">High-Scale Bot Automation: Succeed in Competitive Markets<\/a><\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"SMTP_vs_Email_API\"><\/span>SMTP vs Email API<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>SMTP is great for small, personal alerts. But if you need better deliverability, higher sending volume, logs, retries, and fewer mystery blocks, an email API is usually the upgrade path, especially once you start hitting sending limits.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Scenario<\/th><th>Use SMTP when\u2026<\/th><th>Use an Email API when\u2026<\/th><\/tr><\/thead><tbody><tr><td><strong>Personal alerts (PS5 stock, uptime pings)<\/strong><\/td><td>You\u2019re emailing yourself or a small list and volume is low<\/td><td>You want reliable delivery + logs even for low volume<\/td><\/tr><tr><td><strong>Transactional emails (password resets, receipts)<\/strong><\/td><td>You\u2019re prototyping and don\u2019t care about audit logs yet<\/td><td>You need retries, dashboards, suppression lists, and consistent inboxing<\/td><\/tr><tr><td><strong>Scaling alerts to many recipients<\/strong><\/td><td>You\u2019re sending only occasionally and staying far from provider limits<\/td><td>You need predictable throughput and don\u2019t want account throttling\/blocks<\/td><\/tr><tr><td><strong>Deliverability matters (avoid spam)<\/strong><\/td><td>You\u2019re ok with \u201cgood enough\u201d and low volume<\/td><td>You need domain authentication + reputation tooling + better placement controls<\/td><\/tr><tr><td><strong>Observability<\/strong><\/td><td>You\u2019ll accept minimal visibility<\/td><td>You want event webhooks, analytics, and traceability per message<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">When to Use SMTP vs an Email API<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Deliverability_Basics\"><\/span>Deliverability Basics<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>If you send from <strong>your own domain<\/strong> (example: <code>alerts@yourdomain.com<\/code>), deliverability isn\u2019t luck, it\u2019s paperwork for robots:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>SPF<\/strong> tells receivers which servers are allowed to send mail for your domain.<\/li>\n\n\n\n<li><strong>DKIM<\/strong> cryptographically signs the message to prove it wasn\u2019t tampered with.<\/li>\n\n\n\n<li><strong>DMARC<\/strong> tells receivers what to do if SPF\/DKIM fail and enforces \u201calignment\u201d with your From domain.<\/li>\n<\/ul>\n\n\n\n<p>Google\u2019s Gmail sender guideline explicitly call out SPF\/DKIM for all senders and SPF+DKIM+DMARC for higher-volume senders.<\/p>\n\n\n\n<p>If you send <strong>5,000+ messages\/day<\/strong> to Gmail accounts, Google also requires DMARC and other bulk-sender rules.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Debugging_Locally\"><\/span>Debugging Locally<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Before you point your code at Gmail, run a local catch-all SMTP server so you can test content, subjects, and loops without spamming real inboxes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Option_A_aiosmtpd_recommended_for_modern_Python\"><\/span>Option A: aiosmtpd (recommended for modern Python)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install aiosmtpd\naiosmtpd -n -l localhost:8025<\/code><\/pre>\n\n\n\n<p>Then temporarily set:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>smtp_server = \"localhost\"<br>smtp_port = 8025<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Option_B_MailHog_nice_web_UI_great_for_teams\"><\/span>Option B: MailHog (nice web UI, great for teams)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/mailhog\/MailHog\" target=\"_blank\" rel=\"noreferrer noopener\">MailHog<\/a> runs a fake SMTP server and shows captured emails in a web inbox.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -p 1025:1025 -p 8025:8025 mailhog\/mailhog<\/code><\/pre>\n\n\n\n<p>Then use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>smtp_server = \"localhost\"<br>smtp_port = 1025<\/code><\/pre>\n\n\n\n<p>Open the MailHog inbox UI here:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;localhost:8025<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>What we\u2019ve covered so far is enough for a basic notification scraper that you could schedule to run periodically. Next time, we\u2019ll work on upgrading the tracker into a <a href=\"https:\/\/kocerroxy.com\/blog\/how-to-make-a-discord-bot-for-availability-alerts\/\">Discord bot for availability alerts<\/a>. That way, it can announce notifications in chat and passively loop the availability checks.<\/p>\n\n\n\n<p>As you can see, sending email notifications in Python isn\u2019t much of a challenge with a little know-how. But, to ensure you catch drops immediately, your tracker needs to be actively on the lookout.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-a89b3969 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-cyan-bluish-gray-background-color has-background wp-element-button\" href=\"https:\/\/app.kocerroxy.com\/register\"><strong>Get Proxies for Python<\/strong><\/a><\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"FAQs_About_Email_Notifications_in_Python\"><\/span>FAQs About Email Notifications in Python<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Q1_Why_do_I_need_an_App_Password_for_Gmail_in_Python\"><\/span>Q1. Why do I need an App Password for Gmail in Python?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Google no longer supports basic password authentication for SMTP. You must enable 2-Step Verification on your Google account, then create an App Password from security settings. Use this 16-character password in your Python script instead of your regular Gmail password for secure authentication.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Q2_Whats_the_difference_between_SMTP_and_Email_API_for_Python\"><\/span>Q2. What&#8217;s the difference between SMTP and Email API for Python?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>SMTP works for personal, low-volume alerts but offers minimal visibility and deliverability control. Email APIs (SendGrid, Mailgun, SES) provide better deliverability, sending volume, retry logic, analytics, suppression lists, and prevent account throttling. Use SMTP for personal projects; switch to APIs for scaling or transactional emails.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Q3_How_do_I_prevent_my_Python_bot_from_spamming_emails\"><\/span>Q3. How do I prevent my Python bot from spamming emails?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Implement a cooldown timer using time.time() to track the last email sent. Compare current time minus last sent time against your cooldown period (e.g., 60 seconds). Only send emails if enough time has passed: if time.time() &#8211; last_email_sent > email_cooldown.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Q4_What_port_should_I_use_for_Python_SMTP_email\"><\/span>Q4. What port should I use for Python SMTP email?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Use port 587 with TLS encryption via starttls() for modern, secure SMTP connections. Port 465 uses SSL but is outdated. Port 587 is the standardized submission port and works with Gmail (smtp.gmail.com:587) and most email providers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Q5_What_are_SPF_DKIM_and_DMARC_for_email_deliverability\"><\/span>Q5. What are SPF, DKIM, and DMARC for email deliverability?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>SPF authorizes which servers can send mail for your domain. DKIM cryptographically signs messages to prevent tampering. DMARC tells receivers what to do when SPF\/DKIM fail and enforces alignment. Gmail requires these for bulk senders (5,000+ daily messages) to avoid spam folders.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Master email notifications in Python using smtplib and Gmail. Step-by-step tutorial with cooldown timers and multiple recipients.<\/p>\n","protected":false},"author":3,"featured_media":3103,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[139],"tags":[27,30,24],"class_list":["post-1963","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-web-scraping","tag-bots","tag-playstation","tag-web-scraping"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Master Email Notifications in Python in 10 Minutes - KocerRoxy<\/title>\n<meta name=\"description\" content=\"Master email notifications in Python using smtplib and Gmail. Step-by-step tutorial with cooldown timers and multiple recipients.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Master Email Notifications in Python in 10 Minutes - KocerRoxy\" \/>\n<meta property=\"og:description\" content=\"Master email notifications in Python using smtplib and Gmail. Step-by-step tutorial with cooldown timers and multiple recipients.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/\" \/>\n<meta property=\"og:site_name\" content=\"KocerRoxy\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/TheHelenBold\" \/>\n<meta property=\"article:published_time\" content=\"2022-04-08T00:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-27T15:56:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kocerroxy.com\/blog\/wp-content\/uploads\/2024\/02\/Untitled-design-14.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"900\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Helen Bold\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@TheHelenBold\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Helen Bold\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/\"},\"author\":{\"name\":\"Helen Bold\",\"@id\":\"https:\/\/kocerroxy.com\/blog\/#\/schema\/person\/c9c9120b90dac4268b7012486a55074c\"},\"headline\":\"Sending Email Notifications in Python\",\"datePublished\":\"2022-04-08T00:00:00+00:00\",\"dateModified\":\"2026-01-27T15:56:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/\"},\"wordCount\":1905,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kocerroxy.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kocerroxy.com\/blog\/wp-content\/uploads\/2024\/02\/Untitled-design-14.jpg\",\"keywords\":[\"bots\",\"PlayStation\",\"web scraping\"],\"articleSection\":[\"Web Scraping\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/\",\"url\":\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/\",\"name\":\"Master Email Notifications in Python in 10 Minutes - KocerRoxy\",\"isPartOf\":{\"@id\":\"https:\/\/kocerroxy.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kocerroxy.com\/blog\/wp-content\/uploads\/2024\/02\/Untitled-design-14.jpg\",\"datePublished\":\"2022-04-08T00:00:00+00:00\",\"dateModified\":\"2026-01-27T15:56:37+00:00\",\"description\":\"Master email notifications in Python using smtplib and Gmail. Step-by-step tutorial with cooldown timers and multiple recipients.\",\"breadcrumb\":{\"@id\":\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#primaryimage\",\"url\":\"https:\/\/kocerroxy.com\/blog\/wp-content\/uploads\/2024\/02\/Untitled-design-14.jpg\",\"contentUrl\":\"https:\/\/kocerroxy.com\/blog\/wp-content\/uploads\/2024\/02\/Untitled-design-14.jpg\",\"width\":900,\"height\":600,\"caption\":\"Sending Email Notifications in Python\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kocerroxy.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Sending Email Notifications in Python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kocerroxy.com\/blog\/#website\",\"url\":\"https:\/\/kocerroxy.com\/blog\/\",\"name\":\"Kocerroxy\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/kocerroxy.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kocerroxy.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kocerroxy.com\/blog\/#organization\",\"name\":\"Kocerroxy\",\"url\":\"https:\/\/kocerroxy.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/kocerroxy.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kocerroxy.com\/wp-content\/uploads\/2023\/07\/Favicon.png\",\"contentUrl\":\"https:\/\/kocerroxy.com\/wp-content\/uploads\/2023\/07\/Favicon.png\",\"width\":512,\"height\":512,\"caption\":\"Kocerroxy\"},\"image\":{\"@id\":\"https:\/\/kocerroxy.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/kocerroxy.com\/blog\/#\/schema\/person\/c9c9120b90dac4268b7012486a55074c\",\"name\":\"Helen Bold\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/kocerroxy.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7624887d3556e306a0883ab27fba8ad89c7f315532399aacf4e5cd49014bc658?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7624887d3556e306a0883ab27fba8ad89c7f315532399aacf4e5cd49014bc658?s=96&d=mm&r=g\",\"caption\":\"Helen Bold\"},\"description\":\"Helen Bold has been writing about proxies since 2020. Helen specializes in gathering details, checking facts, and bringing value to our readers. In addition to writing articles, Helen does in-depth research and analyzes proxy industry trends. In her free time, she also writes amazing novels. You can read more about her personal work here: helenbold.com\",\"sameAs\":[\"http:\/\/helenbold.com\",\"https:\/\/www.facebook.com\/TheHelenBold\",\"https:\/\/www.instagram.com\/helenboldwriter\/\",\"https:\/\/x.com\/TheHelenBold\"],\"url\":\"https:\/\/kocerroxy.com\/blog\/author\/helen-b\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Master Email Notifications in Python in 10 Minutes - KocerRoxy","description":"Master email notifications in Python using smtplib and Gmail. Step-by-step tutorial with cooldown timers and multiple recipients.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/","og_locale":"en_US","og_type":"article","og_title":"Master Email Notifications in Python in 10 Minutes - KocerRoxy","og_description":"Master email notifications in Python using smtplib and Gmail. Step-by-step tutorial with cooldown timers and multiple recipients.","og_url":"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/","og_site_name":"KocerRoxy","article_author":"https:\/\/www.facebook.com\/TheHelenBold","article_published_time":"2022-04-08T00:00:00+00:00","article_modified_time":"2026-01-27T15:56:37+00:00","og_image":[{"width":900,"height":600,"url":"https:\/\/kocerroxy.com\/blog\/wp-content\/uploads\/2024\/02\/Untitled-design-14.jpg","type":"image\/jpeg"}],"author":"Helen Bold","twitter_card":"summary_large_image","twitter_creator":"@TheHelenBold","twitter_misc":{"Written by":"Helen Bold","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#article","isPartOf":{"@id":"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/"},"author":{"name":"Helen Bold","@id":"https:\/\/kocerroxy.com\/blog\/#\/schema\/person\/c9c9120b90dac4268b7012486a55074c"},"headline":"Sending Email Notifications in Python","datePublished":"2022-04-08T00:00:00+00:00","dateModified":"2026-01-27T15:56:37+00:00","mainEntityOfPage":{"@id":"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/"},"wordCount":1905,"commentCount":0,"publisher":{"@id":"https:\/\/kocerroxy.com\/blog\/#organization"},"image":{"@id":"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#primaryimage"},"thumbnailUrl":"https:\/\/kocerroxy.com\/blog\/wp-content\/uploads\/2024\/02\/Untitled-design-14.jpg","keywords":["bots","PlayStation","web scraping"],"articleSection":["Web Scraping"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/","url":"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/","name":"Master Email Notifications in Python in 10 Minutes - KocerRoxy","isPartOf":{"@id":"https:\/\/kocerroxy.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#primaryimage"},"image":{"@id":"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#primaryimage"},"thumbnailUrl":"https:\/\/kocerroxy.com\/blog\/wp-content\/uploads\/2024\/02\/Untitled-design-14.jpg","datePublished":"2022-04-08T00:00:00+00:00","dateModified":"2026-01-27T15:56:37+00:00","description":"Master email notifications in Python using smtplib and Gmail. Step-by-step tutorial with cooldown timers and multiple recipients.","breadcrumb":{"@id":"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#primaryimage","url":"https:\/\/kocerroxy.com\/blog\/wp-content\/uploads\/2024\/02\/Untitled-design-14.jpg","contentUrl":"https:\/\/kocerroxy.com\/blog\/wp-content\/uploads\/2024\/02\/Untitled-design-14.jpg","width":900,"height":600,"caption":"Sending Email Notifications in Python"},{"@type":"BreadcrumbList","@id":"https:\/\/kocerroxy.com\/blog\/sending-email-notifications-in-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kocerroxy.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Sending Email Notifications in Python"}]},{"@type":"WebSite","@id":"https:\/\/kocerroxy.com\/blog\/#website","url":"https:\/\/kocerroxy.com\/blog\/","name":"Kocerroxy","description":"","publisher":{"@id":"https:\/\/kocerroxy.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kocerroxy.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/kocerroxy.com\/blog\/#organization","name":"Kocerroxy","url":"https:\/\/kocerroxy.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/kocerroxy.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/kocerroxy.com\/wp-content\/uploads\/2023\/07\/Favicon.png","contentUrl":"https:\/\/kocerroxy.com\/wp-content\/uploads\/2023\/07\/Favicon.png","width":512,"height":512,"caption":"Kocerroxy"},"image":{"@id":"https:\/\/kocerroxy.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/kocerroxy.com\/blog\/#\/schema\/person\/c9c9120b90dac4268b7012486a55074c","name":"Helen Bold","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/kocerroxy.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/7624887d3556e306a0883ab27fba8ad89c7f315532399aacf4e5cd49014bc658?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7624887d3556e306a0883ab27fba8ad89c7f315532399aacf4e5cd49014bc658?s=96&d=mm&r=g","caption":"Helen Bold"},"description":"Helen Bold has been writing about proxies since 2020. Helen specializes in gathering details, checking facts, and bringing value to our readers. In addition to writing articles, Helen does in-depth research and analyzes proxy industry trends. In her free time, she also writes amazing novels. You can read more about her personal work here: helenbold.com","sameAs":["http:\/\/helenbold.com","https:\/\/www.facebook.com\/TheHelenBold","https:\/\/www.instagram.com\/helenboldwriter\/","https:\/\/x.com\/TheHelenBold"],"url":"https:\/\/kocerroxy.com\/blog\/author\/helen-b\/"}]}},"_links":{"self":[{"href":"https:\/\/kocerroxy.com\/blog\/wp-json\/wp\/v2\/posts\/1963","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kocerroxy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kocerroxy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kocerroxy.com\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/kocerroxy.com\/blog\/wp-json\/wp\/v2\/comments?post=1963"}],"version-history":[{"count":15,"href":"https:\/\/kocerroxy.com\/blog\/wp-json\/wp\/v2\/posts\/1963\/revisions"}],"predecessor-version":[{"id":8204,"href":"https:\/\/kocerroxy.com\/blog\/wp-json\/wp\/v2\/posts\/1963\/revisions\/8204"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kocerroxy.com\/blog\/wp-json\/wp\/v2\/media\/3103"}],"wp:attachment":[{"href":"https:\/\/kocerroxy.com\/blog\/wp-json\/wp\/v2\/media?parent=1963"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kocerroxy.com\/blog\/wp-json\/wp\/v2\/categories?post=1963"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kocerroxy.com\/blog\/wp-json\/wp\/v2\/tags?post=1963"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}