2016-05-31 50 views
1

我需要一點建議/推動正確的方向。使用Procmail將帶有內嵌圖像的HTML電子郵件保存爲PS或PDF

我已經編寫了一些小型腳本,它接收傳入的HTML電子郵件,將其轉換爲PostScript,然後通過CUPS將其發送到指定的打印機。打印機基於電子郵件的收件人。

我正在使用以下來實現此目的;

  1. 進出口
  2. 的Procmail
  3. html2ps的
  4. 兩個自定義腳本(貼在下面)

  1. 的電子郵件是由進出口銀行收到並傳遞到流Procmail
  2. .procmailrc文件調用自定義腳本「process_mail」,通過主題和內容作爲參數
  3. 「process_mail」拉內容到一個函數,並呼籲「get_html_from_message」(我沒有做任何與主題還)
  4. 「get_html_from_message」轉儲除HTML以外的所有內容HTML然後轉換爲PostScript
  5. PostScript文件被髮送到指定的打印機。

問題

  1. 在階段html2ps的產生一個錯誤併發送NDR回發送器,指出有一個錯誤打開所述圖像。 打開cid時出錯:logo.jpg
  2. PostScript文件已成功打印,但顯然不包含電子郵件中的圖像。

我的問題是:如何從電子郵件中獲取這些圖像,以便它們能夠在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

你有一個[沒用使用'cat'(http://www.iki.fi/era/unix/award.html) – tripleee

+0

'出口F'出現是多餘的。導出使變量對子流程可見;但是這裏沒有任何子進程使用這個變量。 – tripleee

+0

謝謝。我會在早上看看這個。總是學習:) – Soddengecko

回答

0

這個問題可能是對電子郵件中HTML如何表示的不完全理解。通常會有一個帶有一個HTML部分和多個圖像的MIME多部分。 HTML在圖像鏈接中使用cid:尋址方案來引用這些同級部分。但是,如果你只提取HTML,它就不再存在於有兄弟關係的上下文中。 (即使你將所有部分提取到文件中,cid:通常不會映射到本地文件,也許你可以後處理HTML來解決這個問題;但是我想也許你應該重新考慮你的方法。客戶端渲染這些消息原生支持HTML?)

一個簡單xmlstarlet腳本或類似剝去任何img鏈接的src屬性cid:前綴應該不難,但也有可能是你發現你需要更多的東西如果你嘗試這個路徑,那麼做。

+0

嗨。感謝您的信息。該系統位於無頭CentOS盒子上。電子郵件來自發送入場券的雲服務,我們每天會處理數百個,可能數千個,因此手動打印將無法工作。最初圖像不是必需的,這就是爲什麼它是這樣寫的,但唉,現在他們想要圖像。我不必使用這些腳本,我總是可以寫些別的東西。你知道這可以做什麼嗎?感謝您對MIME的深入瞭解,我缺乏這方面的知識。 – Soddengecko

+0

我隱約想着你也許可以運行Thunderbird無頭像;但我自己並沒有這方面的經驗,腳本可能有些挑戰。 – tripleee

+0

有趣。我會將此視爲一個選項 – Soddengecko

1

我已經想出瞭如何實現這一點。細節如下。所有這些都在兩個負載均衡的CentOS 6盒上運行。

應用

  1. 進出口
  2. CUPS
  3. Mhonarc(不回購的。RPM和網站在這裏https://www.mhonarc.org/
  4. 的Procmail
  5. html2ps的

它是如何工作的

  1. 電子郵件發送到兩個盒子上存在的用戶帳戶。
  2. 發送郵件到Procmail的Exim管道
  3. Procmail在用戶主目錄中查找.procmailrc,並執行 操作。
  4. Mhonarc將電子郵件轉換爲HTML文件,保存圖像和附件。
  5. 使用「sed」,打開HTML文件並查找電子郵件的開頭()並收集文件末尾的所有文本
  6. 再次移動到「sed」以刪除多餘的HTML標籤(hr標籤)通過Mhonarc
  7. 管到html2ps的轉換成PostScript
  8. 管到指定的打印機(打印機被命名爲相同的用戶帳戶)

使用上面的過程中,我能降下來只是一個腳本,.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」,可能有更簡單的方法來實現這一點。有些時候我會進一步調查。

希望這可以幫助別人:)

+0

感謝您的分享! Monharc將保存附加的圖像,但如果鏈接(即從服務器加載)則不保存。你有關於如何讓你的工作流程在這種情況下工作的想法? Monharc不會轉換包含正確鏈接的.eml圖像。 –

相關問題