Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- set -euo pipefail
- ################################################################################
- ## Fill this in! ##
- ################################################################################
- declare -r server='your.server.name' # server to connect to
- declare -ri port='143' # IMAP with STARTTLS == 143
- declare -r username='someone@your.server.name' # some servers use only someone
- declare -r password='your.clear.text.password' # used for authentication
- declare -r hash='sha256' # md5, sha1, sha256
- ################################################################################
- # This is taken from here: https://www.atmail.com/blog/advanced-imap/
- respond_to_challenge() {
- local digest _
- read _ digest < <(openssl base64 -d <<< "$1" |
- openssl dgst "-${hash}" -hmac "$password")
- printf '%s %s' "$username" "$digest" | openssl base64 -A
- echo
- }
- tmpdir=$(mktemp -d)
- declare -r tmpdir
- declare -a pids
- trap 'rm -Rf "$tmpdir"; ((${#pids[@]})) && kill -9 "${pids[@]/#/-}" || :;' EXIT
- declare -r input="${tmpdir}/imap_server_input"
- declare -r output="${tmpdir}/imap_server_output"
- declare -r value_fifo="${tmpdir}/value_fifo"
- mkfifo "$input" "$output" "$value_fifo"
- # Start the OpenSSL client to connect to the IMAP server.
- openssl s_client -starttls imap -crlf -connect "${server}:$((port))" \
- <"$input" >"$output" 2>/dev/null&
- pids+=("$!")
- # Start the IMAP server input writer.
- {
- echo "1 authenticate cram-${hash}"
- respond_to_challenge "$(< "$value_fifo")"
- [[ "$(< "$value_fifo")" == 'OK' ]]
- echo '2 list "" "*"'
- [[ "$(< "$value_fifo")" == 'OK' ]]
- echo '3 select INBOX'
- [[ "$(< "$value_fifo")" == 'OK' ]]
- echo '4 status INBOX (MESSAGES)'
- [[ "$(< "$value_fifo")" == 'OK' ]]
- echo '5 logout'
- [[ "$(< "$value_fifo")" == 'OK' ]]
- } | tee "$input" &
- pids+=("$!")
- declare -r color_default=$'\033[00m'
- declare -r color_yellow=$'\033[01;33m'
- # Start the IMAP server output reader.
- {
- expected_prefixes=('+' '1' '2' '3' '4' '5')
- output() { :; }
- for expected in "${expected_prefixes[@]}"; do
- prefix=
- while read prefix value rest; do
- prefix="${prefix%$'\r'}"
- value="${value%$'\r'}"
- rest="${rest%$'\r'}"
- [[ "$prefix" != "$expected" ]] || break
- output "$prefix" "$value" "$rest"
- done
- [[ "$prefix" == "$expected" ]]
- output() {
- printf "${color_yellow}%s %s %s${color_default}\n" "$1" "$2" "$3"
- }
- output "$prefix" "$value" "$rest"
- printf '%s' "$value" > "$value_fifo"
- done
- cat >/dev/null
- } <"$output" &
- pids+=("$!")
- declare -i errors=0 idx
- for idx in "${!pids[@]}"; do
- pid="${pids[idx]}"
- unset 'pids[idx]'
- wait -n "$pid" || ((++errors))
- done
- ((! errors))
Add Comment
Please, Sign In to add comment