multiparts email in shell script - bash

I have a problem with sending emails consisting of text/plain and text/html parts.
--AlternativeBoundaryString
Content-Type: text/plain;
Content-ID: <email.text/plain>
TEXT email
After sending the message only the HTML part is visible.
If I remove the HTML part and leave only the text/plain then the text part is sent correctly.
The attachments are sent correctly.
I would like to be able to send emails consisting of two parts: html and text with attachments.
Thanks in advance for your suggestions.
function createMail
{
local EMAIL
EMAIL=${1}
cat > ${MAIL_FILE} << EOF
From: ${MAIL_FROM}
To: ${EMAIL}
Cc: ${TO_RECIPIENTS_CC}
Bcc: ${TO_RECIPIENTS_BCC}
Subject: =?UTF-8?Q?${SUBJECT}?=
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="MixedBoundaryString"
--MixedBoundaryString
Content-Type: multipart/related; boundary="RelatedBoundaryString"
--RelatedBoundaryString
Content-Type: multipart/alternative; boundary="AlternativeBoundaryString"
--AlternativeBoundaryString
Content-Type: text/plain;
Content-ID: <email.text/plain>
**TEXT email**
--AlternativeBoundaryString
Content-Type: text/html;
Content-ID: <email.text/html>
<html>
<head>
</head>
<body>
<h1>Result</h1>
<p>HTML email</p>
<p><img border=0 width=1024 height=503 style='width:10.6666in;height:5.2416in' id=id.obrazek1 src="cid:id.obrazek1" alt="Opis: cid:id.obrazek1"></p>
</body>
</html>
--AlternativeBoundaryString--
--RelatedBoundaryString
Content-Type: image/jpeg; name=$(basename 'picture_png.png')
Content-Transfer-Encoding: uuencode
Content-ID: <id.obrazek1>
Content-Disposition: inline; filename="picture_png.png"
$(python -c 'import sys,uu; uu.encode("picture_png.png", sys.stdout)')
--RelatedBoundaryString--
--MixedBoundaryString
Content-Type: text/plain; name=$(basename 'test_log.log')
Content-Transfer-Encoding: uuencode
Content-Disposition: attachment; filename="test_log.log"
$(uuencode test_log.log test_log.log )
--MixedBoundaryString
Content-Type: text/plain; name=$(basename 'test_pdf.pdf')
Content-Transfer-Encoding: uuencode
Content-Disposition: attachment; filename="test_pdf.pdf"
$(python -c 'import sys,uu; uu.encode("test_pdf.pdf", sys.stdout)')
--MixedBoundaryString
Content-Type: application/vnd.ms-excel; name=$(basename 'test_excel.xlsx')
Content-Transfer-Encoding: uuencode
Content-Disposition: attachment; filename="test_excel.xlsx"
$(python -c 'import sys,uu; uu.encode("test_excel.xlsx", sys.stdout)')
--MixedBoundaryString--
EOF
}
function sendMail
{
cat ${MAIL_FILE} | /usr/sbin/sendmail -t
}

Related

In Jmeter, mandatory validation error is showing in response even though the key has correct values in the request

Request:
POST data:
--RSTXvNAvF6qiZc6NOcKWqw9HHxFBxbOOrs
Content-Disposition: form-data; name="ProjectUID"
Content-Type: form-data; charset=UTF-8
Content-Transfer-Encoding: 8bit
127
--RSTXvNAvF6qiZc6NOcKWqw9HHxFBxbOOrs
Content-Disposition: form-data; name="Customer"
Content-Type: form-data; charset=UTF-8
Content-Transfer-Encoding: 8bit
23
--RSTXvNAvF6qiZc6NOcKWqw9HHxFBxbOOrs
Content-Disposition: form-data; name="LoansInsertedVia"
Content-Type: form-data; charset=UTF-8
Content-Transfer-Encoding: 8bit
Single
--RSTXvNAvF6qiZc6NOcKWqw9HHxFBxbOOrs
Content-Disposition: form-data; name="LoanNumber"
Content-Type: form-data; charset=UTF-8
Content-Transfer-Encoding: 8bit
loan0106_3
--RSTXvNAvF6qiZc6NOcKWqw9HHxFBxbOOrs
Content-Disposition: form-data; name="ProductUID"
Content-Type: form-data; charset=UTF-8
Content-Transfer-Encoding: 8bit
8
Response:
{"validation_error":1,"message":" Please complete all mandatory fields","Customer":"This Field is required","LoanNumber":"This Field is required","Single-ProductUID":"This Field is required","Single-ProjectUID":"This Field is required"}
Try unticking Use multipart/form-data box in the HTTP Request sampler, it might be the case your server expects "normal" form-data parameters, not the multipart ones.
Also if you're capable of successfully executing your request with the browser you can just record it using JMeter's HTTP(S) Test Script Recorder or JMeter Chrome Extension

