我正在运行一个使用 msmtp 发送电子邮件的节点应用程序。当简单地以用户身份运行应用程序时(例如在屏幕中),它可以正确使用我的
.msmtprc
并能够使我们的邮件服务器传递邮件。
我现在将该应用程序安装为 systemd 服务,因此如果它因任何原因崩溃,它会重新启动。
配置为:
[UNIT]
Description=MyApp
[SERVICE]
Type=simple
WorkingDirectory=/home/me/app
ExecStart=/usr/bin/npm run start
User=me
Group=me
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
一切正常,但发送邮件除外。我通过生成 msmtp 进程并将邮件内容写入其标准输入来执行此操作:
try {
const process = child_process.spawn(
"msmtp",
["-t"]
);
process.stdin.write("From: " + returnMail + "\n");
process.stdin.write("MIME-Version: 1.0\n");
process.stdin.write("Content-Type: text/html\n");
process.stdin.write("To: " + recepient + "\n");
process.stdin.write(
"Subject: Some Subject\n\n"
);
process.stdin.write(`<!DOCTYPE HTML>
<html>
<head><title>Some Subject</title>
<body>
<h1>Something happened</h1>
<h2>Oh No!</h2>
<div>${content}</div>
</body>
</html>`
);
process.stdin.end();
} catch (error) {
console.error(error);
return;
}
我没有得到任何错误输出(当观察生成进程的 stdout 和 stderr 时)或捕获意味着该进程未执行的错误。
systemd 服务似乎无法遵循符号链接。我将“sendmail”设置为“msmtp”的符号链接,并通过将名为 sendmail 的符号链接放入我的 /usr/local/bin 中,将“sendmail”用作 msmtp 的别名。像上面的代码一样将 msmtp 硬编码为可执行文件。