在邮件正文中以表格格式发送文本文件(带空格的列数据)

在邮件正文中以表格格式发送文本文件(带空格的列数据)

任何人都可以帮助我使用 shell 脚本在邮件正文中以 html 表格格式发送以下数据。样本文件

abcd "this is to test" 123
csdf "another test" 10000

我创建了下面的脚本,但当第二列值中有空格时它会中断

echo "send an email"
awk 'BEGIN {
 print "<html><body><table border=1 cellspacing=0 cellpadding=3>"
 print "<tr>"
 print "<td>date</td>";
 print "<td>name</td>";
 print "<td>total</td>";
 print "</tr>"
} {
 print "<tr>"
 print "<td>"$1"</td>";
 print "<td>"$2"</td>";
 print "<td>"$3"</td>";
 print "</tr>"
} END {
 print "</table></body></html>"
} ' sample.txt >> sample.html
(
echo "To: [email protected]"
echo "MIME-Version: 1.0"
echo "Subject:$v_subject"
echo "Content-Type: text/html"
cat sample.html
) | sendmail -t

答案1

而是awk考虑使用适当的工具:

  • csv使用适当的 CSV 解析器读取
  • html使用模板引擎将模板与代码分开。

我会选择python同时提供两者的选项,但这是一个选择问题。

这是一个工作示例:

-->script.py

#!/usr/bin/env python

import csv
from jinja2 import Template
import sys

templ = '''<html>
<body>
<table border=1 cellspacing=0 cellpadding=3>
  <tr>
    <td>date</td>
    <td>name</td>
    <td>total</td>
  </tr>
  {% for row in rows %}<tr>
    {% for col in row %}<td>{{col}}</td>{% endfor %}
  </tr>{% endfor %}
</table>
</body></html>
'''

with open(sys.argv[1]) as csvfile:
    rows = list(csv.reader(csvfile, delimiter=' '))

tm = Template(templ)
print(tm.render(rows=rows))
  • 跑步python script.py sample.csv > sample.html
  • 为了方便起见,我将模板作为字符串包含在代码中,您应该考虑使用单独的模板文件
  • 您当然也可以直接通过以下方式发送电子邮件python:-)

您可能需要安装jinja2:

pip install jinja2

相关内容