我正在使用 mailx 和 sendmail 函数从一组发送邮件索拉里斯不同版本的机器。而且该脚本适用于大多数机器发送邮件。为少数服务器发送邮件仍然存在问题。但执行此脚本时没有显示错误。
脚本1:
uuencode report.html report.html | mailx -s "mail subject" [email protected]
脚本2:
SELFDIR=`pwd`
DOCROOT=$SELFDIR"/"
MAIL_FROM="[email protected]"
MAIL_TO="[email protected]"
echo "From: "$MAIL_FROM > $DOCROOT"header.txt"
echo "To: "$MAIL_TO >> $DOCROOT"header.txt"
echo "Subject: The mail subject " >> $DOCROOT"header.txt"
echo "Content-Type: text/html" >> $DOCROOT"header.txt"
cat $DOCROOT"header.txt" $DOCROOT"report.html" | /usr/lib/sendmail -t
简单来说有什么办法可以找到邮件发送失败的错误或者日志来识别失败的原因吗?
答案1
自从我上次在 Solaris 上使用以来已经有很长一段时间了sendmail
,但我确信它的-v
标志会显示发生了什么:
(
echo 'From: [email protected]'
echo 'To: [email protected]'
echo 'Subject: from me to you'
echo
finger
) | sendmail -t -v
我也很确定会mailx
传递这个标志:
echo hello, world | mailx -v -s "mail subject" [email protected]
检查/var/log/syslog
消息sendmail
。另请阅读Solaris sendmail 终极故障排除指南这有助于解决 Solaris 版本 8、9、10 之间的差异。
答案2
这是脚本的稍微改进版本。它$(pwd)
在文字字符串(From 和 To 地址以及主题字符串)周围使用单引号,而不是反引号,在需要变量插值的地方使用双引号,并使用heredoc 作为标题而不是多echo
行。我喜欢使用字符串__EOF__
来分隔此处文档,因为它不太可能出现在此处文档的正文中......任何任意字符串都可以。
请注意定界文档末尾之前的最后一个空行 - 空行是必需的分隔邮件标题和正文。
顺便说一句,变量在此处的插入方式与双引号字符串相同。您甚至可以$(...)
在其中使用命令替换。
#! /bin/sh
DOCROOT=$(pwd)
$header="$DOCROOT/header.txt"
$body="$DOCROOT/report.html"
MAIL_FROM='[email protected]'
MAIL_TO='[email protected]'
$subject='The mail subject'
cat <<__EOF__ > "$header"
From: $MAIL_FROM
To: $MAIL_TO
Subject: $subject
Content-Type: text/html
__EOF__
cat "$header" "$body" | /usr/lib/sendmail -t
让我知道这是否可以解决您的问题。
顺便说一句,要回答您的实际问题,sendmail
应该记录到您系统上发送设施邮件的任何地方 - 可能/var/log/mail.log
或类似,请尝试grep mail /etc/syslog.conf
验证这一点。