The safest way to add a header and a footer to an e-mail? - mime-mail

I am busy writing the last bit of an SMTP relay engine. Basically, people send mail to this SMTP address, it gets piped to files, analyzed, and then headers and footers are added to the body. My problem is, I'm not sure if my way of altering the mail will work for all cases. Basically, if I have this:
Return-path: <XXXX#YYYY>
Envelope-to: system-filter
Delivery-date: Thu, 25 Sep 2014 12:43:53 +0200
Received: from localhost ([127.0.0.1]:XXXX helo=XXXX.XXXX.com)
by XXXX.XXXX.com with XXXX(XXXX-XXXX-XXXX-XXXX:XXXX)
(Exim XXXX)
(envelope-from <XXXX#XXXX.XXXX>)
id XXXX-XXXX-67
for XXXX.XXXX#XXXX.com; Thu, 25 Sep 2014 12:43:52 +0200
Received: from XXXX.XXXX.XXXX.XXXX ([197.87.204.210]) by XXXX.XXXX.com
(Horde Framework) with HTTP; Thu, 25 Sep 2014 10:43:50 +0000
Date: Thu, 25 Sep 2014 10:43:50 +0000
Message-ID: <XXXX.Horde.XXXX#XXXX.XXXX.com>
From: XXXX#XXXX.XXXX
To: XXXX.XXXX#XXXX.com
Subject: This is the subject
User-Agent: Internet Messaging Program (IMP) H5 (XXXX)
Content-Type: text/plain; charset=UTF-8; format=flowed; DelSp=Yes
MIME-Version: 1.0
Content-Disposition: inline
X-OutGoing-Spam-Status: No, score=-2.9
And this is the message.
The idea was to either:
1. Just find the first blank line and put the header there, and then just append the footer to the end.
2. Use PHP Mime Mail Parser to alter the body
The problem with 1 is that I think there might be different formats coming in that don't follow the normal layout. The problem with 2 is, I'm limited to whatever the mail parser can parse.
So, what is the safest way to relay e-mails as I've desribed?

Just prepending or appending something to a message body will not work. It will not work because the message can by multipart (e.g. with attachments) or encoded (e.g. base64). PHP Mime Mail Parser seems to be able to handle these cases, but it doesn't have a method to save the modified message.
I would recommend using some email parsing library which can write messages, not just read. For example, Python standard library has email package which can do what you need. However, you would have to check if the message is multipart and if so add the header and the footer to the right part (i.e. to the actual content and not to an image or attachment). You will also need to check whether the message is plain text or HTML and have your header and footer formatted appropriately.

Related

Extracting JSON from a string response using Apache JMeter

I am making an HTTP request using Apache JMeter.
The response has the following format:
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
x-powered-by: Express
access-control-allow-origin: *
access-control-allow-methods: HEAD, POST, PUT, GET, OPTIONS, DELETE
access-control-allow-headers: origin, content-type, X-Auth-Token, Tenant-ID, Authorization
content-type: application/json; charset=utf-8
content-length: 24
etag: W/"18-8MkH0L5c1ZW7PPuEY1rZ3jKFme0"
date: Thu, 08 Apr 2021 12:28:37 GMT
x-envoy-upstream-service-time: 90
server: envoy
{"id":"548b23a3.4f6a4c"}
I need a way to extract the JSON id value to a variable to make another one request.
JSON extractor needs a pure JSON format as response but in my case i need to skip all these headers from the body response.
Any ideas how could i make it with the Apache JMeter?
If you really have all this as a part of response body (however it looks like Headers to me) you should always be able to fall back to the Regular Expression Extractor which doesn't have any limitations.
Example regular expression:
"id"\s*:\s*"(.+?)"}
Demo:
Explanation:
\s - meta character for whitespace
* - any number of whitespaces
. - match any character
+ - repetition
? - don't be greedy, stop at first match
More information:
JMeter: Regular Expressions
Using RegEx (Regular Expression Extractor) with JMeter
Perl5 Regex Cheat Sheet
Another clean way is to use is JSON Extractor (Post Processor). This is pretty helpful when you will have complex json (multiple nested objects) returned.
More details here: https://octoperf.com/blog/2017/03/09/how-to-extract-data-from-json-response-using-jmeter/#jmeter-jsonpath-plugin

How to read a value of Location from response header in jmeter?

I am getting below Header Response :-
HTTP/1.1 202 Accepted
Content-Length: 0
Location: https://localhost:111/api_path/916e0a93-552f-46fd-84c4-6cecac92209a
Server: Microsoft-IIS/10.0
X-SourceFiles: =?UTF-8?B?RDpcR2l0SHViXFJNTVxFZGdlUHJvdG90eXBlXEVkZ2VQcm90b3R5cGVcYXBpXHYxXFNubXBcR2V0VjFBc3luYw==?=
X-Powered-By: ASP.NET
Date: Thu, 30 May 2019 13:13:24 GMT
how can I use regular expression to capture the below value from Location ?
916e0a93-552f-46fd-84c4-6cecac92209a
I am not saving my response in file and i want a value of Location from Response Header
I tried below way but getting NOT FOUND as it is default, if i remove default then it will show null
Replace your regular expression with
Location: https:.+api_path\/(.*?)\n
Make sure you use Apply to Main sample only.

