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
30dae70e
Commit
30dae70e
authored
Feb 14, 2021
by
medmunds
Browse files
Implement curl version of smtp notify-hook
parent
557a747d
Changes
1
Hide whitespace changes
Inline
Side-by-side
notify/smtp.sh
View file @
30dae70e
...
@@ -127,14 +127,16 @@ smtp_send() {
...
@@ -127,14 +127,16 @@ smtp_send() {
py
*
)
_smtp_send
=
_smtp_send_python
;;
py
*
)
_smtp_send
=
_smtp_send_python
;;
*
)
*
)
_err
"Can't figure out how to invoke
$_SMTP_BIN
."
_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
return
1
;;
;;
esac
esac
if
!
smtp_output
=
"
$(
$_smtp_send
)
"
;
then
if
!
smtp_output
=
"
$(
$_smtp_send
)
"
;
then
_err
"Error sending message with
$_SMTP_BIN
."
_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
return
1
fi
fi
...
@@ -152,12 +154,109 @@ smtp_send() {
...
@@ -152,12 +154,109 @@ smtp_send() {
return
0
return
0
}
}
# Send the message via curl using _SMTP_* variables
# Send the message via curl using _SMTP_* variables
_smtp_send_curl
()
{
_smtp_send_curl
()
{
# TODO: implement
# curl passes --mail-from and --mail-rcpt directly to the SMTP protocol without
echo
"_smtp_send_curl not implemented"
# additional parsing, and SMTP requires addr-spec only (no display names).
return
1
# 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