我有一个独特的挑战:我有一个CSV文件,我需要从中提取文本,然后使用该文本发送电子邮件。这是一次性问题,电子邮件需要在同一天发送。谷歌有option类似的东西,但我需要发送超过100封电子邮件的每日配额。使用SMTP而不是脚本使用不同的配额,因此如果我走这条路线,我将能够在一天内发送我需要的所有电子邮件。
我已经完成了一些挖掘,发送电子邮件的基本代码似乎是这样的:
$ echo "This will go into the body of the mail." | mail -s "Subject" recipient@email.com
或
$ mail -s "Subject" recipient@email.com < /file/location/address.csv
到目前为止很棒,但我需要它从CSV文件和正文文本中提取主题行,当它到达逗号分隔符时停止,然后标记或删除源CSV文件中的文本,以便它知道它已发送该电子邮件但不重复。最后,它需要移动到下一行并重复该过程,直到它完成整个CSV文件。
理想情况下,我应该能够在OS X中从终端执行它并观察进度。 (如果可能的话,我希望包含&#39; sleep&#39;命令在它到达每个分隔符后引入小暂停,以使shell输出可理解而不是无休止的文本流。)
我有大部分代码的基本代码段,但我不确定如何从CSV文件中提取信息并将其传输到我已有的内容中。如果有人能指出我正确的方向,我想我应该能够把它拼凑在一起。
编辑:如果在bash之外使用其他脚本语言更容易,我可以拼凑一切,但提取文本并将其输入另一个命令/输出。大多数语言都有简单的命令和库,所以我应该能够谷歌并蚕食其余的代码。它将CSV文件中的内容发送到我不知道该怎么做的电子邮件中,尽管Google重复搜索。 (另外,如果您认为我使用的是错误的搜索字词,请随时提出更好的搜索字词。)
答案 0 :(得分:1)
你可以这样做:
#!/bin/bash
#get line count
linecount=$(cat mycsv.csv | wc -l)
#set counting variable
counter=1
#loop through file
while read line; do
#split each line into an array by comma
IFS=, read -a arr <<< "$line";
#set array values to variables
subject="${arr[0]}";
intro="${arr[1]}";
details="${arr[2]}";
closing="${arr[3]}";
#create body
body=$(printf "Intro: %s \n Details: %s \n Closing: %s" "$intro" "$details" "$closing")
#echo progress
echo "Sending email $counter of $linecount: Subject: $subject, Body: $body"
#send email
echo "$body" | mail -s "$subject" recipient@email.com
#advance counter
counter=$(( $counter +1 ))
#sleep for a second
sleep 1
done < mycsv.csv
上面会输出:
Sending email 1 of 2: Subject: subject, Body: Intro: intro
Details: details
Closing: closing
您也可以通过这种方式格式化电子邮件的正文。请注意,如果您执行此操作,关闭电子邮件正文的第二个EOF
必须一直到文件的左侧,行的开头和EOF
之间没有空格。
#send email
mail -s "$subject" recipient@email.com <<EOF
"$intro"
"$details"
"$closing"
EOF
mycsv.csv的样子:
subject,intro,details,closing
subject1,intro1,details1,closing1
我无法访问OSX,因此使用GNU bash版本4.3.42测试:
bash --version
GNU bash, version 4.3.42(1)-release (x86_64-redhat-linux-gnu)