我需要一些建议/推动正确的方向。
我编写了一些小脚本,它们接收传入的HTML电子邮件,将其转换为PostScript,然后通过CUPS将其发送到指定的打印机。打印机基于电子邮件的收件人。
我正在使用以下内容来实现此目的;
流程
问题
我的问题是:如何从电子邮件中获取这些图像,以便它们能够在PostScript文件中成功打印出来?
如果PostScript不合适,我很乐意转换为PDF,但即使转换为PDF也会让我没有图像,因为我无法理解它们。
.procmailrc文件
SHELL=/bin/bash
# Extract the subject and normalise
SUBJECT=`formail -x"Subject: "\
| /usr/bin/tr '[:space:][:cntrl:][:punct:]' '_' | expand | sed -e 's/^[_]*//' -e 's/[_]*$//'`
YMD=`date +%Y%m%d`
MAKE_SURE_DIRS_EXIST=`
mkdir -p received_mail/backup
if [ ! -z ${SUBJECT} ]
then
mkdir -p received_mail/${YMD}/${SUBJECT}
else
mkdir -p received_mail/${YMD}/no_subject
fi
`
# Backup all received mail into the backup directory appending to a file named by date
:0c
received_mail/backup/${YMD}.m
# If no subject, just store the mail
:0c
* SUBJECT ?? ^^^^
received_mail/${YMD}/no_subject/.
# Else there is a subject, generate a unique filemane, place the received email
# in that file and then execute process_mail passing the filename and subject as parameters
:0Eb
| f=`uuidgen`; export f; cat > received_mail/${YMD}/${SUBJECT}/${f}; $HOME/bin/process_mail received_mail/${YMD}/${SUBJECT}/${f} "${SUBJECT}"
# and don't deliver to standard mail, don't want to clutter up the inbox.
:0
/dev/null
process_mail
#/bin/bash
# Test Printer
printer=$(whoami)
file=$1
subject=$2
function process_rrs {
typeset file
file=$1
cat $file \
| $HOME/bin/get_html_from_message \
| html2ps \
| lp -d ${printer} -o media=a4 2>&1
}
case "$subject" in
*)
process_rrs $file
;;
esac
get_html_from_message
cat | awk '
BEGIN {
typeout=0
}
{
if($0 ~ /<html/)
typeout=1
if($0 ~ /^------=/)
typeout=0
if(typeout)
print $0
}'
编辑:格式化
答案 0 :(得分:1)
我已经想出如何实现这一目标。详情如下。所有这些都在两个负载均衡的CentOS 6机箱上运行。
<强>应用强>
工作原理
使用上面的过程,我可以将它放到一个脚本,.procmailrc。这是我在.procmailrc文件中编写的内容。
SHELL=/bin/bash
# Designate the printer. Printer names match usernames so you don't have to manually change 60+ files.
printer=`whoami`
# Generate a unique ID
f=`uuidgen`
# Convert email, including headers and body into a HTML file and save off the images using MHONARC https://www.mhonarc.org/
# Open file and search <!--X-Body-of-Message--> string using SED and collect all text to EOF.
# Pipe the result into SED again to remove unwanted HTML tags added by MHONARC
# Pipe result into HTML2PS to convert to PostScript
# Pipe PostScript file to the designated printer
:0E
| mhonarc -single > ${f}.html; sed -n '/^<!--X-Body-of-Message-->$/ { s///; :a; n; p; ba; }' ${f}.html | sed -e '/<hr>/d' | html2ps | lp -d ${printer} -o media=a4 2>&1
# Finally, delete the email
:0
/dev/null
我不太了解“sed”,并且可能有更简单的方法来实现这一目标。我会在某个时候进一步调查。
希望这有助于某人:)
答案 1 :(得分:0)
问题可能是对HTML在电子邮件中的表示方式的不完全理解。通常会有一个MIME多部分,其中包含一个HTML部分和多个图像。 HTML使用图像链接中的cid:
寻址方案来引用这些兄弟部分。但是如果只提取HTML,它就不再存在于有兄弟姐妹的环境中。 (即使你将所有部分都提取到文件中,cid:
通常也不会映射到本地文件。也许你可以对HTML进行后期处理以解决问题;但我想也许你的方法应该重新思考。你有没有考虑使用具有原生HTML支持的邮件客户端来呈现这些消息吗?)
从xmlstarlet
个cid:
链接的src
属性中删除img
前缀的简单var SCRIPT_ID = "1eC5VsM2vkJXa9slM40MTKTlfARGAGyK1myMCU3AB_-Ox_jGxQaoPM8P2";
// get a callback url to render in popup
function getAuthURL() {
var authorizeURL = getCallbackURL('testCallback');
return authorizeURL;
}
// generate a user callback url
function getCallbackURL(callback) {
var state = ScriptApp.newStateToken().withTimeout(3600).withMethod(callback).createToken();
return 'https://script.google.com/macros/d/'+SCRIPT_ID+'/usercallback?state='+state;
}
// generate login
function doGet(e){
return HtmlService.createTemplate("<div><p><a href='<?=getAuthURL()?>' id='start-auth'><?=getAuthURL()?></a></p></div>")
.evaluate());
}
enter code here
// dummy callback function
function testCallback(e){
return HtmlService.createHtmlOutput('<b>Success. You can close this window. !</b>')
}
脚本或类似内容应该不会很难,但可能还有其他一些内容发现如果你尝试这条道路就需要做。