diff options
author | Christian Cleberg <hello@cleberg.net> | 2024-04-29 14:18:55 -0500 |
---|---|---|
committer | Christian Cleberg <hello@cleberg.net> | 2024-04-29 14:18:55 -0500 |
commit | fdd80eadcc2f147d0198d94b7b908764778184a2 (patch) | |
tree | fbec9522ea9aa13e8105efc413d2498c3c5b4cd6 /content/blog/2022-06-22-daily-poetry.md | |
parent | d6c80fdc1dea9ff242a4d3c7d3939d2727a8da56 (diff) | |
download | cleberg.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.md | 110 |
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 |