全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5183
推到 Plurk!
推到 Facebook!

IdSMTP, IdMessage 寄送 HTML + CSS信件問題

尚未結案
Gorden Peng
一般會員


發表:11
回覆:11
積分:4
註冊:2002-03-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-07 18:20:47 IP:219.80.xxx.xxx 未訂閱
在本討論區中我學會了如何用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-08 12:34:44 IP:210.58.xxx.xxx 未訂閱
試試看引用css檔案 先把你的css節區存成css檔案 放在網路上可存取的URL 然後在HTML的檔頭加上
<link rel=stylesheet type="text/css" href="http://URL/xxx.css">
這樣試試看
Gorden Peng
一般會員


發表:11
回覆:11
積分:4
註冊:2002-03-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-08 13:15:09 IP:140.117.xxx.xxx 未訂閱
artist1002 sir: 謝謝您的回覆。 我知道link 外部CSS檔可以解決問題,但是因為我的HTML CSS格式信件是在client端自動動態由TRICHVIEW元件saveToHTMLEx產生的,它存成HTML檔時即已內含CSS格式,因此每次寄信時必須先將該檔案的CSS及HTML內容分離,另存兩個檔案,一個檔案送回web server,另一個檔案當作郵件內容,非常麻煩。因此才想問問看:是否電子郵件裏可以內含CSS格式?如果可以,該如何封裝?
artist1002
高階會員


發表:2
回覆:155
積分:151
註冊:2002-09-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-08 18:14:19 IP:210.58.xxx.xxx 未訂閱
我剛剛用自己寫的軟體試了ㄧ下 我用你提供的HTM檔案來寄信 是可以正確顯示格式的. 那問題可能是出在你的內文編碼了 你目前有做編碼嗎? 我是用quoted-printable作內文編碼 然後76字元換行的~
Gorden Peng
一般會員


發表:11
回覆:11
積分:4
註冊:2002-03-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-08 21:26:20 IP:219.81.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-08 22:27:16 IP:210.58.xxx.xxx 未訂閱
我當時開發的寄送信件程式主要的目標是希望寄出去的信件和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;iCount;i  )
    {
        if (temp->Strings[i]=="Content-Transfer-Encoding: XQPENCODE") //判斷傳送內容
        {
            temp->Strings[i]="Content-Transfer-Encoding: quoted-printable";
        }    
    }
    AStream->Position = 0;
    AStream->Size = 0;
    if (temp->Count) //寫回AStream
        AStream->Write(temp->Text.c_str(),temp->Text.Length());
    else
        AStream->Write(AnsiString(char(0)).c_str(),1);    
    delete temp;    
}
這是我土法煉鋼的作法,希望能幫上忙
Gorden Peng
一般會員


發表:11
回覆:11
積分:4
註冊:2002-03-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-08 23:01:03 IP:219.81.xxx.xxx 未訂閱
非常謝謝,等我把它改成delphi語法測試看看,應該是不會有問題了。
artist1002
高階會員


發表:2
回覆:155
積分:151
註冊:2002-09-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-10 05:50:57 IP:210.58.xxx.xxx 未訂閱
引言: 非常謝謝,等我把它改成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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-10 22:41:58 IP:219.81.xxx.xxx 未訂閱
的確,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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-08 11:54:15 IP:220.130.xxx.xxx 未訂閱
請問各位大大: 我照這樣的方式寫, 都會出現此訊息說。 Invalid Text count. TIdText muse be greater than 1. 請問要怎麼用呢? 謝謝您們的教導啊!
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-04-26 13:50:46 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-04-20 11:38:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!