aboutsummaryrefslogtreecommitdiff
path: root/content/blog/2022-06-22-daily-poetry.md
diff options
context:
space:
mode:
authorChristian Cleberg <hello@cleberg.net>2024-04-29 14:18:55 -0500
committerChristian Cleberg <hello@cleberg.net>2024-04-29 14:18:55 -0500
commitfdd80eadcc2f147d0198d94b7b908764778184a2 (patch)
treefbec9522ea9aa13e8105efc413d2498c3c5b4cd6 /content/blog/2022-06-22-daily-poetry.md
parentd6c80fdc1dea9ff242a4d3c7d3939d2727a8da56 (diff)
downloadcleberg.net-fdd80eadcc2f147d0198d94b7b908764778184a2.tar.gz
cleberg.net-fdd80eadcc2f147d0198d94b7b908764778184a2.tar.bz2
cleberg.net-fdd80eadcc2f147d0198d94b7b908764778184a2.zip
format line wrapping and fix escaped characters
Diffstat (limited to 'content/blog/2022-06-22-daily-poetry.md')
-rw-r--r--content/blog/2022-06-22-daily-poetry.md110
1 files changed, 51 insertions, 59 deletions
diff --git a/content/blog/2022-06-22-daily-poetry.md b/content/blog/2022-06-22-daily-poetry.md
index e3a0fba..a687ce3 100644
--- a/content/blog/2022-06-22-daily-poetry.md
+++ b/content/blog/2022-06-22-daily-poetry.md
@@ -7,9 +7,8 @@ draft = false
# Source Code
-I don\'t want to bury the lede here, so if you\'d like to see the full
-source code I use to email myself plaintext poems daily, visit the
-repository:
+I don't want to bury the lede here, so if you'd like to see the full source
+code I use to email myself plaintext poems daily, visit the repository:
[daily-poem.git](https://git.cleberg.net/?p=daily-poem.git;a=summary).
# My Daily Dose of Poetry
@@ -17,36 +16,35 @@ repository:
Most of my programming projects are small, random projects that are made
strictly to fix some small problem I have or enhance my quality of life.
-In this case, I was looking for a simply and easy way to get a daily
-dose of literature or poetry to read in the mornings.
+In this case, I was looking for a simply and easy way to get a daily dose of
+literature or poetry to read in the mornings.
-However, I don\'t want to sign up for a random mailing list on just any
-website. I also don\'t want to have to work to find the reading content
-each morning, as I know I would simply give up and stop reading daily.
+However, I don't want to sign up for a random mailing list on just any website.
+I also don't want to have to work to find the reading content each morning, as
+I know I would simply give up and stop reading daily.
-Thus, I found a way to deliver poetry to myself in plain-text format, on
-a daily basis, and scheduled to deliver automatically.
+Thus, I found a way to deliver poetry to myself in plain-text format, on a daily
+basis, and scheduled to deliver automatically.
# Prerequisites
-This solution uses Python and email, so the following process requires
-the following to be installed:
+This solution uses Python and email, so the following process requires the
+following to be installed:
-1. An SMTP server, which can be as easy as installing
- `mailutils` if you\'re on a Debian-based distro.
-2. Python (& pip!)
-3. The following Python packages: `email`,
- `smtplib`, `json`, and `requests`
+1. An SMTP server, which can be as easy as installing `mailutils` if you're on
+ a Debian-based distro.
+2. Python (& pip!)
+3. The following Python packages: `email`, `smtplib`, `json`, and `requests`
# Breaking Down the Logic
-I want to break down the logic for this program, as it\'s quite simple
-and informational.
+I want to break down the logic for this program, as it's quite simple and
+informational.
## Required Packages
-This program starts with a simple import of the required packages, so I
-wanted to explain why each package is used:
+This program starts with a simple import of the required packages, so I wanted
+to explain why each package is used:
``` python
from email.mime.text import MIMEText # Required for translating MIMEText
@@ -57,9 +55,9 @@ import requests # Required to send out a request to the API
## Sending the API Request
-Next, we need to actually send the API request. In my case, I\'m calling
-a random poem from the entire API. If you want, you can call specific
-poems or authors from this API.
+Next, we need to actually send the API request. In my case, I'm calling a
+random poem from the entire API. If you want, you can call specific poems or
+authors from this API.
``` python
json_data = requests.get('https://poetrydb.org/random').json()
@@ -97,24 +95,22 @@ This gives us the following result in JSON:
## Parsing the API Results
-In order to parse this into a readable format, we need to use the
-`json` package and extract the fields we want. In the example
-below, I am grabbing every field presented by the API.
+In order to parse this into a readable format, we need to use the `json` package
+and extract the fields we want. In the example below, I am grabbing every field
+presented by the API.
-For the actual poem content, we need to loop over each line in the
-`lines` variable since each line is a separate string by
-default.
+For the actual poem content, we need to loop over each line in the `lines`
+variable since each line is a separate string by default.
-> You *could* also extract the title or author and make another call out
-> to the API to avoid having to build the plaintext poem with a loop,
-> but it just doesn\'t make sense to me to send multiple requests when
-> we can create a simple loop on our local machine to work with the data
-> we already have.
+> You *could* also extract the title or author and make another call out to the
+> API to avoid having to build the plaintext poem with a loop, but it just
+> doesn't make sense to me to send multiple requests when we can create a
+> simple loop on our local machine to work with the data we already have.
>
> For
> [example](https://poetrydb.org/title/Sonnet%20XXII:%20With%20Fools%20and%20Children/lines.text),
-> look at the raw data response of this link to see the poem\'s lines
-> returned in plaintext.
+> look at the raw data response of this link to see the poem's lines returned
+> in plaintext.
``` python
title = json_data[0]['title']
@@ -127,21 +123,20 @@ for line in json_data[0]['lines']:
## Composing the Email
-Now that I have all the data I need, I just need to compose it into a
-message and prepare the message metadata.
+Now that I have all the data I need, I just need to compose it into a message
+and prepare the message metadata.
-For my daily email, I want to see the title of the poem first, followed
-by the author, then a blank line, and finally the full poem. This code
-snippet combines that data and packages it into a MIMEText container,
-ready to be emailed.
+For my daily email, I want to see the title of the poem first, followed by the
+author, then a blank line, and finally the full poem. This code snippet combines
+that data and packages it into a MIMEText container, ready to be emailed.
``` python
msg_body = title + "\n" + author + "\n\n" + lines
msg = MIMEText(msg_body)
```
-Before we send the email, we need to prepare the metadata (subject,
-from, to, etc.):
+Before we send the email, we need to prepare the metadata (subject, from, to,
+etc.):
``` python
sender_email = 'example@server.local'
@@ -153,10 +148,9 @@ msg['To'] = recipient_email
## Sending the Email
-Now that I have everything ready to be emailed, the last step is to
-simply connect to an SMTP server and send the email out to the
-recipients. In my case, I installed `mailutils` on Ubuntu and
-let my SMTP server be `localhost`.
+Now that I have everything ready to be emailed, the last step is to simply
+connect to an SMTP server and send the email out to the recipients. In my case,
+I installed `mailutils` on Ubuntu and let my SMTP server be `localhost`.
``` python
smtp_server = 'localhost'
@@ -167,9 +161,8 @@ s.quit()
# The Result!
-Instead of including a screenshot, I\'ve copied the contents of the
-email that was delivered to my inbox below since I set this process up
-in plaintext format.
+Instead of including a screenshot, I've copied the contents of the email that
+was delivered to my inbox below since I set this process up in plaintext format.
``` txt
Date: Wed, 22 Jun 2022 14:37:19 +0000 (UTC)
@@ -201,18 +194,17 @@ Some, wise in show, more fools indeed than they.
# Scheduling the Daily Email
-Last, but not least, is scheduling this Python script with
-`crontab`. To schedule a script to run daily, you can add it
-to the `crontab` file. To do this, open `crontab`
-in editing mode:
+Last, but not least, is scheduling this Python script with `crontab`. To
+schedule a script to run daily, you can add it to the `crontab` file. To do
+this, open `crontab` in editing mode:
```sh
crontab -e
```
-In the file, simply paste the following snippet at the bottom of the
-file and ensure that the file path is correctly pointing to wherever you
-saved your Python script:
+In the file, simply paste the following snippet at the bottom of the file and
+ensure that the file path is correctly pointing to wherever you saved your
+Python script:
``` config
0 8 ** ** ** python3 /home/<your_user>/dailypoem/main.py