メッセージ本文に、表形式(スペースを含む列データ)のテキストファイルを送信します。

メッセージ本文に、表形式(スペースを含む列データ)のテキストファイルを送信します。

誰でもシェルスクリプトを使用して、メール本文にhtmlテーブル形式で次のデータを送信するのに役立ちますか?サンプルファイル

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

以下のスクリプトを作成しましたが、2番目の列の値にスペースが含まれている場合は中断されます。

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
  • 便宜上、コードにテンプレートを文字列として含めました。別々のテンプレートファイルを使用することを検討する必要があります。
  • もちろん、以下から直接Eメールを送信することもできますpython。 :-)

あなたは必要かもしれませんインストールするjinja2:

pip install jinja2

おすすめ記事