Http POST multipart x-mmixed-replace

I am sending this request to the server:
POST /stream.php?K=pparam HTTP/1.0
Content-Type: multipart/form-data;boundary=MY_BOUNDARY_STRING_NOONE_HAS
Host: someweb.com
Content-Length:22182
--MY_BOUNDARY_STRING_NOONE_HAS
Content-Disposition: form-data; name="XXXXX16" filename="YYYYY17"
Content-Type: application/octet-stream
[IMAGE 22182 BUFFER]
--MY_BOUNDARY_STRING_NOONE_HAS
Content-Disposition: form-data; name="XXXXX12" filename="YYYYY13"
Content-Type: application/octet-stream
[IMAGE 22163 BUFFER]
--MY_BOUNDARY_STRING_NOONE_HAS
But at the server:
The php $_FILES is empty
Array
(
)
<?php
print_r($_FILES);
?>
The whole request should have the Accept: header
Now I am able to upload a camera stream
POST /stream.php?K=127.0.0.1_camera1 HTTP/1.1
Host: localhost
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
Liveimage: camera1
Content-Type: multipart/form-data; boundary=212367691630846570233068106084
Content-Length:20209
Connection: keep-alive
--212367691630846570233068106084
Content-Disposition: form-data; name="file10"; filename="S11"
Content-Type: application/octet-stream
[IMAGE 20209]
boundary=--212367691630846570233068106084
Content-Disposition: form-data; name="file12"; filename="S13"
Content-Type: application/octet-stream
[IMAGE 20209]
boundary=--212367691630846570233068106084
RRRRRR POST
Content-Disposition: form-data; name="file14"; filename="S15"
Content-Type: application/octet-stream
[IMAGE 20209]
boundary=--212367691630846570233068106084

How RESTTemplate Supports for Multipart/mixed in consumption

The REST service provider returns a media type of multipart/mixed and it has several boundaries such as application/xml and octstream. Which HttpMessageConverter could be used to satisfy this scenario.
POST: someUrl
Content-Type: multipart/mixed
--edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
Content-Disposition: form-data; name="meta-data"
Content-Type: application/json; charset=UTF-8
Content-Transfer-Encoding: 8bit
{
"name": "value"
}
--edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
Content-Disposition: form-data; name="file-data"; filename="file.properties"
Content-Type: text/xml
Content-Transfer-Encoding: 8bit
... File Data ...
Thanks

Why does my multi part post request fail when sending from Marklogic instead of a browser form?

