回 帖 发 新 帖 刷新版面

主题:[讨论]十万火急啊!!--求助.....


   我本学生,正在赶做作业,遇到重大难题,三天后就交了,十万火急,请高人指点!小弟万分感谢!!
   是这样的,我想用Delphi7实现自动发邮件功能,不知如何实现,查阅不少书籍,仍没有结果,功能细节设想如下:
   点击一个BUTTON,弹出一个窗体,上面是邮件的目标地址,收件人姓名等细节,还有自动生成的信件内容(每个邮件,除信头的称呼随收件人的不同而变化外,内容是完全一样的),然后点击"确定",邮件自动发出.
   老天助我啊...

回复列表 (共5个回复)

沙发

{本源码是自由程序,你可以把它用在任何地方,但不允许以任何形式把它单独用作商业用途。


本程序是由一位叫小新的网友所作,但是不知道该朋友的联系方式,如果你是小新,请给我来信!

本人是一个普通的打工仔,为了给朋友们献上更好的源码和控件,我需要你的支持,
如果你认为本程序对你有帮助,希望你寄任意你愿意数额的RMB给我以资鼓励和支持,
如果你认为不值,也希望你寄一张PostCard或者一封Email对我予以支持。

深圳市福田区联合广场41楼恒星威电子有限公司GPS部 艾真保  收
518026

mailto:Aizb@163.net

HomePage:
  http://vip.6to23.com/aizb}

//以下是小新的注释!

//这是我写的一个演示程序,
//窗体上有一个BUTTON控件,一个LABEL控件,一个NMSMTP控件
//带密码险证的邮件发送程序需要BASE64编码,DecodeBase64和 EncodeBase64
//为解码和编码函数
//在263、163和SOHU上都能发送成功
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Psock, NMsmtp, ComCtrls;

type
TForm1 = class(TForm)
  NMSMTP1: TNMSMTP;
  Button1: TButton;
    StatusBar1: TStatusBar;
    Edit1: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Edit2: TEdit;
    Label4: TLabel;
    Edit3: TEdit;
    Label5: TLabel;
    Edit4: TEdit;
    Label6: TLabel;
    Memo1: TMemo;
    Label7: TLabel;
    Edit5: TEdit;
    Label1: TLabel;
    Edit6: TEdit;
    Label8: TLabel;
  procedure Button1Click(Sender: TObject);
  procedure NMSMTP1Connect(Sender: TObject);
  procedure NMSMTP1InvalidHost(var Handled: Boolean);
  procedure NMSMTP1ConnectionFailed(Sender: TObject);
  procedure NMSMTP1Status(Sender: TComponent; Status: String);
  procedure NMSMTP1SendStart(Sender: TObject);
  procedure NMSMTP1Success(Sender: TObject);
private
  { Private declarations }
public
  { Public declarations }
end;

//BaseTable为BASE64码表
const BaseTable:string='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

var
  Form1: TForm1;
  AuthSucc:boolean;// 是否需要密码验证
  function DecodeBase64(Source:string):string; //解码函数
  function FindInTable(CSource:char):integer; //
  function EncodeBase64(Source:string):string; //编码函数
implementation
{$R *.DFM}

//
function FindInTable(CSource:char):integer;
begin
  result:=Pos(string(CSource),BaseTable)-1;
end;
////

function DecodeBase64(Source:string):string;
var
  SrcLen,Times,i:integer;
  x1,x2,x3,x4,xt:byte;
begin
  result:='';
  SrcLen:=Length(Source);
  Times:=SrcLen div 4;
  for i:=0 to Times-1 do
  begin
    x1:=FindInTable(Source[1+i*4]);
    x2:=FindInTable(Source[2+i*4]);
    x3:=FindInTable(Source[3+i*4]);
    x4:=FindInTable(Source[4+i*4]);
    x1:=x1 shl 2;
    xt:=x2 shr 4;
    x1:=x1 or xt;
    x2:=x2 shl 4;
    result:=result+chr(x1);
    if x3= 64 then break;
    xt:=x3 shr 2;
    x2:=x2 or xt;
    x3:=x3 shl 6;
    result:=result+chr(x2);
    if x4=64 then break;
    x3:=x3 or x4;
    result:=result+chr(x3);
  end;
end;
/////

板凳


function EncodeBase64(Source:string):string;
var
  Times,LenSrc,i:integer;
  x1,x2,x3,x4:char;
  xt:byte;
begin
  result:='';
  LenSrc:=length(Source);
  if LenSrc mod 3 =0 then
    Times:=LenSrc div 3
  else
    Times:=LenSrc div 3 + 1;
  for i:=0 to times-1 do
  begin
    if LenSrc >= (3+i*3) then
    begin
      x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
      xt:=(ord(Source[1+i*3]) shl 4) and 48;
      xt:=xt or (ord(Source[2+i*3]) shr 4);
      x2:=BaseTable[xt+1];
      xt:=(Ord(Source[2+i*3]) shl 2) and 60;
      xt:=xt or (ord(Source[3+i*3]) shr 6);
      x3:=BaseTable[xt+1];
      xt:=(ord(Source[3+i*3]) and 63);
      x4:=BaseTable[xt+1];
    end
    else if LenSrc>=(2+i*3) then
    begin
      x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
      xt:=(ord(Source[1+i*3]) shl 4) and 48;
      xt:=xt or (ord(Source[2+i*3]) shr 4);
      x2:=BaseTable[xt+1];
      xt:=(ord(Source[2+i*3]) shl 2) and 60;
      x3:=BaseTable[xt+1];
      x4:='=';
    end else
    begin
      x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
      xt:=(ord(Source[1+i*3]) shl 4) and 48;
      x2:=BaseTable[xt+1];
      x3:='=';
      x4:='=';
    end;
    result:=result+x1+x2+x3+x4;
  end;
end;

//////////
procedure TForm1.Button1Click(Sender: TObject);
//var MailTo,MailBody:TStringList;
begin
  Nmsmtp1.Host :=Edit1.Text;
  nmsmtp1.Port :=25;
  nmsmtp1.UserID :=Edit2.Text;//发信人的用户名,必须是真实的
  nmsmtp1.ReportLevel :=1;
  Nmsmtp1.TimeOut :=10000;
  nmsmtp1.Connect ; ///连接
  if AuthSucc=true then ////验证成功
  begin
    nmsmtp1.PostMessage.FromAddress:=Edit4.Text; //发信人的电子邮件地址
    nmsmtp1.PostMessage.ToAddress.Text :=Edit5.Text;
    nmsmtp1.PostMessage.Body.Text:=Memo1.Text;
    nmsmtp1.PostMessage.Subject :=Edit6.Text;
    nmsmtp1.SendMail;
  end;
end;

procedure TForm1.NMSMTP1Connect(Sender: TObject);
begin
  //////连接成功,下面用户认证过程
  StatusBar1.SimpleText:=nmsmtp1.Status;
  if nmsmtp1.ReplyNumber = 250 then
    StatusBar1.SimpleText:=nmsmtp1.Transaction('auth login'); //开始认证
  if nmsmtp1.ReplyNumber =334 then //返回值为334,让你输入用BASE64编码后的用户名
    StatusBar1.SimpleText:=nmsmtp1.Transaction(EncodeBase64(Edit2.Text));
  if nmsmtp1.ReplyNumber =334 then // 返回值为334,让你输入用BASE64编码后的用户密码
    StatusBar1.SimpleText:=nmsmtp1.Transaction(EncodeBase64(Edit3.Text));
  if nmsmtp1.ReplyNumber =235 then
  begin
    StatusBar1.SimpleText:='successful';
    AuthSucc:=true;
  end;
end;

procedure TForm1.NMSMTP1InvalidHost(var Handled: Boolean);
begin
  StatusBar1.SimpleText :='Invalid Host';
end;
procedure TForm1.NMSMTP1ConnectionFailed(Sender: TObject);
begin
  StatusBar1.SimpleText :='connect failed';
end;
procedure TForm1.NMSMTP1Status(Sender: TComponent; Status: String);
begin
  StatusBar1.SimpleText :=nmsmtp1.Status ;
end;
procedure TForm1.NMSMTP1SendStart(Sender: TObject);
begin
  StatusBar1.SimpleText :='start send';
end;
procedure TForm1.NMSMTP1Success(Sender: TObject);
begin
  StatusBar1.SimpleText:='send success!';
end;

end.

3 楼

我也是在网上查到的,你自己可以根据需要改改。

4 楼

用INDY控件,几行代码搞定

5 楼

sxd099这位朋友:
    前面几天比较忙,今天刚来论坛,才看到的.首先非常感谢你的帮助!!我还没有试呢,当然如果结果不错,能够对我所要实现的功能有所帮助的话,我一定会给你加很多分的!这点请放心.关于RMB的事情,我们再商量,你看还好吧

我来回复

您尚未登录,请登录后再回复。点此登录或注册