<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Valentin Kivachuk</title>
    <description>The latest articles on DEV Community by Valentin Kivachuk (@valentin_kivachuk_ef119d0).</description>
    <link>https://dev.to/valentin_kivachuk_ef119d0</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3196770%2Ff39258d8-39bf-4481-91bf-fb17026ed4fd.jpg</url>
      <title>DEV Community: Valentin Kivachuk</title>
      <link>https://dev.to/valentin_kivachuk_ef119d0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/valentin_kivachuk_ef119d0"/>
    <language>en</language>
    <item>
      <title>Postmark, Python, and Perfect Parsing: Simplifying Inbound Emails</title>
      <dc:creator>Valentin Kivachuk</dc:creator>
      <pubDate>Sat, 07 Jun 2025 21:35:11 +0000</pubDate>
      <link>https://dev.to/valentin_kivachuk_ef119d0/postmark-python-and-perfect-parsing-simplifying-inbound-emails-2nea</link>
      <guid>https://dev.to/valentin_kivachuk_ef119d0/postmark-python-and-perfect-parsing-simplifying-inbound-emails-2nea</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Managing inbound emails efficiently is a common challenge, especially when working with Postmark's Inbound API. Parsing raw JSON responses can quickly become overwhelming, leading to unnecessary complexity. To tackle this, I built &lt;a href="https://github.com/vk496/postmark-models" rel="noopener noreferrer"&gt;&lt;code&gt;postmark-models&lt;/code&gt;&lt;/a&gt;—a lightweight library designed to structure and validate Postmark inbound messages using Pydantic models.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;postmark-models&lt;/code&gt;, developers can seamlessly extract relevant email data, enforce schema validation, and minimize manual parsing efforts, making Postmark integration much more manageable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Since this is a library, the best way to test it is through code. Here's a simple demonstration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;poetry add postmark-models &lt;span class="c"&gt;# pip install postmark-models&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;postmark_models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MessageInbound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;example_message&lt;/span&gt;

&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MessageInbound&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;example_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;From: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Subject: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Text Content: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text_body&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example shows how easily an inbound email can be structured using &lt;code&gt;postmark-models&lt;/code&gt;. Developers can incorporate this library into their applications to improve Postmark message handling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Repository
&lt;/h2&gt;

&lt;p&gt;The complete project is available on &lt;a href="https://github.com/vk496/postmark-models" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Feel free to explore the repository, try out the library, and contribute to its development!&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;This project leverages Pydantic for model validation and type safety. The key highlights include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pydantic for structured data validation&lt;/strong&gt; – Ensuring well-formed email messages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplified parsing of Postmark inbound emails&lt;/strong&gt; – No need to manually process JSON responses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced debugging capabilities&lt;/strong&gt; – Easily catch inconsistencies in inbound emails.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building &lt;code&gt;postmark-models&lt;/code&gt; was a great learning experience, allowing me to optimize email workflows with Postmark while making message parsing intuitive and accessible for developers.&lt;/p&gt;

&lt;p&gt;Absolutely! Here are more examples showcasing how &lt;code&gt;postmark-models&lt;/code&gt; can be used to process inbound email messages effectively.&lt;/p&gt;




&lt;h2&gt;
  
  
  More Practical Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example 1: Extracting Attachments
&lt;/h3&gt;

&lt;p&gt;Handling attachments from inbound emails can be tricky, but &lt;code&gt;postmark-models&lt;/code&gt; simplifies it by providing structured access to the attached files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Iterate through attachments
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attachment&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attachments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Attachment: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attachment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, Type: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attachment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, Size: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attachment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attachment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_length&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes it easy to filter specific file types, store attachments, or process them further.&lt;/p&gt;




&lt;h3&gt;
  
  
  Example 2: Extracting Header Information
&lt;/h3&gt;

&lt;p&gt;Postmark inbound messages include headers that may contain useful metadata. &lt;code&gt;postmark-models&lt;/code&gt; provides a clean way to access them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;header_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Custom-Header&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Custom Header Value: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;header_value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is great for applications that need to analyze custom headers for authentication or routing purposes.&lt;/p&gt;




&lt;h3&gt;
  
  
  Example 3: Detecting Email Replies
&lt;/h3&gt;

&lt;p&gt;Many applications rely on email-based communication, and distinguishing between original messages and replies is crucial.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_reply&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;This is a reply email!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;This is a new email.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this approach, you can automate responses differently based on whether the message is a reply or a fresh email.&lt;/p&gt;




&lt;h3&gt;
  
  
  Example 4: Extracting Plain Text vs HTML Content
&lt;/h3&gt;

&lt;p&gt;Sometimes, applications need to decide whether to process the plain text body or the HTML body of an inbound email.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text_body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Processing plain text body:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text_body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;html_body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Processing HTML body:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;html_body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is useful for applications that prioritize plain text responses while still supporting rich HTML content.&lt;/p&gt;




&lt;h3&gt;
  
  
  Example 5: Auto-Forwarding Emails Based on Conditions
&lt;/h3&gt;

&lt;p&gt;With &lt;code&gt;postmark-models&lt;/code&gt;, you can automatically forward certain emails based on predefined conditions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;urgent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;forward_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;support@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures critical emails are routed to the right team or system without manual intervention.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;These examples highlight the versatility of &lt;code&gt;postmark-models&lt;/code&gt; when working with Postmark inbound messages. Whether handling attachments, filtering headers, processing replies, or routing emails, this library simplifies email parsing and enhances workflow automation.&lt;/p&gt;

