【问题标题】:Bash Script using mailx to mail attachment使用 mailx 发送附件的 Bash 脚本
【发布时间】:2023-03-19 12:24:01
【问题描述】:

我有一个在 postgres 中运行查询的 bash 脚本,它输出到 csv。我想添加到该脚本以使用 mailx 将该 .csv 文件通过电子邮件发送到特定电子邮件。

我遇到的问题是它不会通过电子邮件发送文件。我可以收到电子邮件,所以我知道 mailx 设置正确。我只是无法将其作为附件通过电子邮件发送。它还可以通过电子邮件发送电子邮件正文中的输出。

这里是代码。

    #!/bin/bash
    NOWDATE=`date +%m-%d-%Y`
    PGPASSWORD=password psql -w -h host -p 5432 -d database -U user -o /tmp/folder/file-$NOWDATE.csv <<EOF
    Query is here

    # remove the first 2 lines of the report as they are headers
    sed -i '2d' /tmp/folder/file-$NOWDATE.csv

    uuencode /tmp/folder/file-$NOWDATE.csv | mailx -s "Accounts No Credit Card Report for '$NOWDATE'" mail@gmail.com

我已经尝试了 mailx 部分:

    uuencode /tmp/folder/file-$NOWDATE.csv /tmp/folder/file-$NOWDATE.csv | mailx -s "Accounts No Credit Card Report for '$NOWDATE'" mail@gmail.com

    uuencode /tmp/folder/file-$NOWDATE.csv file-$NOWDATE.csv | mailx -s "Accounts No Credit Card Report for '$NOWDATE'" mail@gmail.com

所以我遇到的问题是当我运行 .sh 文件时它会吐出这个错误。

    uuencode: fopen-ing /tmp/folder/file-01-11-2011.csv: Unknown system error

【问题讨论】:

  • 路径/tmp/folder/file-$NOWDATE.csv 是否正确?在您拥有文件的地方执行pwd 并仔细检查。当/path/to/file 不存在时会出现此错误。
  • 另外,sed -i '2d' filename 删除第二行,not 前两行。要删除前两行,您需要执行 sed -i '1,2d' filename
  • 杰帕尔。我同意评论是错误的我发现我只需要删除第二行......我首先删除了第一行和第二行。大声笑...好的,我会检查一下。
  • 文件路径确实与密码一起存在,它确实显示了正确的路径。 bahhhhh ...虽然我只是放置了一个通用路径来隐藏它确实显示正确路径的路径.. 想知道是否是 $NOWDATE 将它扔掉,但是我确实尝试了它,即使使用正确的文件名而没有$NOWDATE 并且仍然得到错误。我可能错过了应该安装的东西吗?
  • 如果命令在命令行中运行,那么它也应该在脚本中运行:-)。尝试在变量周围放置花括号。 uuencode /tmp/folder/file-${NOWDATE}.csv /tmp/folder/file-${NOWDATE}.csv | mailx -s "Accounts No Credit Card Report for '$NOWDATE'" mail@gmail.com

标签: bash shell csv attachment mailx


【解决方案1】:

我有同样的问题。执行查询、保存 csv 文件并通过邮件发送的 bash 脚本。就我而言,它给了uuencode: fopen-ing /tmp/folder/file-01-11-2011.csv: Unknown system error

当我使用 ksh shell 执行脚本时,它运行良好,没有任何问题。像这样 - ksh script.sh 这只是另一个指针。如果 uuencode 出错,则尝试使用 ksh 执行它;它可能对你有用。

【讨论】:

    【解决方案2】:

    如果问题出在 uuencode...为什么不能尝试 mailx -a 选项,它也可以将文件附加到邮件中。 查看此link 了解更多信息。

    【讨论】:

    • 谢谢你,我确实使用了 -a 的 mailx 并且它起作用了......非常感谢 Raghuram
    【解决方案3】:
    NOWDATE=`date +%m-%d-%Y`
    

    这取决于您,但请考虑使用 ISO-8601 格式,YYYY-MM-DD (%Y-%m-%d)。除其他优点外,它的分类很好。

    # remove the first 2 lines of the report as they are headers
    sed -i '2d' /tmp/folder/file-$NOWDATE.csv
    

    这不会删除前两行,它只是删除第二行。将'2d' 更改为'1,2d'(但见下文)。

    请注意,这会修改文件。

    uuencode /tmp/folder/file-$NOWDATE.csv | mailx [...]
    

    如果uuencode 只指定了一个文件名,它会从标准输入中读取并将名称放入其输出中。您的以下文本“我已经尝试了 mailx 部分:” ...,表明您可能已经意识到这一点——但除了 sn-ps 之外,您还没有向我们展示修复该问题的代码。

    您收到的错误消息:

    uuencode: fopen-ing /tmp/folder/file-01-11-2011.csv: Unknown system error
    

    不是如果文件不存在,您通常会得到什么。我不知道什么会导致这样的“未知系统错误”。

    但这里有一个替代方案,(a) 恕我直言,(b) 不需要 uuencode 来尝试读取文件:

    #!/bin/bash
    
    NOWDATE=`date +%m-%d-%Y` # but %Y-%d-%m is better
    DIR=/tmp/folder
    FILE=file-$NOWDATE.csv
    RECIPIENT=user@example.com
    
    PGPASSWORD=password psql -w -h host -p 5432 -d database -U user -o $DIR/$FILE <<EOF
    ... Query is here
    EOF
    
    tail -n +3 $DIR/$FILE | uuencode $FILE | \
        mailx -s "Accounts No Credit Card Report for '$NOWDATE'" $RECIPIENT
    

    【讨论】:

    • 感谢 Keith,您的格式帮助我简化了流程。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2022-12-16
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    相关资源
    最近更新 更多