Page 1 of 1
Richview and SMTP (import into a mail message)
Posted: Fri Oct 27, 2006 5:43 pm
by alogrep
Hi
Is it possible to import a richview document with graphics and
tables etc... in the BODY of an email (not as an attachment)?
If so, what is the syntax, and what SMTP client component is required? (Would ICS be ok?).
Thanks
Enrico
Posted: Fri Oct 27, 2006 6:55 pm
by Sergey Tkachenko
How to create formatted e-mail message:
http://www.trichview.com/forums/viewtopic.php?t=11
I think this message can be sent by any SMTP component (as text)
tried dmime .... unsuccessfully
Posted: Sat Oct 28, 2006 5:08 pm
by alogrep
Hi Sergey
I tried the dmime example but it does not work, clearly b/c I am doing something wrong.
I have a Form with a TNMSMTP Ccomponent (D5) and a TrichviewEdit component. This is a hidden form, I want to read the content (with graphics) from the file 'letters' and load it
directlyu in the Body of teh email that is sent to the someone. I tried the code below, sending the email to myself, but i get a long 'text' of garbage, rather than the content in the 'letters' file. What I am doinig wrong? Also, how doI use RV_RegisterHTMLGraphicFormat to be able to have any kind of picture in the letters file? I did not find an example in demos
var
Stream:TStringStream;
s,s1: string;
.........
LoadRVFFromField(RichViewEdit1,dm3.letters,'content');
HTMLImages.Clear;
Stream := TStringStream.Create('');
try
RichViewEdit1.SaveHTMLToStreamEx(Stream, '', 'Web Archive Demo', '', '', '', '',
[rvsoUseCheckpointsNames, rvsoUTF8]);
s := MimeEncodeString(Stream.DataString);
finally
Stream.Free;
end;
for i := 0 to HTMLImages.Count-1 do begin
SetLength(s1, HTMLImages.Stream.Size);
HTMLImages.Stream.Position := 0;
HTMLImages.Stream.ReadBuffer(PChar(s1)^, Length(s1));
s1 := MimeEncodeString(s1);
s:=s+s1;
Finalize(s1);
end;
HTMLImages.Clear;
SMTP1.PostMessage.Body.text:=s;
Posted: Sun Oct 29, 2006 12:16 pm
by Sergey Tkachenko
1) Message parts MUST look like unreadable garbage, because they are encoded as 'base64'.
Usually, mailers use 'base64' only for binary data (such as images); for the main text they use encodings like 'quoted-printable'.
But it is ok, e-mail clients must be able to decode 'base64'.
2) You cannot just concatenate mime-encoded strings. All other information is very important.
You can see the saved file in Notepad. The message consists of parts. The first part is for the main HTML document, other parts are for images. Each part is started from the header like:
Code: Select all
------=_BOUNDARY_LINE_
Content-Type: image/bmp
Name="image0.bmp"
Content-Transfer-Encoding: base64
Content-ID: <image0.bmp>
And the whole message is started from
Code: Select all
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary="----=_BOUNDARY_LINE_"
X-Unsent: 1
This is a multi-part message in MIME format.
and finished by
All line breaks and indents are very important.
At the very beginning of the message there are lines "from" and "subject", but I guess SMTP1 will add them itself.
3) This demo has wrong comment:
{ Actually, this demo converts all pictures to Jpegs, so only TJpegImage can
occur here. But you can use RV_RegisterHTMLGraphicFormat to allow other
graphic formats in HTML }
Actually, this demo saves all images in formats as they are. It uses OnSaveImage2 event, and images are passed to this event without conversion to jpegs. For the purposes of e-mail saving, you should convert images to jpegs (or png, or gifs). Change the code for this event to (and add CRVData in uses):
Code: Select all
procedure TForm1.RichViewEdit1SaveImage2(Sender: TCustomRichView;
Graphic: TGraphic; SaveFormat: TRVSaveFormat; const Path,
ImagePrefix: String; var ImageSaveNo: Integer; var Location: String;
var DoDefault: Boolean);
var gr: TGraphic;
bmp: TBitmap;
begin
if SaveFormat<>rvsfHTML then
exit;
if not (Graphic is TJPEGImage) and not RV_IsHTMLGraphicFormat(Graphic) then begin
bmp := TBitmap.Create;
try
bmp.Assign(Graphic);
except
bmp.Width := Graphic.Width;
bmp.Height := Graphic.Height;
bmp.Canvas.Draw(0,0, Graphic);
end;
gr := TJPEGImage.Create;
gr.Assign(bmp);
bmp.Free;
end
else
gr := Graphic;
Location := Format('image%d.%s', [ImageSaveNo, GraphicExtension(TGraphicClass(gr.ClassType))]);
inc(ImageSaveNo);
with HTMLImages.Add as THTMLImageItem do
begin
gr.SaveToStream(Stream);
Name := Location;
ContentType := GetImageContentType(gr);
end;
Location := 'cid:'+Location;
DoDefault := False;
if gr<>Graphic then
gr.Free;
end;
Posted: Sun Oct 29, 2006 12:35 pm
by Sergey Tkachenko
Usually, mailers include one more MIME part in the message: plain text alternative of HTML content. It is used by e-mail client that cannot display formatted messages.
But it is not necessary.
Posted: Mon Oct 30, 2006 12:05 am
by alogrep
I have made the corrections. Now I can create a file as you do in your example, and it works. But if instead of saving that stream to disk I sent it to the Body of the smtp, I get just incomprehensible text in my emai.
Now I have seen there are Indy and ICS smtp copmponent that claim they can indorporate a FILE in the body of the Message, but the fact is I am using a Richview richedit, with a cust_name code so i cannot save to file first, then mail them unless I save one file for each customer.
Anybody knows of a way to send directly form inside the Richview richedit the content to the Body of the emai message?
Thanks
Posted: Mon Oct 30, 2006 6:35 am
by Sergey Tkachenko
When receiving this e-mail, compare its source with formatted e-mails sent by other mailers. Try to find the difference.
Send this e-mail to me, I'll try to find what's wrong.
That example already creates a single MIME document from multiple files - HTML and images. You should use either code in this example or Indy/ICS features for creating multipart documents, not both of them, they'd conflict with each other. From the point of view of SMTP components, this document must be a plain text.
Posted: Tue Oct 31, 2006 3:16 pm
by alogrep
did you receive my email sample?
Posted: Tue Oct 31, 2006 8:32 pm
by Sergey Tkachenko
Yes, sorry for delay, I'll try to answer tomorrow.
Posted: Fri Nov 03, 2006 4:01 am
by alogrep
Sergey
Any news yet?
btw, I am not using Indy or CCS SMTP. I am using the standard SMTP that comes with Delphi (5, Prof).
Thanks
Posted: Fri Nov 03, 2006 7:49 pm
by Sergey Tkachenko