&lt;p&gt;Feel free to explore the &lt;a href="https://github.com/vk496/postmark-models" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;, try out these examples, and see how they fit into your project!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>postmarkchallenge</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>Postmark + n8n: No Code, No Limits</title>
      <dc:creator>Valentin Kivachuk</dc:creator>
      <pubDate>Wed, 28 May 2025 18:08:40 +0000</pubDate>
      <link>https://dev.to/valentin_kivachuk_ef119d0/postmark-n8n-no-code-no-limits-2ko2</link>
      <guid>https://dev.to/valentin_kivachuk_ef119d0/postmark-n8n-no-code-no-limits-2ko2</guid>
      <description>&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/postmark"&gt;Postmark Challenge: Inbox Innovators&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Receive postmark inbound webhooks with no effort&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd909zxe43v2q6qh4qz22.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd909zxe43v2q6qh4qz22.gif" alt="tldr" width="814" height="744"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge
&lt;/h2&gt;

&lt;p&gt;Experimenting with Postmark’s Inbound Email functionality often requires a tedious setup—writing HTTP request handling code, deploying it to a server, configuring DNS, managing firewalls, and more. Before you even start, the frustration kicks in.&lt;/p&gt;

&lt;p&gt;Wouldn’t it be great if there was just a single button to deploy everything effortlessly? That’s exactly what this project offers: a one-command solution to simplify Postmark webhooks testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo &amp;amp; Setup
&lt;/h2&gt;

&lt;p&gt;To get started, ensure you have &lt;strong&gt;Docker&lt;/strong&gt; installed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;

&lt;p&gt;Your setup includes the following essential files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❯ tree -a -I .git
.
├── docker-compose.yml  # Core functionality
├── .env                # Optional environment variables (credentials, server URL)
├── LICENSE  
└── n8n_node.json       # Pre-configured n8n example


1 directory, 4 files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Deployment
&lt;/h2&gt;

&lt;p&gt;Run the following commands to get started:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/vk496/docker-postmark-n8n
cd docker-postmark-n8n
docker compose up -d
docker compose logs lt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configuring Your Webhook
&lt;/h2&gt;

&lt;p&gt;Once deployed, confirm that your public endpoint is &lt;strong&gt;test-server&lt;/strong&gt; (thanks to &lt;a href="https://theboroer.github.io/localtunnel-www/" rel="noopener noreferrer"&gt;LocalTunnel&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvq4hjb0xpad6r6xxe948.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvq4hjb0xpad6r6xxe948.png" alt="Docker deploy" width="450" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your full webhook callback URL is now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://test-server.loca.lt/webhook/postmark-inbound
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update your &lt;strong&gt;Postmark Inbound Stream settings&lt;/strong&gt;, test your webhook, and observe the results:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5r8ata6algzhq7guzae.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5r8ata6algzhq7guzae.png" alt="Postmark setup" width="800" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, access your n8n instance via:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local &lt;a href="http://localhost:5678" rel="noopener noreferrer"&gt;http://localhost:5678&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Public Tunnel &lt;a href="https://test-server.loca.lt/" rel="noopener noreferrer"&gt;https://test-server.loca.lt/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Default login credentials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Username: admin@example.com  
Password: Admin123  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4237e5y7mqc6wjz15kzo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4237e5y7mqc6wjz15kzo.png" alt="n8n login" width="494" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuapnr51md2buy17kx297.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuapnr51md2buy17kx297.png" alt="n8n main page" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffffq41gv2ffx8lsc2ouc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffffq41gv2ffx8lsc2ouc.png" alt="n8n workflow example" width="800" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Track executions to confirm webhook activity:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78ffquq7n9xzulsw0lbq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78ffquq7n9xzulsw0lbq.png" alt="n8n executions of the workflow" width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;Now that you’ve received the callback, you can leverage it in countless ways!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forward data to an API endpoint&lt;/li&gt;
&lt;li&gt;Transcribe content using AI&lt;/li&gt;
&lt;li&gt;Translate with external services&lt;/li&gt;
&lt;li&gt;Scan for malicious attachments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With &lt;strong&gt;n8n&lt;/strong&gt;, automation possibilities are endless. Take inspiration from &lt;a href="https://n8n.io/workflows/" rel="noopener noreferrer"&gt;n8n workflows templates&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3oz07iybieekmrekozi0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3oz07iybieekmrekozi0.png" alt="n8n main page workflows" width="800" height="721"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚠️ Important: No Persistent Storage
&lt;/h3&gt;

&lt;p&gt;Ensure you export your workflow before restarting or removing the Docker container. This project is not intended for production operations&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Repository
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/vk496/docker-postmark-n8n" rel="noopener noreferrer"&gt;https://github.com/vk496/docker-postmark-n8n&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;Working with &lt;strong&gt;n8n&lt;/strong&gt; inside Docker presented unique challenges, such as initializing default credentials and preloading workflows without direct environment variables. Creativity and workarounds were key to making this project possible.&lt;/p&gt;

&lt;p&gt;Feel free to explore and adapt ideas from the &lt;code&gt;docker-compose.yml&lt;/code&gt; file!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>postmarkchallenge</category>
      <category>webdev</category>
      <category>api</category>
    </item>
  </channel>
</rss>
