Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Acme.Sh
Commits
ce2ff25e
Commit
ce2ff25e
authored
Feb 14, 2021
by
medmunds
Committed by
Alexander Kulumbeg
Mar 21, 2021
Browse files
Implement curl version of smtp notify-hook
parent
65a1b892
Changes
1
Show whitespace changes
Inline
Side-by-side
notify/smtp.sh
View file @
ce2ff25e
...
...
@@ -127,14 +127,16 @@ smtp_send() {
py
*
)
_smtp_send
=
_smtp_send_python
;;
*
)
_err
"Can't figure out how to invoke
$_SMTP_BIN
."
_err
"
Please re-run with --debug and report a bu
g."
_err
"
Check your SMTP_BIN settin
g."
return
1
;;
esac
if
!
smtp_output
=
"
$(
$_smtp_send
)
"
;
then
_err
"Error sending message with
$_SMTP_BIN
."
_err
"
${
smtp_output
:-
(No additional details; try --debug or --debug 2)
}
"
if
[
-n
"
$smtp_output
"
]
;
then
_err
"
$smtp_output
"
fi
return
1
fi
...
...
@@ -152,12 +154,109 @@ smtp_send() {
return
0
}
# Send the message via curl using _SMTP_* variables
_smtp_send_curl
()
{
# TODO: implement
echo
"_smtp_send_curl not implemented"
# curl passes --mail-from and --mail-rcpt directly to the SMTP protocol without
# additional parsing, and SMTP requires addr-spec only (no display names).
# In the future, maybe try to parse the addr-spec out for curl args (non-trivial).
if
_email_has_display_name
"
$_SMTP_FROM
"
;
then
_err
"curl smtp only allows a simple email address in SMTP_FROM."
_err
"Change your SMTP_FROM='
$SMTP_FROM
' to remove the display name."
return
1
fi
if
_email_has_display_name
"
$_SMTP_TO
"
;
then
_err
"curl smtp only allows simple email addresses in SMTP_TO."
_err
"Change your SMTP_TO='
$SMTP_TO
' to remove the display name(s)."
return
1
fi
# Build curl args in $@
case
"
$_SMTP_SECURE
"
in
none
)
set
--
--url
"smtp://
${
_SMTP_HOST
}
:
${
_SMTP_PORT
}
"
;;
ssl
)
set
--
--url
"smtps://
${
_SMTP_HOST
}
:
${
_SMTP_PORT
}
"
;;
tls
)
set
--
--url
"smtp://
${
_SMTP_HOST
}
:
${
_SMTP_PORT
}
"
--ssl-reqd
;;
*
)
# This will only occur if someone adds a new SMTP_SECURE option above
# without updating this code for it.
_err
"Unhandled _SMTP_SECURE='
$_SMTP_SECURE
' in _smtp_send_curl"
_err
"Please re-run with --debug and report a bug."
return
1
;;
esac
set
--
"
$@
"
\
--upload-file
-
\
--mail-from
"
$_SMTP_FROM
"
\
--max-time
"
$_SMTP_TIMEOUT
"
# Burst comma-separated $_SMTP_TO into individual --mail-rcpt args.
_to
=
"
${
_SMTP_TO
}
,"
while
[
-n
"
$_to
"
]
;
do
_rcpt
=
"
${
_to
%%,*
}
"
_to
=
"
${
_to
#*,
}
"
set
--
"
$@
"
--mail-rcpt
"
$_rcpt
"
done
_smtp_login
=
"
${
_SMTP_USERNAME
}
:
${
_SMTP_PASSWORD
}
"
if
[
"
$_smtp_login
"
!=
":"
]
;
then
set
--
"
$@
"
--user
"
$_smtp_login
"
fi
if
[
"
$_SMTP_SHOW_TRANSCRIPT
"
=
"True"
]
;
then
set
--
"
$@
"
--verbose
else
set
--
"
$@
"
--silent
--show-error
fi
raw_message
=
"
$(
_smtp_raw_message
)
"
_debug2
"curl command:"
"
$_SMTP_BIN
"
"
$*
"
_debug2
"raw_message:
\n
$raw_message
"
echo
"
$raw_message
"
|
"
$_SMTP_BIN
"
"
$@
"
}
# Output an RFC-822 / RFC-5322 email message using _SMTP_* variables
_smtp_raw_message
()
{
echo
"From:
$_SMTP_FROM
"
echo
"To:
$_SMTP_TO
"
echo
"Subject:
$(
_mime_encoded_word
"
$_SMTP_SUBJECT
"
)
"
if
_exists
date
;
then
echo
"Date:
$(
date
+
'%a, %-d %b %Y %H:%M:%S %z'
)
"
fi
echo
"Content-Type: text/plain; charset=utf-8"
echo
"X-Mailer: acme.sh --notify-hook smtp"
echo
echo
"
$_SMTP_CONTENT
"
}
# Convert text to RFC-2047 MIME "encoded word" format if it contains non-ASCII chars
# text
_mime_encoded_word
()
{
_text
=
"
$1
"
# (regex character ranges like [a-z] can be locale-dependent; enumerate ASCII chars to avoid that)
_ascii
=
'] $`"'
"[!#%&'()*+,./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ~^_abcdefghijklmnopqrstuvwxyz{|}~-"
if
expr
"
$_text
"
:
"^.*[^
$_ascii
]"
>
/dev/null
;
then
# At least one non-ASCII char; convert entire thing to encoded word
printf
"%s"
"=?UTF-8?B?
$(
printf
"%s"
"
$_text
"
| _base64
)
?="
else
# Just printable ASCII, no conversion needed
printf
"%s"
"
$_text
"
fi
}
# Simple check for display name in an email address (< > or ")
# email
_email_has_display_name
()
{
_email
=
"
$1
"
expr
"
$_email
"
:
'^.*[<>"]'
>
/dev/null
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment