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...如此重覆蠻花時間等待。所以提供給各位讀者做參考。