Bash

嘗試通過郵件發送多個文本附件

  • December 18, 2015

執行此腳本:“Red Had Enterprise Linux Server release 5.11 (Tikanga)”

郵件是:8.1 6/6/93 版(看起來很舊)。

嘗試了各種事情,但似乎無法讓它發揮作用..

echo "Email message" | mail -a /home/user/checks/notprocessed.txt -a /home/user/checks/dirlist.txt -s "Subject" recipient@company.com /home/user/checks

結果消息:

郵件:無效選項——a

未安裝 mutt,我對該系統的訪問權限有限,因為它歸我工作的公司所有。我可以添加其他組件,但必須通過變更管理和相關流程。

uuencode 也不可用。

這是我今天使用的內容,我正在嘗試將第二個文件添加到:

if grep 'Not Empty' /home/user/checks/notprocessed.txt
  then
  echo "files were found";

  SUBJECT="NIGHTLY DIRECTORY LISTING OF FILES SENT TO VENDOR";
  FROM="SENDER<sender@company.com>"
  # EMAIL="JOHN DOE<recipient@company.com>"
  EMAIL="MARY DOE<recipient@company.com>";
  /bin/mail -s "$SUBJECT" "$EMAIL" -- -f "$FROM" < /home/user/checks/notprocessed.txt /home/user/checks/dirlist.txt

  exit -20
fi

並且.. /home/user/checks/dirlist.txt 沒有附加或包含在電子郵件中。我希望 /home/user/checks/dirlist.txt 實際上是一個附件

這確實有效 - 但包括 notprocessed.txt 作為電子郵件的正文。

if grep 'Not Empty' /home/user/checks/notprocessed.txt
  then
  echo "files were found";

  SUBJECT="NIGHTLY DIRECTORY LISTING OF FILES SENT TO VENDOR";
  FROM="SENDER<sender@company.com>"
  # EMAIL="JOHN DOE<recipient@company.com>"
  EMAIL="MARY DOE<recipient@company.com>";
  /bin/mail -s "$SUBJECT" "$EMAIL" -- -f "$FROM" < /home/user/checks/notprocessed.txt

  exit -20
fi

好吧,當您執行 stdin 重定向 ( <) 時會發生什麼,即打開第一個文件 - 並且只有第一個 - 並將其內容傳遞給mail’s stdin,後者將其用作正文。

因為您的mailx實現是舊的,它不支持目前版本的-a標誌來創建 MIME 附件。您可以做的是自己創建 MIME 格式,使用可用的東西。

幸運的是,使用簡單的 bash 腳本並不難(即使在 RHEL 5 上,我也 100% 確定它是可用的 :-)),這樣簡單的事情可能會做到:

#!/bin/bash
msgid="$RANDOM$RANDOM$RANDOM$RANDOM"
to="$1"
shift
subject="$1"
shift
echo "To: $to"
echo "From: secret-admirer@example.com"
echo "Subject: $subject"
echo "Message-ID: $msgid"
echo "MIME-Version: 1.0"
echo "Content-Type: multipart/mixed; boundary=$msgid"
echo "" # header termination
while [ -n "$1" ]; do 
   echo "--$msgid"
   echo "Content-Type: text/plain; charset=UTF-8"
   echo "Content-Disposition: attachment; filename=\"$(basename $1)\""
   echo "Content-Transfer-Encoding: base64"
   echo ""
   base64 < "$1"
   shift
done

然後您只需要將生成的電子郵件文本送出到以sendmail進行傳遞,如下所示:

mail.sh "$SUBJECT" "$EMAIL" /home/user/checks/notprocessed.txt \
  /home/user/checks/dirlist.txt | sendmail -t

該腳本使用base64“ASCII Armor”文件的命令,因此您可以發送文本文件和二進製文件,但如果您不發送文本文件,您可能想弄清楚如何Content-type正確設置附件(或者只是將其全部更改為application/octet-stream,即“二進制”)。該命令可作為 RHEL 5 上 coreutils 的一部分使用,因此我不認為使用它會出現問題。

另請注意,使用該-t標誌讓sendmailMTA 僅從郵件本身讀取電子郵件信封,因此無需在sendmail命令參數中添加任何其他內容。只需確保腳本在輸出中包含所有需要的欄位 - 我已經讓它從命令行讀取收件人和主題mailx,但它不是必需的,並且發件人地址無論如何都是硬編碼的。

引用自:https://unix.stackexchange.com/questions/248965