2015年2月27日 星期五

用Delphi發email

最近在做會員管理程式,因為覺得不能用手動方式給會員寄Email,不然量大時是會累死人的。所以決定寫一個小程式來發Email。也許很多人都已經用Indy做過類似的軟體,不過筆者在做時,發現如果給的編碼不正確,收到的Email會出現亂碼,所以把筆者寫的小程式放上來,給Delphi的使用者做Email程式時的寫作參考。
程式說明如下

procedure SendEmail(E_address,UserName:String); // E_address是Email地址,UserName是會員姓名
var
  SMTP : TIdSMTP;
  SMSG : TIdMessage;
  ContText : TStrings;
begin
  // 首先建立一下Indy元件
  SMSG := TIdMessage.Create(nil);
  SMTP := TIdSMTP.Create(nil);

  // ContText 是郵件的內容
  ContText := TStringList.Create;
  ContText.Add('親愛的 '+UserName+ 會員你好:');
  ContText.Add('');
  // 在這邊把想要告訴會員的事寫上去
  ContText.Add('');
  ContText.Add('祝 萬事如意,新年快樂');
  try
    // 以下的xxx請依你的郵件伺服器做設定
    SMSG.Recipients.EMailAddresses := E_address;
    SMSG.ReplyTo.EMailAddresses := E_address;
    SMSG.From.Name := 'xxx.com'; // 寄件人
    SMSG.From.Address := 'xxx.com'; // 寄件人Email
    SMSG.Body.Text:= ContText.Text;
    SMSG.Subject := 'xxxx'; // Email主旨
    SMSG.Encoding := meMIME;
    SMSG.CharSet := 'UTF-8';
    SMSG.ContentType := 'text';
    SMSG.ContentTransferEncoding := '8bit';
    SMSG.AttachmentEncoding := 'MIME';
    SMTP.Host:='xxx'; //郵件主機
    SMTP.Port :=xx; // SMTP的 port
    SMTP.Username := 'xxx'; // 如果你的郵件伺服器要登入帳號才能寄的話,記得要設登入名稱和密碼
    SMTP.Password := 'xxx';
    try
      SMTP.Connect;
      SMTP.Send(SMSG);
    finally
      SMTP.Disconnect;
    end;
  finally
    SMTP.Free;
    SMSG.Free;
    ContText.Free;
  end;
end;

這樣就完成了,試寄的結果還不錯,不過實測時,在
    SMSG.Encoding := meMIME;
    SMSG.CharSet := 'UTF-8';
    SMSG.ContentType := 'text';
    SMSG.ContentTransferEncoding := '8bit';
    SMSG.AttachmentEncoding := 'MIME';
調整時,花了不少時間,因為收信出現亂碼,修改程式再寄,等收EMAIL...如此重覆蠻花時間等待。所以提供給各位讀者做參考。

2015年2月6日 星期五

用DELPHI產生HTML

大家熟悉的HTML一般都是用UTF-8格式來做存檔格式,可是DELPHI所用的TXT FILE卻都是用ANSI格式,所以在存檔和轉換都會有許多問題,那怎麼做比較好呢?
筆者最近因為工作上的關係,常會用HTML做樣板,然後再用DELPHI把檔案讀進來,做一些轉換,再形成新的HTML供BROWSER讀取,就碰上了格式的問題。
最後的解決方式是用TStringList的LoadFromFile來解決這個問題
舉例如下
function RefreshHTM():String;
var
  HTML1,HTML2  :TStrings;
  FG : Boolean;
  i : Integer;
begin
  try
    // 宣告二個TString,HTML1承接HTML樣版,HTML2是做轉換後要顯示的HTML結果
    HTML1 := TStringList.Create;
    HTML2 := TStringList.Create;
    try
      // 取得樣版的HTML
      HTML1 .LoadFromFile('D:\web_root\html\PTL01U05.htm');
      for i :=0 to HTML1.Count-1 do
      begin
        // 逐筆把資料抓入
        Ln := HTML1[i];
        // 這邊做想要更換的作

        // 把更改後的資料加到HTML2中
        HTML2.Add(Ln);
      end;
      Result := HTML2.Text;
    finally
      //把資料傳出後,把TString Free 掉
      HTML1.Free;
      HTML2.Free;
    end;
end;