mailx
使用(或其变体)时,我有哪些选项可以将收件人添加到电子邮件中?我所知道的有:
- 从内存中逐个字符手动输入电子邮件地址
.mailrc
输入我之前存储的别名
是否还有其他选项,例如根据我之前发送电子邮件的电子邮件地址创建的地址簿,可以使用光标键导航或通过自动完成缩小范围?
答案1
Forthrin,我找不到解决这个问题的优雅方法。但我做了一些思考,一个可能的解决方法概述如下:
创建一个名为“recipients”的目录,创建以您想要发送到的电子邮件地址命名的虚拟文件,在此目录中使用自动完成功能。
mkdir recipients
cd recipients
touch [email protected]
mail -s "stuff" '[email protected]' < logfile.txt
此处的单引号有助于避免转义出现的“\”。
我知道这并不漂亮,但是您可以通过从电子邮件地址的文本文件中提取并以这种方式拼凑出自动完成功能来完成此任务。不过,我不确定该怎么做。比我聪明的人可以插话。
此外,您可以搜索以前的历史记录和邮件日志,查看已发送的邮件并获取这些地址,然后将它们放入收件人文件夹中。现在您有了一个收件人文件夹,可以使用选项卡完成功能(满足您的自动完成请求)。
这不是最好的解决方案,但我在 mailx 中没有看到任何地址簿功能。
答案2
一种解决方案是使用包装器来保存地址并使用 bash 补全来检索它们:
address_book=${HOME}/.address
mailx() {
#loop through all args
for i; do
# does this look like an email address
if grep -xqE '[[:alnum:]_.+\-]+@[[:alnum:]\-]+.[[:alnum:].\-]+' <<< "${i}" && ! grep -xqF "${i}" "${address_book}"; then
echo "${i}" >> "${address_book}"
fi
done
/usr/bin/mailx "${@}"
}
_mailx_completion() {
if [[ ! -f ${address_book} ]] ; then
return
fi
# Only add each email once
emails=($(grep -xvf<(echo "${COMP_WORDS[*]}"|tr ' ' '\n') "${address_book}"))
if [[ ${#emails[@]} -eq 0 ]] ; then
return
fi
# list emails
COMPREPLY=( $(compgen -W "${emails[*]}" "${COMP_WORDS[${COMP_CWORD}]}") )
}
complete -F _mailx_completion mailx
添加到您的“.bashrc”
解释:
我们使用 bash 函数来拦截对mailx
.此函数搜索命令行参数以查找电子邮件地址。找到后,它会检查我们的“地址簿”,看看它是否已经存在 - 如果不存在,它会将其附加到列表中。最后我们mailx
用原始参数进行调用。
第二部分是 bash 自动完成函数 - 每当您按下该Tab键时就会调用该函数。~/.address
每当您键入后按 Tab 键时,Bash 都会读取电子邮件地址mailx
。额外的逻辑是在添加到命令行后从建议列表中删除电子邮件地址。
要启用所有这些,请将以上内容添加到您的.bashrc
文件中。