发送邮件用什么控件?能不能直接填写邮箱地址、邮件标题和内容就可以调用控件方法发送出去的,在任意机子上?

ooolinux 2019-09-16 12:39:00
发送邮件用什么控件?能不能直接填写邮箱地址、邮件标题和内容就可以调用控件方法发送出去的,在任意机子上?
...全文
268 点赞 收藏 23
写回复
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
善待流浪猫 2019-11-26
procedure TfrmContactUs.btnSendMailClick(Sender: TObject); begin if edtMailTo.Text <> '' then if (Pos('@', edtMailTo.Text) = 0) or (Pos('.', edtMailTo.Text) = 0) then begin ShowMessage('收件人邮箱格式错误'); Exit; end; if edtMailFrom.Text = '' then begin ShowMessage('发件人不能为空'); Exit; end; if edtMailSubject.Text = '' then begin ShowMessage('邮件主题不能为空'); Exit; end; oMsg.From.Address := oSMTP.Username; if edtMailTo.Text <> '' then oMsg.Recipients.EMailAddresses := edtMailTo.Text else oMsg.Recipients.EMailAddresses := oSMTP.Username; oMsg.Subject := edtMailSubject.Text; oMsg.Body.Text := mmoMailBody.Text + #13 + #13 + '发件人:' + edtMailFrom.Text; try if not oSMTP.Connected then oSMTP.Connect; oSMTP.Send(oMsg); ShowMessage('邮件发送成功'); except on E: Exception do ShowMessage('ERROR: ' + E.Message); end; end;
回复
ooolinux 2019-11-26
你这个界面不错,怎么弄的? @善待流浪猫
回复
ooolinux 2019-11-09
引用 20 楼 advance_coder 的回复:
[quote=引用 19 楼 ooolinux的回复:][quote=引用 18 楼 advance_coder 的回复:] 不知道你自己是否会写socket,会写的话,可以百度RFC(里面有多方面的协议标准文档,都是英文的),再在rfc网站搜索smtp有详细介绍。祝好运。
那不是造轮子吗[/quote] 这还是最简单的呢! smtp 还需要扩展协议,如加密的时候。 如果你只是简单发邮件那就找控件,或者搜些简易代码,要是以后会用到加密发送,那还是自己造吧。 网上搜些简易发送邮件代码,对照SMTP协议看一下,你会发现很简单的![/quote] 我现在用Indy组件可以发送了。
回复
advance_coder 2019-11-09
引用 19 楼 ooolinux的回复:
[quote=引用 18 楼 advance_coder 的回复:] 不知道你自己是否会写socket,会写的话,可以百度RFC(里面有多方面的协议标准文档,都是英文的),再在rfc网站搜索smtp有详细介绍。祝好运。
那不是造轮子吗[/quote] 这还是最简单的呢! smtp 还需要扩展协议,如加密的时候。 如果你只是简单发邮件那就找控件,或者搜些简易代码,要是以后会用到加密发送,那还是自己造吧。 网上搜些简易发送邮件代码,对照SMTP协议看一下,你会发现很简单的!
回复
ooolinux 2019-11-09
引用 18 楼 advance_coder 的回复:
不知道你自己是否会写socket,会写的话,可以百度RFC(里面有多方面的协议标准文档,都是英文的),再在rfc网站搜索smtp有详细介绍。祝好运。
那不是造轮子吗
回复
advance_coder 2019-11-09
不知道你自己是否会写socket,会写的话,可以百度RFC(里面有多方面的协议标准文档,都是英文的),再在rfc网站搜索smtp有详细介绍。祝好运。
回复
ooolinux 2019-11-03
IdMessage1->CharSet="GBK";
回复
ooolinux 2019-11-03
用: IdMessage1->From->Address=IdSMTP1->Username; IdMessage1->Subject=Edit1->Text; // IdMessage1->Body->Assign(Memo1->Lines); IdMessage1->Body->Text=Memo1->Text; 邮件发送成功了,但是win10下收到邮件内容乱码,全是 ??????? ????? 而标题显示正常。不知道是啥问题?
回复
ooolinux 2019-11-03
引用 14 楼 nikotin 的回复:
qq的邮箱,要在邮箱设置里面启用smtp服务才能发送邮件,163的也是类似。另外qq邮箱的smtp端口不是默认的,要设置成qq邮箱推荐的端口。你网上搜下看看。
163的邮箱,我启用了smtp,现在连接没问题了,发送部分出错:mail from must equal authorized user 我代码: IdMessage1->From->Name=IdSMTP1->Username; 不知道啥问题了?
回复
nikotin 2019-11-02
qq的邮箱,要在邮箱设置里面启用smtp服务才能发送邮件,163的也是类似。另外qq邮箱的smtp端口不是默认的,要设置成qq邮箱推荐的端口。你网上搜下看看。
回复
就是hello,握手命令,把自己的域名告诉接收者
回复
ooolinux 2019-09-18
引用 12 楼 早打大打打核战争 的回复:
就是hello,握手命令,把自己的域名告诉接收者


