IdSMTP, IdMessage 寄送 HTML + CSS信件問題 |
尚未結案
|
Gorden Peng
一般會員 發表:11 回覆:11 積分:4 註冊:2002-03-18 發送簡訊給我 |
在本討論區中我學會了如何用IdSMTP, IdMessage
1.傳送HTML格式信件。
2.傳送HTML格式信件同時傳送其他非html格式內附圖檔的附件。
3.解決IdMessage主旨長度超過46會出現異常狀況之問題。
這個討論區不單是個問題解決專家,更是個人自我學習的好園地。真是要謝謝各路一些不願藏私的好手。 現在有關HTML格式的信件還有一點美中不足的是:假如我的HTML格式的內容含有CSS格式在內,在封裝IdMessage時要如何封裝?
我用本討論區中所提供的Demo程式測試,都可以正常傳送,但收到後無法更據CSS格式來顯示內容,原始的HTML + CSS內容如下: 但是收到信後內容卻變成如下所顯示之圖檔: 不單格式不對,連所指定的字型都不見了。是否有人知道如何解決這個問題?
我的原始HTML + CSS格式內容見
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=59328
|
artist1002
高階會員 發表:2 回覆:155 積分:151 註冊:2002-09-26 發送簡訊給我 |
|
Gorden Peng
一般會員 發表:11 回覆:11 積分:4 註冊:2002-03-18 發送簡訊給我 |
|
artist1002
高階會員 發表:2 回覆:155 積分:151 註冊:2002-09-26 發送簡訊給我 |
|
Gorden Peng
一般會員 發表:11 回覆:11 積分:4 註冊:2002-03-18 發送簡訊給我 |
artist1002 sir: 謝謝您還在為我這個問題傷腦筋,我用底下這個連結提供的程式測試
http://delphi.ktop.com.tw/topic.php?topic_id=59185
以及http://delphi.ktop.com.tw/topic.php?topic_id=21398
領航天使提供的範例測試,情況都一樣。 我把第一個連結的範例改成如下:
procedure generate_mail; var i: integer; txtpart: Tidtext; htmpart: tidtext; bmppart: TIdAttachment; begin for i:= 0 to memo2.lines.count - 1 do begin html.add(parseline(memo2.Lines.Strings[i])); end; email:= TIdMessage.Create(nil); email.From.Text:= edit4.text; email.Subject := edit1.text; email.ContentType := 'multipart/mixed'; //==這裡是我加的========================================= email.ContentTransferEncoding :='quoted-printable'; //======================================================= email.Body.Assign(html); txtpart:= TIdText.Create(email.MessageParts); txtpart.ContentType := 'text/plain'; txtpart.Body.Text := ''; htmpart := TIdText.Create(email.MessageParts, html); htmpart.ContentType := 'text/html'; for i:= 0 to piclist.Count - 1 do begin bmppart:= TIdAttachment.Create(email.MessageParts, piclist.Strings[i]); bmppart.ContentType := 'image/jpeg'; bmppart.ContentDisposition := 'inline'; bmppart.ExtraHeaders.Values['content-id']:= piclist.Strings[i]; bmppart.DisplayName := piclist.Strings[i]; end; end;可是情況還是一樣,可否請教您是如何設定的?再次謝謝了。 |
artist1002
高階會員 發表:2 回覆:155 積分:151 註冊:2002-09-26 發送簡訊給我 |
我當時開發的寄送信件程式主要的目標是希望寄出去的信件和Outlook Express相似(收信軟體相容度較高).
所以我在信件的部份是採用MultiParts的方式.
我目前是使用Indy 9.0.14
在使用Indy來完成我的程式的時候,我發現有一些Indy的問題
1.Indy的IdMessage設定成Quoted-printable時,寄送時自行編碼的結果是有問題的>
(收信程式判讀會有時會出現亂碼,原因是Indy的IdMessage的Quoted-printable編碼換行出問題)
2.Indy會判斷ContentTransfer來採取對應的編碼。 我在解決這個問題時,並不想修改Indy原始碼。因為如果改了原始碼,以後的新版本還要再對照,挺麻煩的。
我的解決方法是
1. 自行用IdEncoderQuotedPrintable編碼內容,放回內文
2. 先使用Keyword來代替ContenTransfer=Quoted-printable,在傳送時再用IdConnectionIntercept元件來讓Keyword復原
下面提供我程式的部份內容
註解:
BodyTemp是TStringsList,放置HTML原始碼
IdEncoderQuotedPrintable1是TIdEncoderQuotedPrintable,編碼元件
AnsiString temp; IdMessage->Encoding=meMIME; //建立MultiParts TextPart=new TIdText(IdMessage->MessageParts, NULL); temp="text/html;\n\t"; temp ="charset=\"" IdMessage->CharSet "\""; TextPart->ContentType=temp; //Indy的Content Type自行產生的內容有問題,所以自己動手修 TextPart->ContentTransfer="XQPENCODE"; //XQPENCODE是keyword,寄出時再換成quoted-printable //quoted-printable編碼 TStringStream *tempstream; tempstream = new TStringStream(BodyTemp->Text); BodyTemp->Text=IdEncoderQuotedPrintable1->Encode(tempstream,tempstream->Size); delete tempstream; TextPart->Body->Text=BodyTemp->Text;以上是編寫IdMessage部份 以下是在寄送時修改關鍵字部份 先設定IdSMTP->Intercept=IdConnectionIntercept; 然後在OnSend事件 void __fastcall TForm::IdConnectionInterceptSend( TIdConnectionIntercept *ASender, TStream *AStream) { TStringList *temp; temp = new TStringList(); temp->LoadFromStream(AStream); //將寄送內容讀到StringList中 int i; for (i=0;i這是我土法煉鋼的作法,希望能幫上忙 |
Gorden Peng
一般會員 發表:11 回覆:11 積分:4 註冊:2002-03-18 發送簡訊給我 |
|
artist1002
高階會員 發表:2 回覆:155 積分:151 註冊:2002-09-26 發送簡訊給我 |
引言: 非常謝謝,等我把它改成delphi語法測試看看,應該是不會有問題了。有件事要跟你說抱歉。 因為我之前用Indy 9.0.10的時候發現有問題,所以才這樣修改 剛剛用Indy 9.0.14測試Send的Encode後,發現這個版本好像修正了編碼換行的問題。 所以你這個問題就可以不用使用我之前提供的複雜解法 試試看下面的程式碼 只要增加紅字部分,我剛試過可以用,你在Delphi上試試 procedure generate_mail; var i: integer; txtpart: Tidtext; htmpart: tidtext; bmppart: TIdAttachment; begin for i:= 0 to memo2.lines.count - 1 do begin html.add(parseline(memo2.Lines.Strings[i])); end; email:= TIdMessage.Create(nil); email.From.Text:= edit4.text; email.Subject := edit1.text; email.ContentType := 'multipart/mixed'; //==這裡是我加的========================================= email.ContentTransferEncoding :='quoted-printable'; //======================================================= email.Body.Assign(html); txtpart:= TIdText.Create(email.MessageParts); txtpart.ContentType := 'text/plain'; txtpart.Body.Text := ''; htmpart := TIdText.Create(email.MessageParts, html); htmpart.ContentType := 'text/html'; htmpart.ContentTransferEncodeing :='quoted-printable'; for i:= 0 to piclist.Count - 1 do begin bmppart:= TIdAttachment.Create(email.MessageParts, piclist.Strings[i]); bmppart.ContentType := 'image/jpeg'; bmppart.ContentDisposition := 'inline'; bmppart.ExtraHeaders.Values['content-id']:= piclist.Strings[i]; bmppart.DisplayName := piclist.Strings[i]; end; end; |
Gorden Peng
一般會員 發表:11 回覆:11 積分:4 註冊:2002-03-18 發送簡訊給我 |
的確,Indy v9.0.14之後的版本只要如下紅字之處設定即可傳送HTML + CSS格式的信件:
procedure generate_mail; var i: integer; txtpart: Tidtext; htmpart: tidtext; bmppart: TIdAttachment; begin for i:= 0 to memo2.lines.count - 1 do begin html.add(parseline(memo2.Lines.Strings[i])); end; email:= TIdMessage.Create(nil); email.From.Text:= edit4.text; email.Subject := edit1.text; email.ContentType := 'multipart/mixed'; email.Body.Assign(html); txtpart:= TIdText.Create(email.MessageParts); txtpart.ContentType := 'text/plain'; txtpart.Body.Text := ''; htmpart := TIdText.Create(email.MessageParts, html); htmpart.ContentType := 'text/html'; htmpart.ContentTransfer :='quoted-printable'; for i:= 0 to piclist.Count - 1 do begin bmppart:= TIdAttachment.Create(email.MessageParts, piclist.Strings[i]); bmppart.ContentType := 'image/jpeg'; bmppart.ContentDisposition := 'inline'; bmppart.ExtraHeaders.Values['content-id']:= piclist.Strings[i]; bmppart.DisplayName := piclist.Strings[i]; end; end;不過好像只有outlook可以正常顯示,openwebmail完全無法根據CSS格式顯示。 非常謝謝artist1002的幫忙。 如果有人需要在IdConnectionIntercept的send事件中攔截AStream的資料請參考我另外一個問題:http://delphi.ktop.com.tw/topic.php?TOPIC_ID=59442 |
Blueberrug
一般會員 發表:14 回覆:50 積分:17 註冊:2005-05-22 發送簡訊給我 |
|
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |