如何使用unix shell脚本中的sendmail命令发送带有特殊字符作为主题的邮件

时间:2014-05-21 14:50:40

标签: shell email unix csv

在我的脚本中,我想发送一个带有一些主题的邮件,一些文本作为正文以及csv文件作为附件

我的问题是主题在葡萄牙语中有特殊字符 像这样

Subject: Relatório de utilização do QRCODE

我使用sendmail命令发送邮件,因为我需要更改发件人姓名(不是电子邮件ID)

我试过了:

    Subject=Relatório de utilização do QRCODE
    mnth=$(date '+%m/%Y' --date="1 month ago")
    echo 'mês:'$mnth>>mailBody.html
    echo 'contagem de registros:'11090>>mailBody.html
    cat mailBody.html>out.mail
    echo "$mnth"
    uuencode QR_Log.csv QR_Report_$fname.csv >> out.mail
    sendmail -F "xyzname" "$subject" -f "receiver@abc.com" <out.mail
    echo "mail sent"

当我运行上面的脚本时,我收到这样的消息:

  

邮箱地址中的语法错误“Relat ?? rio.de.utiliza ???? o.do.QRCODE”   (不可打印的字符)   发送邮件

如何实现这一目标请帮助我......

非常感谢帮助。我等一下

提前致谢

2 个答案:

答案 0 :(得分:1)

我写了一个像这样的shell脚本,我得到了一个有效的标题。尝试重写发送邮件的代码,如MIME:

#!/bin/bash
echo 'To: you@domain.net'>>test.html
echo 'From: Some User <user@domain.net>'>>test.html
echo 'Subject: Relatório de utilização do QRCODE'>>test.html
echo 'MIME-Version: 1.0'>>test.html
echo 'Content-Type: text/html; charset="utf-8"'>>test.html
echo 'Content-Disposition: inline'>>test.html
echo ''>>test.html
echo '<span style="color:red;">Your message goes here</span>'>>test.html
sendmail -i -t < test.html
rm test.html

如果这有帮助,请告诉我们。)

以下是我的回答......

不是Linux家伙,但这可能对你有所帮助。首先,您必须将主题编码为base64。例如:

echo 'your subject' | openssl base64

假设您已将编码后的字符串放入$ subject变量中。接下来,您在发送电子邮件时设置这样的主题:

"=?UTF-8?B?$subject?="

基本上尝试在base64编码的主题之前放置 =?UTF-8?B?,在没有空格之后放?=

正如我所说,我不是一个Linux家伙,但你会管理:)

如果有帮助,请告诉我。

答案 1 :(得分:0)

rfc2045-(5)(软换行符)Quoted-Printable编码要求编码的行长不能超过76个字符。 对于bash shell脚本代码:

#!/bin/bash
subject_encoder(){
  echo -n "$1" | xxd -ps -c3 |awk -Wposix 'BEGIN{
    BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    printf " =?UTF-8?B?"; bli=8
  }
  function encodeblock (strin){
    b1=sprintf("%d","0x" substr(strin,1,2))
    b2=sprintf("%d","0x" substr(strin,3,2))
    b3=sprintf("%d","0x" substr(strin,5,2))
    o=substr(BASE64,b1/4 + 1,1) substr(BASE64,(b1%4)*16 + b2/16 + 1,1)
    len=length(strin)
    if(len>1) o=o substr(BASE64,(b2%16)*4 + b3/64 + 1,1); else o=o"="
    if(len>2) o=o substr(BASE64,b3%64 +1 ,1); else o=o"="
    return o
  }{
    bs=encodeblock($0)
    bl=length(bs)
    if((bl+bli)>64){
      printf "?=\n =?UTF-8?B?"
      bli=bl
    }
    printf bs
    bli+=bl
  }END{
    printf "?=\n"
  }'
}
SUBJECT="Relatório de utilização"
SUBJECT=`subject_encoder "${SUBJECT}"`
echo '<html>test</html>'| mail -a "Subject:${SUBJECT}" -a "MIME-Version: 1.0" -a "Content-Type: text/html; charset=UTF-8" you@domain.net