From ccc1ff6a2157bd21177887e6bfef3eb9a540a961 Mon Sep 17 00:00:00 2001 From: Adam Cooper Date: Sat, 3 Aug 2024 10:36:19 -0400 Subject: [PATCH] [bin][autoreply] Nearly working; messages are not being saved to the Sent folder --- bin/autoreply/autoreply.sh | 91 ++++++++++++++++++++++---------------- 1 file changed, 54 insertions(+), 37 deletions(-) diff --git a/bin/autoreply/autoreply.sh b/bin/autoreply/autoreply.sh index d54ca19..0f8644f 100755 --- a/bin/autoreply/autoreply.sh +++ b/bin/autoreply/autoreply.sh @@ -10,52 +10,69 @@ set -euo pipefail if [[ -z "$(notmuch search tag:misdirected)" ]] ; then - echo "[autoreply.sh] Currently no emails are tagged 'misdirected'. Exiting..." - exit 1 + echo "[autoreply.sh] Currently no emails are tagged 'misdirected'. Exiting..." + exit 1 fi +# !!! Script just craps out here when invoked with no flag. Refactor to +# match https://www.man7.org/linux/man-pages/man1/getopts.1p.html#EXAMPLES +dry_run= +while getopts n opt ; do + printf "[debug] opt: %s\n\n" $opt + case $opt in + n) dry_run=1;; + ?) echo "Usage: /path/to/autoreply.sh/ [ -n ]" + exit 2;; + esac +done + # This weird feed-find-output-into-while-loop comes from # https://github.com/koalaman/shellcheck/wiki/SC2044#correct-code -while IFS= read -r -d '' file ; do - echo "[loop] Preparing the email..." +while IFS= read -r -d '' thread ; do + echo "[loop] Preparing the email..." - # Make a temporary file - temporary_file=$(mktemp /tmp/autoreply-XXXXX) - echo "[debug] Temporary file: $temporary_file" # debug + # Make a temporary file + temporary_file=$(mktemp /tmp/autoreply-XXXXX) + echo "[debug] Temporary file: $temporary_file" - # Pull sender (i.e. recipient of my email), subject, and date from email - recipient="$(perl -lane 'print if /^From:/' "$file" | cut -d' ' -f2-)" ### "Frantz Fanon " - subject="Re: $(perl -lane 'print if /^Subject:/' "$file" | cut -d' ' -f2-)" ### "Re: Lorem ipsum baby" - date="$(perl -lane 'print if /^Date:/' "$file" | cut -d' ' -f2-)" + # Parse out the thread-id + thread_id=$(echo "$thread" | cut -f2 -d':') + echo "[debug] thread_id: $thread_id" - # Copy canned message to temporary file - printf "To: $recipient\nFrom: adam@theadamcooper.com\nCc: amcooper@gmail.com\nDate: $(date +'%a, %d %b %Y %R %z')\nSubject: $subject\n\n" > "$temporary_file" - cat /home/adam/dotfiles/bin/autoreply/misdirected_email_autoreply.txt >> "$temporary_file" - printf "\n\nOn $date, $recipient wrote:\n" >> "$temporary_file" - - # Append email body to temporary file - discard="0" - while IFS= read -r line ; do - if [[ $discard = "1" ]]; then - echo "> $line" >> "$temporary_file" - else - if [[ -z "$line" ]]; then - discard="1" - fi - fi - done < "$file" + # Parse out the reply headers and original message body + temporary_reply=$(mktemp /tmp/notmuch-reply-XXXXX) + echo "[debug] Temporary reply: $temporary_reply" + notmuch reply --format=json thread:$thread_id > $temporary_reply + subject="$(jq -r '."reply-headers".Subject' $temporary_reply)" + sender="$(jq -r '."reply-headers".From' $temporary_reply)" + recipient="$(jq -r '."reply-headers".To' $temporary_reply)" + in_reply_to="$(jq -r '."reply-headers"."In-reply-to"' $temporary_reply)" + references="$(jq -r '."reply-headers".References' $temporary_reply)" + orig_sender="$(jq -r '.original.headers.From' $temporary_reply)" + date="$(jq -r '.original.headers.Date' $temporary_reply)" + orig_body="$(jq -r '.original.body[0].content[] | select(."content-type" == "text/plain") | .content' $temporary_reply)" - # Send the email! - printf "[debug] Outgoing email:\n$(cat "$temporary_file")\n" # debug - echo "[loop] Sending reply to $recipient ... " - cat "$temporary_file" | msmtp --read-envelope-from --read-recipients - cat "$temporary_file" | notmuch insert --folder=Sent -inbox -unread +sent +misdirected-reply - - # Remove the misdirected tag - notmuch tag -misdirected -- tag:misdirected + # Copy canned message to temporary file + printf "From: %s\nSubject: %s\nTo: %s\nIn-Reply-To: %s\nReferences: %s\n\n" "$sender" "$subject" "$recipient" "$in_reply_to" "$references" >> "$temporary_file" + cat /home/adam/dotfiles/bin/autoreply/misdirected_email_autoreply.txt >> "$temporary_file" + printf "\n\nOn %s, %s wrote:\n" "$date" "$orig_sender" >> "$temporary_file" - echo "[loop] Done." + # Append email body to temporary file + printf "%s\n" "$orig_body" >> "$temporary_file" -done < <(notmuch search --output=files --format=text0 tag:misdirected) + # Send the email! + printf "[debug] Outgoing mail:\n%s\n" "$(cat $temporary_file)" + if [[ -z "$dry_run" ]] ; then + echo "[loop] Sending reply to $recipient ... " + cat "$temporary_file" | msmtp --read-envelope-from --read-recipients + cat "$temporary_file" | notmuch insert --folder=Sent -inbox -unread +sent +misdirected-reply + + # Remove the misdirected tag + notmuch tag -misdirected -- thread:"$thread_id" + fi + + printf "%s\n\n" "[loop] Done." + +done < <(notmuch search --output=threads --format=text0 tag:misdirected) echo "[autoreply.sh] All done!"