通过带有变量的bash脚本中的ssh发送包含mailx的电子邮件

时间:2015-05-26 11:15:19

标签: bash shell email ssh mailx

我努力通过ssh用mailx发送电子邮件。这是用例。我正在编写一个小型部署脚本,并希望在最后发送自定义电子邮件。由于我们的开发机器不能直接发送电子邮件,我想通过ssh使用集成机器来完成这项工作。在脚本中,收件人,主题和电子邮件内容都存储在变量中。内容是用Markdown编写的,因为它在项目中作为更改日志提交。

这是我试过的命令:

ssh user@host "echo -e ${CHANGELOG_CONTENT} | mailx -s \"${PROJECT_NAME} - ${TARGET_VERSION} - ${RELEASE_DATE}\" ${CHANGELOG_RECIPIENTS}"

在此之前我尝试了几种变体,但没有运气。这个版本给了我这个错误:

bash: -c: line 0: syntax error near unexpected token `('

这是一个命令示例,其中变量被其内容(手工制作)替换:

ssh user@host "echo -e Version 1.2\n\n- branch-1 : [gitlab link](http://gitlab.example.com/project-alpha/commits/branch-1)\n\n | mailx -s "Project Alpha - 1.2 - 2015-26-05 13:10" me@example.com you@example.com"

我很确定我的错误来自错误的转义/引用,但由于我使用SSH嵌套命令,我无法找到正确的组合。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用heredocs将整个脚本动态地提供给远程/bin/sh的stdin:

ssh user@host /bin/sh <<EOF
mailx -s "${PROJECT_NAME} - ${TARGET_VERSION} - ${RELEASE_DATE}" ${CHANGELOG_RECIPIENTS} <<'END_OF_MAIL_BODY'
${CHANGELOG_CONTENT}
END_OF_MAIL_BODY
EOF

请注意,如果$CHANGELOG_CONTENT包含以END_OF_MAIL_BODY开头的行,则会失败。

顺便说一下,我更喜欢使用sendmail。它可以更好地控制发送邮件。

ssh user@host /bin/sh <<EOF
sendmail -t <<'END_OF_MAIL_HEADER_AND_BODY'
From: ${CHANGELOG_SENDER}
Subject: ${PROJECT_NAME} - ${TARGET_VERSION} - ${RELEASE_DATE}
Bcc: ${CHANGELOG_RECIPIENTS}

${CHANGELOG_CONTENT}
END_OF_MAIL_HEADER_AND_BODY
EOF