Delphi让你发送Flash电子邮件完整源代码

{******Unit1.pas源代码内容如下******} 
unit Unit1; 
interface 
uses 
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, 
Dialogs, StdCtrls, ExtCtrls, Psock, NMsmtp; 
type 
TForm1 = class(TForm) 
Label1: TLabel; 
txtTo: TEdit; 
Label2: TLabel; 
txtFrom: TEdit; 
Label3: TLabel; 
txtSubject: TEdit; 
Label4: TLabel; 
memContents: TMemo; 
Label5: TLabel; 
txtUserName: TEdit; 
Label6: TLabel; 
txtPassword: TEdit; 
chkSmtpVerify: TCheckBox; 
btnSend: TButton; 
btnOpen: TButton; 
txtSwfFile: TEdit; 
Label7: TLabel; 
OpenDialog1: TOpenDialog; 
Label8: TLabel; 
txtSmtpServer: TEdit; 
NMSMTP1: TNMSMTP; 
Label9: TLabel; 
txtPort: TEdit; 
procedure btnOpenClick(Sender: TObject); 
procedure btnSendClick(Sender: TObject); 
procedure NMSMTP1SendStart(Sender: TObject); 
procedure NMSMTP1Connect(Sender: TObject); 
procedure chkSmtpVerifyClick(Sender: TObject); 
private 
{ Private declarations } 
public 
{ Public declarations } 
end; 
var 
Form1: TForm1; 
function EncodeString(Decoded:string):String; 
function EncodeBASE64(Encoded: TMemoryStream {TMailText}; Decoded: TMemoryStream): Integer; //编码函数 
implementation 
{$R *.dfm} 
{对参数TMemoryStrema中的字节流进行Base64编码,编码后的结果 
保存在Encoded中,函数返回编码长度} 
function EncodeBASE64(Encoded: TMemoryStream ; Decoded: TMemoryStream): Integer; 
const 
_Code64: String[64] = 
('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'); 
var 
I: LongInt; 
B: array[0..2279] of Byte; 
J, K, L, M, Quads: Integer; 
Stream: string[76]; 
EncLine: String; 
begin 
Encoded.Clear; 
Stream := ''; 
Quads := 0; 
{为提高效率,每2280字节流为一组进行编码} 
J := Decoded.Size div 2280; 
Decoded.Position := 0; 
{对前J*2280个字节流进行编码} 
for I := 1 to J do 
begin 
Decoded.Read(B, 2280); 
for M := 0 to 39 do 
begin 
for K := 0 to 18 do 
begin 
L:= 57*M + 3*K; 
Stream[Quads+1] := _Code64[(B[L] div 4)+1]; 
Stream[Quads+2] := _Code64[(B[L] mod 4)*16 + (B[L+1] div 16)+1]; 
Stream[Quads+3] := _Code64[(B[L+1] mod 16)*4 + (B[L+2] div 64)+1]; 
Stream[Quads+4] := _Code64[B[L+2] mod 64+1]; 
Inc(Quads, 4); 
if Quads = 76 then 
begin 
Stream[0] := #76; 
EncLine := Stream+#13#10; 
Encoded.Write(EncLine[1], Length(EncLine)); 
Quads := 0; 
end; 
end; 
end; 
end; 
{对以2280为模的余数字节流进行编码} 
J := (Decoded.Size mod 2280) div 3; 
for I := 1 to J do 
begin 
Decoded.Read(B, 3); 
Stream[Quads+1] := _Code64[(B[0] div 4)+1]; 
Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1]; 
Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + (B[2] div 64)+1]; 
Stream[Quads+4] := _Code64[B[2] mod 64+1]; 
Inc(Quads, 4); 
{每行76个字符} 
if Quads = 76 then 
begin 
Stream[0] := #76; 
EncLine := Stream+#13#10; 
Encoded.Write(EncLine[1], Length(EncLine)); 
Quads := 0; 
end; 
end; 
{“=”补位} 
if (Decoded.Size mod 3) = 2 then 
begin 
Decoded.Read(B, 2); 
Stream[Quads+1] := _Code64[(B[0] div 4)+1]; 
Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1]; 
Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + 1]; 
Stream[Quads+4] := '='; 
Inc(Quads, 4); 
end; 
if (Decoded.Size mod 3) = 1 then 
begin 
Decoded.Read(B, 1); 
Stream[Quads+1] := _Code64[(B[0] div 4)+1]; 
Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + 1]; 
Stream[Quads+3] := '='; 
Stream[Quads+4] := '='; 
Inc(Quads, 4); 
end; 
Stream[0] := Chr(Quads); 
if Quads > 0 then 
begin 
EncLine := Stream+#13#10; 
Encoded.Write(EncLine[1], Length(EncLine)); 
end; 
Result := Encoded.Size; 
end; 
{对参数Decoded字符串进行Base64编码,返回编码后的字符串} 
function EncodeString(Decoded:string):String; 
var 
mmTemp,mmDecoded:TMemoryStream; 
strTemp:TStrings; 
begin 
mmTemp := TMemoryStream.Create; 
mmDecoded:=TMemoryStream.Create; 
strTemp:=TStringList.Create; 
strTemp.Add(Decoded); 
strTemp.SaveToStream(mmTemp); 
mmTemp.Position := 0; 
{剔除mmTemp从strTemp中带来的字符#13#10} 
mmDecoded.CopyFrom(mmTemp,mmTemp.Size-2); 
{对mmDecoded进行Base64编码,由mmTemp返回编码后的结果} 
EncodeBASE64(mmTemp,mmDecoded); 
{获得Base64编码后的字符串} 
mmTemp.Position:=0; 
strTemp.LoadFromStream(mmTemp); 
{返回结果必须从strTemp[0]中获得,如果使用strTemp.Text会 
带来不必要的字符#13#10} 
Result:=strTemp[0]; 
end; 
procedure TForm1.btnOpenClick(Sender: TObject); 
begin 
{打开对话框,选择SWF文件} 
if OpenDialog1.Execute then 
begin 

nd; 
end; 
procedure TForm1.btnSendClick(Sender: TObject); 
var 
mmSwfFile,mmEncoded:TMemoryStream; 
iResult:Integer; 
strsTemp:TStrings; 
strContents:TStringList; 
i:Integer; 
begin 
{验证用户输入信息} 
if txtTo.Text='' then 
begin 
ShowMessage('请输入收信人!'); 
Exit; 
end; 
if txtFrom.Text='' then 
begin 
ShowMessage('请输入发信人!'); 
Exit; 
end; 
if txtSmtpServer.Text='' then 
begin 
ShowMessage('请输入SMTP服务器!'); 
Exit; 
end; 
if txtPort.Text='' then 
begin 
ShowMessage('请输入端口号!'); 
Exit; 
end; 
if txtSwfFile.Text='' then 
begin 
ShowMessage('请选择SWF文件!'); 
Exit; 
end; 
{检验服务器认证的用户名和密码} 
if chkSmtpVerify.Checked = True then 
if (txtUserName.Text='') or (txtPassword.Text='') then 
begin 
ShowMessage('您已选择SMTP服务器需要认证'+#13#10+'请输入用户名和密码!'); 
Exit; 
end; 
{设置SMTP服务器地址、端口} 
NMSMTP1.Host:=txtSmtpServer.Text; 
NMSMTP1.Port:=StrToInt(txtPort.Text); 
{断开原来的连接,保证TForm1.NMSMTP1Connect中服务器认证的执行} 
if NMSMTP1.Connected then 
begin 
NMSMTP1.Disconnect; 
end; 
{连接服务器} 
NMSMTP1.Connect; 
{创建流} 
mmSwfFile:=TMemoryStream.Create; 
mmEncoded:=TMemoryStream.Create; 
{加载文件至流mmSwfFile} 
mmSwfFile.LoadFromFile(txtSwfFile.Text); 
{对mmSwfFile进行Base64编码,mmEncoded为编码后内容} 
iResult:=EncodeBASE64(mmEncoded,mmSwfFile); 
strsTemp:=TStringList.Create; 
mmEncoded.Position:=0; 
strsTemp.LoadFromStream(mmEncoded); 
{----生成邮件内容----} 
strContents:=TStringList.Create; 
strContents.Add('--------------SwfEmail by JDH'); 
strContents.Add('Content-Type: text/html; charset=gb2312'); 
strContents.Add('Content-Transfer-Encoding: 8bit'); 
{注意:空行是邮件格式所必需的!} 
strContents.Add(''); 
strContents.Add('< HTML >< HEAD >< TITLE >SWFEMAIL< /TITLE >< /HEAD >'); 
strContents.Add('< BODY >'); 
{添加邮件正文内容} 
for i:=0 to memContents.Lines.Count-1 do 
begin 
strContents.Add(memContents.Lines[i] + '< br >'); 
end; 
{添加SWF文件相关内容} 
strContents.Add('< object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/ 
cabs/flash/swflash.cab#version=5,0,0,0">'); 
strContents.Add('< param name=movie value="cid:jdh_swfemail@001" >'); 
strContents.Add('< param name=quality value=high >'); 
strContents.Add('< embed src="cid:jdh_swfemail@001" quality=high pluginspage="http://www.macromedia.com/shockwave/download/index.cgi? 
P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" >'); 
strContents.Add('< /embed>< /object >< /BODY >< /HTML >'); 
strContents.Add(''); 
strContents.Add('--------------SwfEmail by JDH'); 
strContents.Add('Content-Type: image/swf'); 
strContents.Add('Content-ID: < jdh_swfemail@001 >'); 
strContents.Add('Content-Transfer-Encoding: base64'); 
strContents.Add('Content-Disposition: inline; filename="'+ExtractFileName(txtSwfFile.Text)+'"' ); 
strContents.Add(''); 
strContents.Add(strsTemp.Text); 
strContents.Add(''); 
{----生成邮件内容结束----} 
{设置邮件发送信息} 
NMSMTP1.PostMessage.FromAddress := txtFrom.Text; 
NMSMTP1.PostMessage.FromName := txtFrom.Text; 
NMSMTP1.PostMessage.ToAddress.Text := txtTo.Text; 
NMSMTP1.PostMessage.Body.Text := strContents.Text; 
NMSMTP1.PostMessage.Subject := txtSubject.Text; 
{发送电子邮件} 
NMSMTP1.SendMail; 
ShowMessage('邮件发送成功!'); 
end; 
procedure TForm1.NMSMTP1Connect(Sender: TObject); 
var 
strUserName,strPassword:string; 
begin 
{如果SMTP服务器需要认证,则进行认证} 
if chkSmtpVerify.Checked = True then 
begin 
{对用户名和密码进行Base64编码} 
strUserName:=EncodeString(txtUserName.Text); 
strPassword:=EncodeString(txtPassword.Text); 
{进行认证,输入编码后的用户名、密码} 
nmsmtp1.Transaction('auth login'); 
nmsmtp1.Transaction(strUserName); 
nmsmtp1.Transaction(strPassword); 
end; 
end; 
procedure TForm1.NMSMTP1SendStart(Sender: TObject); 
begin 
{在邮件发送开始时修改邮件的消息头,标明邮件为多部分组成} 
NMSMTP1.FinalHeader.Values['Content-Type'] := ' 
multipart/related; boundary="------------SwfEmail by JDH"'; 
end; 
procedure TForm1.chkSmtpVerifyClick(Sender: TObject); 
begin 
{根据是否需要SMTP服务器认证,改变用户名、密码状态} 
if chkSmtpVerify.Checked = True then 
begin 
txtUserName.Enabled := True; 
txtUserName.Color:= clWindow; 
txtPassword.Enabled := True; 
txtPassword.Color:= clWindow; 
end 
else 
begin 
txtUserName.Enabled := False; 
txtUserName.Color:= clSilver; 
txtPassword.Enabled := False; 
txtPassword.Color:= clSilver; 
end; 
end; 
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值