2017-06-23 45 views
0

我的目标是用HTML正文发送使用curl一封电子邮件,其中嵌入的图像,例如:卷曲:发送HTML电子邮件与嵌入式图像和附件

email template image

我发送电子邮件这样的:

curl "smtp://smtp.gmail.com:587" -v \ 
    --mail-from "[email protected]" \ 
    --mail-rcpt "[email protected]" \ 
    --ssl -u [email protected]:secretpassword \ 
    -T "message.txt" -k --anyauth 

message.txt样子:

From: Some Name <[email protected]> 
To: Some Name <[email protected]> 
Subject: example of mail 
Reply-To: Some Name <[email protected]> 
Cc: 
MIME-Version: 1.0 
Content-Type: multipart/mixed; boundary="MULTIPART-MIXED-BOUNDARY" 

--MULTIPART-MIXED-BOUNDARY 
Content-Type: multipart/alternative; boundary="MULTIPART-ALTERNATIVE-BOUNDARY" 

--MULTIPART-ALTERNATIVE-BOUNDARY 
Content-Type: text/html; charset=utf-8 
Content-Transfer-Encoding: base64 
Content-Disposition: inline 

PGh0bWw+Cjxib2R5PgogICAgPGRpdj4KICAgICAgICA8cD5IZWxsbywgPC9wPgogICAgICAgIDxw 
PlBsZWFzZSBzZWUgdGhlIGxvZyBmaWxlIGF0dGFjaGVkPC9wPgogICAgICAgIDxwPkFkbWluIFRl 
YW08L3A+CiAgICAgICAgPGltZyBzcmM9ImFkbWluLnBuZyIgd2lkdGg9IjE1MCIgaGVpZ2h0PSI1 
MCI+CiAgICA8L2Rpdj4KPC9ib2R5Pgo8L2h0bWw+Cg== 
--MULTIPART-ALTERNATIVE-BOUNDARY-- 
--MULTIPART-MIXED-BOUNDARY 

的HTML解码是:

<html> 
<body> 
    <div> 
     <p>Hello, </p> 
     <p>Please see the log file attached</p> 
     <p>Admin Team</p> 
     <img src="admin.png" width="150" height="50"> 
    </div> 
</body> 
</html> 

如何能够将在这个网站admin.png和附加其他文件log.txt 使用curlbash这封电子邮件吗?

回答

1

我想出了解决的办法是进行BASE64编码所有附件(图像和文本文件),并直接包括到上传的文件中的multipart/mixed体如:

--MULTIPART-MIXED-BOUNDARY 
Content-Type: image/png 
Content-Transfer-Encoding: base64 
Content-Disposition: inline 
Content-Id: <admin.png> 
iVBORw0KGgoAAAANSUhEUgAAAIAAAACgCAIAAABL8POqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA 
B3RJTUUH4AQNDwEVouBdqAAAG2xJREFUeNrtfX9oHFe25jdDBU5BG25BG7pABhXEkDJjSIsYIs1m 
WbfJA8ubhcjjgdiTQNJOYCInj0RKYGIl8CbyPF4iZSCxEkgsB5LIgWQlL2Pcfow3bdgw0mMzox6e 
.... 


--MULTIPART-MIXED-BOUNDARY 
Content-Type: text/plain 
Content-Transfer-Encoding: base64 
Content-Disposition: inline; filename=log.txt 
c29tZSBsb2cgaW4gYSB0eHQgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1haWwK 


--MULTIPART-MIXED-BOUNDARY-- 

Content-Id头是用于识别可以与HTML中引用的资源:cid:,如:

<img src="cid:admin.png" width="150" height="50"> 

下面是一个完整bash例如发送HTML电子邮件和admin.png嵌入图像和附加到它的log.txt

#!/bin/bash 

rtmp_url="smtp://smtp.gmail.com:587" 
rtmp_from="[email protected]" 
rtmp_to="[email protected]" 
rtmp_credentials="[email protected]:secretpassword" 

file_upload="data.txt" 

# html message to send 
echo "<html> 
<body> 
    <div> 
     <p>Hello, </p> 
     <p>Please see the log file attached</p> 
     <p>Admin Team</p> 
     <img src=\"cid:admin.png\" width=\"150\" height=\"50\"> 
    </div> 
</body> 
</html>" > message.html 

# log.txt file to attached to the mail 
echo "some log in a txt file to attach to the mail" > log.txt 

mail_from="Some Name <$rtmp_from>" 
mail_to="Some Name <$rtmp_to>" 
mail_subject="example of mail" 
mail_reply_to="Some Name <$rtmp_from>" 
mail_cc="" 

# add an image to data.txt : 
# $1 : type (ex : image/png) 
# $2 : image content id filename (match the cid:filename.png in html document) 
# $3 : image content base64 encoded 
# $4 : filename for the attached file if content id filename empty 
function add_file { 
    echo "--MULTIPART-MIXED-BOUNDARY 
Content-Type: $1 
Content-Transfer-Encoding: base64" >> "$file_upload" 

    if [ ! -z "$2" ]; then 
     echo "Content-Disposition: inline 
Content-Id: <$2>" >> "$file_upload" 
    else 
     echo "Content-Disposition: attachment; filename=$4" >> "$file_upload" 
    fi 
    echo "$3 

" >> "$file_upload" 
} 

message_base64=$(cat message.html | base64) 

echo "From: $mail_from 
To: $mail_to 
Subject: $mail_subject 
Reply-To: $mail_reply_to 
Cc: $mail_cc 
MIME-Version: 1.0 
Content-Type: multipart/mixed; boundary=\"MULTIPART-MIXED-BOUNDARY\" 

--MULTIPART-MIXED-BOUNDARY 
Content-Type: multipart/alternative; boundary=\"MULTIPART-ALTERNATIVE-BOUNDARY\" 

--MULTIPART-ALTERNATIVE-BOUNDARY 
Content-Type: text/html; charset=utf-8 
Content-Transfer-Encoding: base64 
Content-Disposition: inline 

$message_base64 
--MULTIPART-ALTERNATIVE-BOUNDARY--" > "$file_upload" 

# add an image with corresponding content-id (here admin.png) 
image_base64=$(curl -s "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_116x41dp.png" | base64) 
add_file "image/png" "admin.png" "$image_base64" 

# add the log file 
log_file=$(cat log.txt | base64) 
add_file "text/plain" "" "$log_file" "log.txt" 

# add another image 
#image_base64=$(curl -s "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_116x41dp.png" | base64) 
#add_file "image/png" "something.png" "$image_base64" 

# end of uploaded file 
echo "--MULTIPART-MIXED-BOUNDARY--" >> "$file_upload" 

# send email 
echo "sending ...." 
curl -s "$rtmp_url" \ 
    --mail-from "$rtmp_from" \ 
    --mail-rcpt "$rtmp_to" \ 
    --ssl -u "$rtmp_credentials" \ 
    -T "$file_upload" -k --anyauth 
res=$? 
if test "$res" != "0"; then 
    echo "sending failed with: $res" 
else 
    echo "OK" 
fi 
相关问题