linux mail发送中文正文变成附件的处理

当使用bash脚本通过mail发送包含中文的文本文件时,有时内容会被作为附件发送。问题可能由文件的格式或bash环境的编码设置引起。确保文件不是Windows格式,并在脚本中设置正确的LANG环境变量,例如`export LANG=en_US.UTF-8`,以确保正确处理中文字符。


cat sendmail.sh 
#!/bin/bash

dutyFile=duty.txt
subject="每周轮值邮件"
tomail=xx@xx.com
frommail=xx@xx.com


cat $dutyFile | /bin/mail -s "$subject" -r "$frommail" "$tomail"


echo "execute time : "`date` >> log2


手动输入命令接收邮件内容却显示正常,crontab 执行正文内容就放到附件了。

网上查了查,两个原因(1)格式问题,也就是dutu.txt文件是不是window下的结束符,如果是需要修改

(2)bash运行时系统编码环境不通导致。查看系统编码环境

  1. # locale  
  2. LANG=en_US.UTF-8
  3. LC_CTYPE="en_US.UTF-8"
    LC_NUMERIC="en_US.UTF-8"
    LC_TIME="en_US.UTF-8"
    LC_COLLATE="en_US.UTF-8"
    LC_MONETARY="en_US.UTF-8"
    LC_MESSAGES="en_US.UTF-8"
    LC_PAPER="en_US.UTF-8"
    LC_NAME="en_US.UTF-8"
    LC_ADDRESS="en_US.UTF-8"
    LC_TELEPHONE="en_US.UTF-8"
    LC_MEASUREMENT="en_US.UTF-8"
    LC_IDENTIFICATION="en_US.UTF-8"
把发送命令更改为
  1. #!/bin/bash  
  2. export LANG=en_US.UTF-8
  3. 。。
  4. ...  
则是接收邮件就正常显示为中文了。 linux

cat sendmail.sh 
#!/bin/bash

dutyFile=duty.txt
subject="每周轮值邮件"
tomail=xx@xx.com
frommail=xx@xx.com


cat $dutyFile | /bin/mail -s "$subject" -r "$frommail" "$tomail"


echo "execute time : "`date` >> log2


手动输入命令接收邮件内容却显示正常,crontab 执行正文内容就放到附件了。

网上查了查,两个原因(1)格式问题,也就是dutu.txt文件是不是window下的结束符,如果是需要修改

(2)bash运行时系统编码环境不通导致。查看系统编码环境

  1. # locale  
  2. LANG=en_US.UTF-8
  3. LC_CTYPE="en_US.UTF-8"
    LC_NUMERIC="en_US.UTF-8"
    LC_TIME="en_US.UTF-8"
    LC_COLLATE="en_US.UTF-8"
    LC_MONETARY="en_US.UTF-8"
    LC_MESSAGES="en_US.UTF-8"
    LC_PAPER="en_US.UTF-8"
    LC_NAME="en_US.UTF-8"
    LC_ADDRESS="en_US.UTF-8"
    LC_TELEPHONE="en_US.UTF-8"
    LC_MEASUREMENT="en_US.UTF-8"
    LC_IDENTIFICATION="en_US.UTF-8"
把发送命令更改为
  1. #!/bin/bash  
  2. export LANG=en_US.UTF-8
  3. 。。
  4. ...  
则是接收邮件就正常显示为中文了。 linux

### 如何在 Linux 中使用 `mail` 或 `mailx` 命令发送多个附件Linux 系统中,可以通过 `mail` 或者更高级的 `mailx` 工具来实现邮件的发送操作。然而,默认情况下,标准的 `mail` 命令并不支持直接附加多个文件的功能[^2]。为了满足这一需求,可以借助 `-a` 参数逐个指定单个附件或者通过管道和 MIME 编码的方式处理附件的情况。 以下是几种常见的方法: #### 方法一:使用 `mutt` 实现多附件发送 虽然题目提到的是 `mail` 命令,但在实际应用中,如果需要更加灵活的支持(比如一次性添加多个附件),推荐使用 `mutt` 这样的工具替代默认的 `mail` 命令。下面是一个基于 `mutt` 的例子: ```bash echo "This is the body of the email" | mutt -s "Subject here" \ -a /path/to/file1.txt -- user@example.com < /dev/null ``` 上述命令中的关键部分解释如下: - 使用 `-a` 来附加上第一个文件 `/path/to/file1.txt`; - 如果有更多附件,则继续追加更多的 `-a 文件路径` 参数即可。 注意:对于某些环境可能还需要额外配置 SMTP 服务器才能成功发出邮件[^3]。 #### 方法二:利用 uuencode 和 echo 组合完成任务 另一种解决方案涉及到了 Unix 下的传统编码程序 `uuencode` ,它可以将二进制数据转换成 ASCII 字符串形式以便于传输。这里给出一个简单的实例演示如何用这种方法同时传递两个文档作为附件给接收方: ```bash ( echo "To: recipient@example.org" echo "Subject: Test Email with Attachments" echo "MIME-Version: 1.0" echo 'Content-Type: multipart/mixed; boundary="myboundary"' echo "" echo "--myboundary" echo "Content-Type: text/plain" echo "" echo "Here are your attached files." echo "--myboundary" uuencode file1.pdf file1.pdf echo "--myboundary" uuencode file2.jpg file2.jpg echo "--myboundary--" ) | sendmail -oi recipient@example.org ``` 在这个脚本里我们手动构造了一个符合 RFC 标准的 MIME 多部件消息体结构,并且每一段都包含了各自的内容类型声明以及具体的数据表示——即由 `uuencode` 负责转化后的纯文本格式表现出来的原始文件副本[^1]。 #### 注意事项 当尝试以上任何一种方案之前,请先确认您的系统已经正确设置了相关的网络参数(例如外发邮箱服务端口开放状况)、认证机制(如必要时启用 STARTTLS 或 SSL 加密通道)以及其他必要的权限设置等问题[^3]。 问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值