I am trying to send a multi part post request from my local Marklogic server using this xquery script:
xquery version "1.0-ml";
let $uri := "http://uri_to_service"
let $data :=
'------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="projectId"
1DBC9DEE-6B5D-0001-D76C-13F516502B00
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="language"
de
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Das ist ein Test.
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundaryq3PKI0zfbTv08rDu--
'
let $options :=
<options xmlns="xdmp:http">
<authentication method="basic">
<username>abc</username>
<password>123</password>
</authentication>
<data>{$data}</data>
<headers>
<Connection>keep-alive</Connection>
<Cache-Control>max-age=0</Cache-Control>
<Accept>text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8</Accept>
<Origin>null</Origin>
<User-Agent>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36</User-Agent>
<Content-Type>multipart/form-data; boundary=----WebKitFormBoundaryq3PKI0zfbTv08rDu</Content-Type>
<Accept-Encoding>gzip,deflate,sdch</Accept-Encoding>
<Accept-Language>en-US,en;q=0.8,de;q=0.6</Accept-Language>
</headers>
</options>
return
xdmp:http-post($uri, $options)
In Wireshark I see the following outgoing request:
POST /api/extract HTTP/1.1
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: null
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryq3PKI0zfbTv08rDu
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,de;q=0.6
From: admin#marcos-macbook-pro.local
Host: some_service_uri
Content-Length: 509
Authorization: Basic some_basic_code
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="projectId"
1DBC9DEE-6B5D-0001-D76C-13F516502B00
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="language"
de
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Das ist ein Test.
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundaryq3PKI0zfbTv08rDu--
HTTP/1.1 400 Bad Request
Server: nginx/1.6.1
Date: Fri, 22 Aug 2014 14:18:47 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 1246
Connection: keep-alive
Set-Cookie: JSESSIONID=B677A4E57DB4E8E8076EB4C9DD3E0AF4; Path=/extractor
<html><head><title>Apache Tomcat/6.0.36 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 400 - Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: Stream ended unexpectedly</h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u>Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: Stream ended unexpectedly</u></p><p><b>description</b> <u>The request sent by the client was syntactically incorrect.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/6.0.36</h3></body></html>
As you can see, the request is failing for some reason.
Then I tried the same request from Chrome Browser with a small html form.
<html>
<head>
<title>Test Form</title>
</head>
<body>
<form action="service_uri" method="post" enctype="multipart/form-data">
<input type="text" name="projectId" value="1DBC9DEE-6B5D-0001-D76C-13F516502B00">
<input type="text" name="language" value="de">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>
The browser asks me for username/password and everything goes fine.
In Wireshark I can see:
POST /api/extract HTTP/1.1
Host: some_service_uri
Connection: keep-alive
Content-Length: 527
Cache-Control: max-age=0
Authorization: Basic some_basic_code
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: null
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryq3PKI0zfbTv08rDu
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,de;q=0.6
Cookie: JSESSIONID=469591D4A83F24BB77547B6C235F25B7
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="projectId"
1DBC9DEE-6B5D-0001-D76C-13F516502B00
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="language"
de
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Das ist ein Test.
------WebKitFormBoundaryq3PKI0zfbTv08rDu
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundaryq3PKI0zfbTv08rDu--
HTTP/1.1 200 OK
Server: nginx/1.6.1
Date: Fri, 22 Aug 2014 13:38:04 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
80
{"text":"Das ist ein Test.\n","metadata":{},"document":{"freeTerms":[{"textValue":"test","score":100,"frequencyInDocument":1}]}}
0
Why is my request failing when send from Marklogic? Based on the outgoing request (captured by Wireshark) I can find no difference, except Content-Length.
What is happening? Or what could be the reason? Could encoding change the Content-Length?
The server error was Stream ended unexpectedly so content-length seems like a good candidate: 527 vs 509.
Rather than writing your own multipart code, have you tried this library? https://github.com/ableasdale/consultant-tools/blob/da92815e1322fe8e479ba2ba3741857670498c2a/src/main/resources/modules/example/lib-multipart-post.xqy
One key difference is that it uses https://docs.marklogic.com/xdmp:multipart-encode

How To Test a MIME Multipart URL?

I'm trying to test a MIME Multipart URL. Is it sufficient enough to do a simple html form and submit a file to it like this?
<html>
<body>
<FORM action="<MIME Multipart URL>" enctype="multipart/form-data" method="POST">
<p>file <INPUT type="file" name="file"><BR>
<INPUT type="submit" value="Send"> <INPUT type="reset">
</FORM>
</body>
</html>
When I do this I get a file back called multipart. The contents of the file contains an error though so I was wondering if I'm not doing something right with the submission mechanism or if I'm just not submitting the right values in my file.
FILE CONTENTS
POST /core/eligibility HTTP/1.1
Host: server_host:server_port
Content-Length: 1354
Content-Type: multipart/form-data; boundary=XbCY
--XbCY
Content-Disposition: form-data; name=“PayloadType“
blahblah
--XbCY
Content-Disposition: form-data; name=“ProcessingMode"
blahblah
--XbCY
Content-Disposition: form-data; name=“PayloadID"
--XbCY
Content-Disposition: form-data; name=“TimeStamp"
2007-08-30T10:20:34Z
--XbCY
Content-Disposition: form-data; name=“UserName"
blahblah
--XbCY
Content-Disposition: form-data; name=“Password"
blahblah
--XbCY
Content-Disposition: form-data; name=“SenderID"
blahblah
--XbCY Content-Disposition: form-data; name=“ReceiverID"
blahblah
--XbCY
Content-Disposition: form-data; name=“CORERuleVersion"
blahblah
--XbCY
Content-Disposition: form-data; name=“Payload"
payload blahblah
--XbCY--
Build list of content items. Submission will build form-data entries as in file.
<FORM action="<MIME Multipart URL>" enctype="multipart/form-data" method="POST">
PayloadID<INPUT type="text" name="PayloadID"><br />
: (other items) :
<INPUT type="submit" value="Send"> <INPUT type="reset">
</FORM>

Resources