好像还有一个EHLO命令的?
回复
ooolinux 2019-09-17
引用 2 楼 老大i 的回复:
https://blog.csdn.net/zhouky1993/article/details/60953892
我连接 mail.163.com ,出现: Socket Error # 10061 Connection refused. 不知道什么原因?
回复
ooolinux 2019-09-17
问个题外的,SMTP有关的HELO name是啥,英文缩写什么的?
回复
ooolinux 2019-09-17
引用 9 楼 ouyongke 的回复:
[quote=引用 8 楼 ooolinux 的回复:]
[quote=引用 2 楼 老大i 的回复:]
https://blog.csdn.net/zhouky1993/article/details/60953892


我连接 mail.163.com ,出现:
Socket Error # 10061
Connection refused.
不知道什么原因?[/quote]
很多年不玩发邮件了,因为历史原因(当年最方便开发垃圾邮件工具的就是Delphi),所以现在无法用Delphi搞发邮件工具也正常,因为人家服务器就是禁止你Delphi过来连接。
我记得早年的时候,要修改id控件底层的一段代码,好像是邮件通讯握手协议什么的,让服务器不认为是IdSmtp控件过来连接,而且你的情况需要再测试一下,看具体是什么原因连不上163。
比如QQ邮箱和其他的邮箱都正常,就只是163连接不正常,那就是人家和协Delphi;如果都连不上,那就是配置有问题。[/quote]

我参考了链接里的代码,Host为mail.163.com或者mail.qq.com都连接不上,用户名和密码应该是对的,我去掉了try语句,让上层的Application消息循环自己捕捉异常,这样可以显示异常原因。
回复
ouyongke 2019-09-17
引用 8 楼 ooolinux 的回复:
[quote=引用 2 楼 老大i 的回复:]
https://blog.csdn.net/zhouky1993/article/details/60953892


我连接 mail.163.com ,出现:
Socket Error # 10061
Connection refused.
不知道什么原因?[/quote]
很多年不玩发邮件了,因为历史原因(当年最方便开发垃圾邮件工具的就是Delphi),所以现在无法用Delphi搞发邮件工具也正常,因为人家服务器就是禁止你Delphi过来连接。
我记得早年的时候,要修改id控件底层的一段代码,好像是邮件通讯握手协议什么的,让服务器不认为是IdSmtp控件过来连接,而且你的情况需要再测试一下,看具体是什么原因连不上163。
比如QQ邮箱和其他的邮箱都正常,就只是163连接不正常,那就是人家和协Delphi;如果都连不上,那就是配置有问题。
回复
老大i 2019-09-16
引用 3 楼 ooolinux 的回复:

