读书人

有朋友做过发邮件程序吗?该怎么解决

发布时间: 2012-03-14 12:01:13 作者: rapoo

有朋友做过发邮件程序吗?
能否介绍一下经验?谢谢~~

[解决办法]
发邮件程序?较简单。偶用Delphi6的TNMSMTP控件做过。无非就是设定几个属性,使用几个NMSMTP自带的方法而已。别忘了BASE64编码。

网上一大堆的资料。
[解决办法]
Delphi7 Indy TIdSMTP



[解决办法]
Delphi6 的 NMSMTP 和 Delphi7 的 indy ,都够用。
[解决办法]
回楼主:现在的Email邮局一般都提供SMTP、POP3服务;可以群发。

实践是第一位的。
[解决办法]
如:163邮局的SMTP服务器就是:smtp.163.com
[解决办法]
实践出真知
[解决办法]
我写你些我用的代码吧,要给分的:
procedure Tfrm_install_data.Send_Mail();
var
strUserName, strPassword: String;
BodyText:string;
begin
try
NMSmtp1.Host:= 'SMTP.163.com ';//Edit3.Text; //SMTP服务器地址
//NMSMTP1.Port:=25;
//NMSmtp1.UserID:= 'lxj_com ';//Edit4.Text; //你在对应服务器上的注册用户名

strUserName := EncodeString( 'lxj_com ');//CoolSlob是服务器的帐号
strPassword := EncodeString( 'lxj_com163.com ');//Password是密码

{进行认证,输入编码后的用户名、密码}
NMSmtp1.UserID:= 'lxj_com ';

Nmsmtp1.ReportLevel :=1;

Nmsmtp1.TimeOut :=10000;


{断开原来的连接,保证TForm1.NMSMTP1Connect中服务器认证的执行}
if NMSMTP1.Connected then
begin
NMSMTP1.Disconnect;
end;

NMSmtp1.Connect; //与服务器建立连接

{进行认证,输入编码后的用户名、密码}
nmsmtp1.Transaction( 'EHLO ') ;
nmsmtp1.Transaction( 'AUTH LOGIN ');//返回值是334表示通过,可以继续下面的
nmsmtp1.Transaction(strUserName);
nmsmtp1.Transaction(strPassword);
{nmsmtp1.Transaction( 'auth login ');
nmsmtp1.Transaction( 'lxj_com ');
nmsmtp1.Transaction( 'lxj_com163.com '); }

NMSmtp1.PostMessage.FromAddress:= 'lxj_com@163.com ';//Edit5.Text; //发件人的邮件地址

{邮件主题}
NMSmtp1.PostMessage.Subject:= '客户: '+Edit3.text+ ' 安装注册资料 ';//Edit2.Text;

NMSmtp1.PostMessage.ToAddress.Add( 'lxj_com@163.com '{Edit1.Text}); //收件人的邮件地址

//NMSmtp1.PostMessage.Attachments.AddStrings(ListBox1.Items); //附件

//NMSmtp1.PostMessage.Body.Assign(Memo1.Lines); //邮件的正文

{邮件的正文}
//( "=?GB2312?B? "+enc.encode(subject.getBytes())+ "?= ");
BodyText:= 'Customer Name : '+Edit3.Text+chr(13)+
'Tel : '+Edit4.Text+chr(13)+
'Address : '+Edit5.Text+chr(13)+
'WEB : '+Edit6.Text;
//BodyText:= '=?GB2312?B? '+BodyText+ '?= ';

//StringToWideChar :=
//StringToWideChar(PWideChar(BodyText),PWideChar(bodyText),Length(BodyText));
NMSmtp1.PostMessage.Body.Text:=BodyText;
//NMSmtp1.PostMessage.Body.Add (BodyText);

NMSmtp1.SendMail; //发送邮件

NMSmtp1.Disconnect; //断开连接

except
//ShowMessage( '发送失败! ');
end;

//ShowMessage( '发送完毕! '); //发送完时显示提示信息
end;

{编码}
function Tfrm_install_data.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;
[解决办法]

function Tfrm_install_data.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;
[解决办法]
Delphi6 的 NMSMTP 和 Delphi7 的 indy
[解决办法]
大家好:我也刚刚做过了一个收发电子邮件的客户端程序,但是就是不管用。想问大家一个问题,就是发信人的地址帐号、密码等该怎么填,要不要添加一个用户,就像用OulLook一样,需要添加一个用户后,才能使用,谢谢了。
[解决办法]
希望大家能够帮忙解决一下,谢谢!!!
[解决办法]
继续提问,在发送邮件的时候出现了如下错误: "bad sequence of commands ",不知道怎么回事,请大家帮忙解决一下,谢谢!

读书人网 >.NET

热点推荐