Mail RFC embedded image using cid for text/plain

While I remember email messages could contain embedded images in HTML and plain text I noted today Outlook 2013 and Windows 10 Mail app does not display it.
Is this something the RFC standard has removed the "[cid:]" definition?
Below is the formatted mail:
(save as *.eml to display its content)
MIME-Version: 1.0
Date: Tue, 6 Feb 2018 10:12:53 +0100
From: Test User 2 <test.user2#lab.local>
Subject: TEst in plain text
Thread-Topic: TEst in plain text
To: Test User 1 <test.user1#lab.local>
Content-Type: multipart/mixed;
boundary="_60A9E784-DBBE-4378-9A84-01D36C2226AF_"
--_60A9E784-DBBE-4378-9A84-01D36C2226AF_
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"
test
[cid:BBCLOGO#23AD2D600E]
--_60A9E784-DBBE-4378-9A84-01D36C2226AF_
Content-Type: image/jpg; name="23AD2D600EF4C69FF4D5479A8BB7FE73.jpg"
Content-ID: <BBCLOGO#23AD2D600E>
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="23AD2D600EF4C69FF4D5479A8BB7FE73.jpg"
/9j/4AAQSkZJRgABAgAAZABkAAD/2wBDAAIBAQEBAQIBAQIDAgECAwMCAgICAwMDAwMDAwMFAwQE
BAQDBQUFBgYGBQUHBwgIBwcKCgoKCgwMDAwMDAwMDAz/2wBDAQICAgQDBAcFBQcKCAcICgwMDAwM
DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAyADIDAREA
AhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAAAAcFCAIEBgMJ/8QAOBAAAQIFAQYBBw0BAAAAAAAA
AQIDAAQFBhETBwgSITFRQTQ1QmFicYEUFiIyMzZDY3KEkZSh8P/EABoBAAIDAQEAAAAAAAAAAAAA
AAAFAgMEBgH/xAAnEQACAgECBQMFAAAAAAAAAAAAAQIRAwQxBRIhUYEyQcEiYZHw8f/aAAwDAQAC
EQMRAD8A+mmqvvHWUJw1V94KAk7YtG67zmzJWzJuTTqcaikBKUIz041rwlOccsmKsmWONXJ0SjBy
2Oxn93W76Lbc3cVbmWwZZovCUkm1zLyiPROAgD1kE4HOMsdfCUkkvguenaVsXeqvvG+jOGqvvBQB
qr7wUBjABtUOmKrVak6MhXAubfalgrGcF1wIzj4xGcuVN9j2Kt0Wyt23KPalIaodCZSxT2RhKU9V
HxUo+Kj4kxzGTI5u2NYxUVSN6IEhBbzVl0e3Lgkq7R2ksCqJeMwy2MI1WSjKwByBUFjOPEZ6kw74
dmc4tP2MGpgk7XuLKGJmCAAgAmNnzM1MX1R0SbZdmBOSywhHMkIeSs/wBmKs7ShK+xPH6kWyjmBq
EACd3tZeZXLUKbSgmTbVNtrc9ELcDSkpPrIQT8Ia8La+rwY9WthLw3MYQAEAEhalbNtXNT7g4StM
nMNTCm0nBWlCwpSQT0yMiIZYc8Wu6JQlTTLbsPszTCJmXUFsOJC0LT0UlQyCPeI5dqhsZx4Ak962
4kO1GmWq0DxMoXPPHIxl06SBjuAhR+MOOGY+jl4MWql1SFDDQyBAAQAEAFm9hE9P1HZVSX6ivjcS
h1htRAB0mX1stg47JSB7hHO62KWV0MsDuCOvjKXFV9rdQqFR2lVp6pK4nkTb0ujljDTKy00AB7CR
7+sdLpYpY412FeV3JnOxeVhABk006+4llhJW8shKUJBJJPIAAQN0B3dm7u9+3OUTFUbFJpZwS5OA
6xHssjCs/qKYxZdfCG3Vl8NPKX2LDUyny9Jp0vS5QYlJZtEu0D4IbSEJ/wAEIZS5nYwSpUe8eHor
9tmw2rXxWPnVbLzQqGkhp6UeyjULecKS5zGSCBggDl1hlo9Ysa5ZbGXNgcnaErcNqXHak38iuOSd
lH8kJ1kkJXjqULH0VD1pJhvjyxmri7McoOO5HxMiOfdf+zd82dXOnnXw6/lwp4j5+P6bNN4+Rxwp
NgQAEABABD3591pryD6o8++RdfxItwepb+NyGTb28lZP6Hl//ft46L87fvkWH//Z
--_60A9E784-DBBE-4378-9A84-01D36C2226AF_--
You're referring to RFC 2387, "The MIME Multipart/Related Content-type"
To refer to an attachment by the value of its Content-ID (CID) MIME header field, it's as simple as:
<img src="cid:BBCLOGO#23AD2D600E">
Note that your body must be HTML, such as Content-Type: text/html; chaset="us-ascii", as indicated by RFC 2045 ยง5.
Outlook should do this automatically when you place images in your message body. If you need further help configuring that, there is probably a more appropriate Q&A site than (the programming-centric) Stack Overflow.

Email subject not correctly assigned with Ruby net/smtp

I use Ruby net/smtp
require 'net/smtp'
I send mails using the following method:
Net::SMTP.start(SMTP_SERVER) do |smtp|
smtp.send_message(message,"mailman-ruby#example.de",reciepent)
end
I want to add a subject to the mails i send but couldn't find one in the documentation.
What I tried so far is putting the subject into the message like this:
<<END_OF_MESSAGE
Subject: test message
. . . rest of the message
END_OF_MESSAGE
Unfortunally that doesnt do the trick!
Anyone knows how to set subject using 'smtp/net'?
net/smtp is a very low-level library. It expects the message to be an email message, including all the headers.
From the documentation
msgstr = <<END_OF_MESSAGE
From: Your Name <your#mail.address>
To: Destination Address <someone#example.com>
Subject: test message
Date: Sat, 23 Jun 2001 16:26:43 +0900
Message-Id: <unique.message.id.string#example.com>
This is a test message.
END_OF_MESSAGE
require 'net/smtp'
Net::SMTP.start('your.smtp.server', 25) do |smtp|
smtp.send_message msgstr,
'your#mail.address',
'his_address#example.com'
end
In your case, make sure to add a new line between the Headers and the body. Change
<<END_OF_MESSAGE
Subject: test message
. . . rest of the message
END_OF_MESSAGE
to
<<END_OF_MESSAGE
Subject: test message
. . . rest of the message
END_OF_MESSAGE
Instead of using net/smtp, I highly encourage you to use mail. mail uses a more high level interface for sending email messages without loosing the control of the message.
If you don't really care about advanced usage, you can also switch to pony.
The responsibility of the subject is not that of the SMTP protocol. It is held in one of the SMTP commands, which is to say DATA and as such, is not relevant in responsibility to that library.
However, the DATA will contain either proper (specification indicated) headers, or even some headers that are not specified, but not disallowed. PGP
According to RFC 5321 (and as expected) "Server SMTP systems SHOULD NOT reject messages based on perceived defects in the RFC 822 or MIME (RFC 2045 [21]) message header section or message body.".
So, your answer is going to be: "You don't set the subject by using that." But you would set the DATA with that information in it.
And the documentation that you linked to has an example of doing exactly that:
msgstr = <<END_OF_MESSAGE
From: Your Name <your#mail.address>
To: Destination Address <someone#example.com>
Subject: test message
Date: Sat, 23 Jun 2001 16:26:43 +0900
Message-Id: <unique.message.id.string#example.com>
This is a test message.
END_OF_MESSAGE
require 'net/smtp'
Net::SMTP.start('your.smtp.server', 25) do |smtp|
smtp.send_message msgstr,
'your#mail.address',
'his_address#example.com'
end
Documentation not linked here, as you have already provided the link.

Dealing with ISO-encoding in AJAX requests (prototype)

I have a HTML-page, that's encoded in ISO-8859-1 and a Prototype-AJAX call that's build like this:
new Ajax.Request('api.jsp', {
method: 'get',
parameters: {...},
onSuccess: function(transport) {
var ajaxResponse = transport.responseJSON;
alert(ajaxResponse.msg);
}
});
The api.jsp returns its data in ISO-8859-1. The response contains special characters (German Umlauts) that are not displayed correctly, even if I add a "encoding: ISO-8895-1" to the AJAX-request. Does anyone know how to fix this?
If I call api.jsp in a new browser window separately the special characters are also corrupt. And I can't get any information about the used encoding in the response header. The response header looks like this:
Server Apache-Coyote/1.1
Content-Type application/json
Content-Length 208
Date Thu, 29 Apr 2010 14:40:24 GMT
Notice: Please don't advice the usage of UTF-8. I have to deal with ISO-8859-1.
Just found the answer myself. Though this is for PHP I'm sure you can find the equivalent for ASP :)
Basically, just include the encoding header on your response page (in your case api.asp), like this:
header("Content-Type: text/html; charset=ISO-8859-1");
Good luck with it :)
//Jannik Olsen

Resources