procedure TForm1.btnSendMailClick(Sender: TObject);
begin
//------------------------------------
//设置登录信息
//ZkyIdSMTP为控件名,
//可自己更改为与上面的一样的名字。
//格式为:
//<TIdSMIP控件名>.<属性>:=<自己的信息>
//------------------------------------
ZkyIdSMTP.AuthenticationType := atLogin;//设置登录类型,一般不变动
ZkyIdSMTP.Host := 'mail.qq.com'; //设置SMTP地址
ZkyIdSMTP.UserId := '1111@qq.com'; //设置登录账号
ZkyIdSMTP.Password := '1111'; //设置登录密码
ZkyIdSMTP.Port := 25; //设置端口,必须要整形型
try
ZkyIdSMTP.Connect; //连接服务器
except //如果连接失败,提示并退出程序
ShowMessage('连接服务器失败');
Exit;
end;
ShowMessage('成功连接服务器。'+#10#13+'点击确认后准备发邮件。');


//------------------------------------
//配置发送的内容,格式为:
//<TIdMessage的控件名> . <属性>:=
//------------------------------------
ZkyIdMessage.From.name := '1111@qq.com';//设置发件人姓名
ZkyIdmessage.Recipients.EMailAddresses:='2222@qq.com';//设置收件人邮箱地址(此为单发邮件的语句,群发时需去掉)
Zkyidmessage.Subject := '这是邮件的主题'; //设置邮件主题
Zkyidmessage.body.text := '这是邮件的内容';//设置邮件内容


//------------------------------------
//群发邮件:
//ZkyIdMessage.Recipients.add.Text:='<收件人邮箱>';
//ZkyIdMessage.BCCList.Add.Address := '<抄送人邮箱>' ;
//ZkyIdMessage.CCList.Add.Address := '<密送人邮箱>' ;
//发送给多人的时候,多打几遍语句。
//------------------------------------


try //发邮件
ZkyIdSMTP.Send(ZkyIdMessage);
Showmessage('邮件发送成功!');
except
Showmessage('邮件发送失败!');
end;


end;

————————————————
版权声明:本文为CSDN博主「楠珂伊梦千里月」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhouky1993/article/details/60953892


[quote=引用 2 楼 老大i 的回复:]
https://blog.csdn.net/zhouky1993/article/details/60953892


必须把登录密码也写进去吗?不登录能发送吗?[/quote]
当然要的,用于登录,并且用这个号发邮件(没登录账号用什么发呢)
回复
ooolinux 2019-09-16

procedure TForm1.btnSendMailClick(Sender: TObject);
begin
  //------------------------------------
  //设置登录信息
  //ZkyIdSMTP为控件名,
  //可自己更改为与上面的一样的名字。  
  //格式为:
  //<TIdSMIP控件名>.<属性>:=<自己的信息>  
  //------------------------------------
  ZkyIdSMTP.AuthenticationType := atLogin;//设置登录类型,一般不变动  
  ZkyIdSMTP.Host := 'mail.qq.com';   //设置SMTP地址
  ZkyIdSMTP.UserId := '1111@qq.com';   //设置登录账号
  ZkyIdSMTP.Password := '1111';      //设置登录密码
  ZkyIdSMTP.Port := 25;                   //设置端口,必须要整形型
  try
    ZkyIdSMTP.Connect;                    //连接服务器
  except                               //如果连接失败,提示并退出程序  
    ShowMessage('连接服务器失败');  
    Exit;
  end;
  ShowMessage('成功连接服务器。'+#10#13+'点击确认后准备发邮件。');  
  
  
  //------------------------------------
  //配置发送的内容,格式为:
  //<TIdMessage的控件名> . <属性>:=  
  //------------------------------------
  ZkyIdMessage.From.name := '1111@qq.com';//设置发件人姓名
  ZkyIdmessage.Recipients.EMailAddresses:='2222@qq.com';//设置收件人邮箱地址(此为单发邮件的语句,群发时需去掉)
  Zkyidmessage.Subject := '这是邮件的主题'; //设置邮件主题
  Zkyidmessage.body.text := '这是邮件的内容';//设置邮件内容  
  
  
  //------------------------------------  
  //群发邮件:
  //ZkyIdMessage.Recipients.add.Text:='<收件人邮箱>';
  //ZkyIdMessage.BCCList.Add.Address := '<抄送人邮箱>' ;
  //ZkyIdMessage.CCList.Add.Address := '<密送人邮箱>' ;
  //发送给多人的时候,多打几遍语句。
  //------------------------------------
  
  
  try  //发邮件
    ZkyIdSMTP.Send(ZkyIdMessage);
    Showmessage('邮件发送成功!');  
  except
    Showmessage('邮件发送失败!');
  end;
 
 
end;

————————————————
版权声明:本文为CSDN博主「楠珂伊梦千里月」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhouky1993/article/details/60953892
引用 2 楼 老大i 的回复:
https://blog.csdn.net/zhouky1993/article/details/60953892
必须把登录密码也写进去吗?不登录能发送吗?
回复
ooolinux 2019-09-16
引用 5 楼 早打大打打核战争 的回复:
把TIdSMTP->Host设置为收件人的邮件服务器的主机即可,可以用Indy的DNS解析组件获取
我找了一个老帖子的代码,不过差别有点大: https://bbs.csdn.net/topics/20453816 老概有成功的代码吗?能直接发到qq邮箱或者163邮箱都可以的。
回复
发帖
网络通信/分布式开发
创建于2007-08-02

1573

社区成员

Delphi 网络通信/分布式开发
申请成为版主
帖子事件
创建了帖子
2019-09-16 12:39
社区公告
暂无公告