DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: bluewind23
今日帖子: 0
在线用户: 9
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 michael20130904 (delphi菜鸟一枚) ▲△△△△ -
普通会员
2024/6/18 19:41:05
标题:
邮件功能,一直报错,在线求大佬 浏览:1079
加入我的收藏
楼主: procedure TForm1.btn2Click(Sender: TObject);
var
  SMTP: TIdSMTP;
  Msg: TIdMessage;
begin
  // 创建并配置 SMTP 组件
  SMTP := TIdSMTP.Create(nil);
  try
    SMTP.Host := 'smtp.qq.com'; // 设置 SMTP 服务器地址
    SMTP.Port := 456; // 设置 SMTP 服务器端口号
    SMTP.Username := '123456789@qq.com'; // 设置发件人邮箱账号
    SMTP.Password := 'fefefefewasdz125'; // 设置发件人邮箱密码

    // 创建邮件消息
    Msg := TIdMessage.Create(nil);
    try
      Msg.From.Address := '123456789@qq.com'; // 设置发件人邮箱
      Msg.Recipients.Add.Address := '123456@qq.com'; // 设置收件人邮箱
      Msg.Subject := '测试'; // 设置邮件主题
      Msg.Body.Text := '测试'; // 设置邮件正文

      // 发送邮件
      SMTP.Connect;
      try
      SMTP.ConnectTimeout := 10000; // 设置连接超时时间为10秒(以毫秒为单位)
        SMTP.Send(Msg);
      finally
        SMTP.Disconnect;
      end;
    finally
      Msg.Free;
    end;
  finally
    SMTP.Free;
  end;
一直报错
报错截图如下
此帖子包含附件:
PNG 图像
大小:5.4K
----------------------------------------------
-
作者:
男 tms2021 (TMS2021) ▲▲△△△ -
普通会员
2024/6/18 19:51:17
1楼: QQ邮箱smtp功能是不是要单独开通的吧
----------------------------------------------
欢迎加入Delphi的QQ群:462884906
作者:
男 michael20130904 (delphi菜鸟一枚) ▲△△△△ -
普通会员
2024/6/18 20:27:40
2楼: 已经开通了啊,
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/18 21:49:45
3楼: 1. 你先拿一个成熟的右键客户端去验证一下服务器那边是否已经开通可以使用。

2. 服务器那边开通的是普通的 SMTP 还是加密的?加密的,可能需要加上 SSL 还有端口号可能都不一样了。

3. 确保你使用的端口号是正确的。
----------------------------------------------
-
作者:
男 bighawk (Hawk) ★☆☆☆☆ -
盒子活跃会员
2024/6/18 22:04:34
4楼: 我记得 QQ 的 SMTP 是 ssl 加密了的,你去查一下它的说明文档吧,上面应该写明了的
----------------------------------------------
-
作者:
男 michael20130904 (delphi菜鸟一枚) ▲△△△△ -
普通会员
2024/6/18 22:46:09
5楼: 以前C#的写的能用,刚才打开发现也不能发送了,我擦
有没有大佬,分享一个QQ邮箱的发件代码,只要能发送就行,不需要加密之类的
----------------------------------------------
-
作者:
男 michael20130904 (delphi菜鸟一枚) ▲△△△△ -
普通会员
2024/6/18 22:51:27
7楼: QQ邮箱服务器,确实更新了要求
此帖子包含附件:
PNG 图像
大小:149.5K
----------------------------------------------
-
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2024/6/18 23:31:19
8楼: 搜索
github.com/search?q=smtp+language%3APascal+&type=repositories&p=1
结果 
https://github.com/cristianss156/emailSMTP/blob/master/test.pas
关键代码   低版本也适用这个代码才对.
  handler : TidSSLIOHandlerSocketOpenSSL;
      handler := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
      SMTP.IOHandler := handler;
      SMTP.UseTLS := utUseImplicitTLS;
      SMTP.Connect;
      SMTP.Send(Msg);

github.com/msAlbuquerque/Email-Delphi
带ssl dll的.
github.com/geoffsmith82/GmailAuthSMTP
github.com/CleverComponents/Clever-Mail-Server   cis?
github.com/CleverComponents/MailClient-AntiVirusSMTP 组件还支持 OAUTH2.0
github.com/CHERTS/MGSoft 要买   TMGSMTP - 用于发送 SMTP 邮件的 VCL 组件(支持 TLS 和 SSL);
github.com/jamesjara/email-camp-smpt-gmail-server-mail-mass
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/18 23:36:55
9楼: 7 楼,你贴的那个,说明 QQ 要求必须使用 SSL

对于 Indy 控件来说,使用 SSL 本身并不难。下载 SSL 的 DLL 到本地,加上 Indy 的那个啥控件。搞定。
----------------------------------------------
-
作者:
男 delphiteacher (delphiteacher) ▲▲▲▲▲ -
普通会员
2024/6/19 8:38:42
10楼: 端口错了吧。
----------------------------------------------
欢迎加入OrangeUI的app开发阵营:http://www.orangeui.cn/,联系QQ452330643
作者:
男 michael20130904 (delphi菜鸟一枚) ▲△△△△ -
普通会员
2024/6/19 10:08:00
11楼: @pcplayer ,大佬,那个SSL的DLL在哪,代码能分享下吗,小弟邮箱:280971847@qq.com
----------
7 楼,你贴的那个,说明 QQ 要求必须使用 SSL

对于 Indy 控件来说,使用 SSL 本身并不难。下载 SSL 的 DLL 到本地,加上 Indy 的那个啥控件。搞定。
----------------------------------------------
-
作者:
男 sxz008 (有个人) ★☆☆☆☆ -
普通会员
2024/6/19 11:21:16
12楼: 用 邮箱登录密码可能不行就用授权码。
procedure TForm1.Button2Click(Sender: TObject);
var
  I: Integer;
begin
  IdSMTP1.Host := 'smtp.qq.com'; // 邮件发送服务器
  try
    IdSMTP1.Connect;
  except
    ShowMessage('连接到邮箱服务器失败!');
    Exit;
  end;
  IdSMTP1.AuthType := satDefault; // 服务器需验证
  IdSMTP1.Username := '99999999'; // 邮箱登录帐号
  IdSMTP1.Password := '**********'; // 邮箱登录密码 或是  授权码
  try
    IdSMTP1.Authenticate
  except
    ShowMessage('登录到邮箱服务器失败!');
    IdSMTP1.Disconnect;
    Exit;
  end;
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/19 16:11:49
13楼: 11 楼,Indy 使用的 SSL 的 DLL 你去网上搜,我也是网上搜的。
----------------------------------------------
-
作者:
男 michael20130904 (delphi菜鸟一枚) ▲△△△△ -
普通会员
2024/6/19 16:54:34
14楼: 现在是这样
此帖子包含附件:
PNG 图像
大小:107.4K
----------------------------------------------
-
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2024/6/19 17:06:58
15楼: 瞎了?看不到我发的代码?
怕不是用插件把我的回复过滤了?
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/19 17:11:45
16楼: 确实,8 楼已经提供了完整代码,以及 SSL 的下载地址
----------------------------------------------
-
作者:
男 michael20130904 (delphi菜鸟一枚) ▲△△△△ -
普通会员
2024/6/19 20:33:30
17楼: keymark (嬲)大哥,不会操作
SSL我下载了,还在研究怎么使用,大哥,能提供一份代码,发到我邮箱吗?
280971847@qq.com
----------------------------------------------
-
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2024/6/19 20:53:44
18楼: 我电脑中病毒了 还是不传文件了吧.
你自己找找吧.
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/19 22:51:43
19楼: 有啥不会操作的。网上很多讲 Indy 如何用 SSL 的。

其实就是把 8 楼里面提到的 TIdSSLIOHandler 拖到和 TIdSMTP 的地方,然后设置 TIdSTMP 的 IOHandler

运行时把 SSL 对于的 DLL 放到文件夹底下。
----------------------------------------------
-
作者:
男 michael20130904 (delphi菜鸟一枚) ▲△△△△ -
普通会员
2024/6/19 23:30:52
20楼:   有啥不会操作的。网上很多讲 Indy 如何用 SSL 的。

其实就是把 8 楼里面提到的 TIdSSLIOHandler 拖到和 TIdSMTP 的地方,然后设置 TIdSTMP 的 IOHandler

运行时把 SSL 对于的 DLL 放到文件夹底下。
----------
@pcplayer  ,试过了,好多报错的,头都大了,大佬们,能否写一份QQ邮箱发件的代码,发到邮箱里面啊,SSL.DLL我有
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/20 0:31:51
21楼: 就想要现成代码。

只有自己调试过,才能学到东西。

好多报错,为啥不去看报错的是什么,根据报错去查?如果看不懂,为啥不把报错贴到这里来?
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/20 0:38:01
22楼: https://blog.csdn.net/pcplayer/article/details/89434464
----------------------------------------------
-
作者:
男 michael20130904 (delphi菜鸟一枚) ▲△△△△ -
普通会员
2024/6/20 0:54:30
23楼: @pcplayer 
代码如下,问题如下
此帖子包含附件:
PNG 图像
大小:165.5K
----------------------------------------------
-
作者:
男 744840146 (744840146) ▲▲▲▲▲ -
普通会员
2024/6/20 8:47:32
24楼:
var  
  gIdSMTP: TIdSMTP;
  gIdssl: TIdSSLIOHandlerSocketOpenSSL;
  gIdSASL: TIdSASLLogin;
  gIdUpp: TIdUserPassProvider;
function ApiEmail(const aTo, aTitle, aBody, aAttah: string): boolean;
var
  sContent: string;
  ts: TStrings;
  i: Integer;
  idm: TIdMessage;
begin
  if gIdSMTP = nil then
  begin
    gIdSMTP := TIdSMTP.Create(nil);
    gIdssl := TIdSSLIOHandlerSocketOpenSSL.Create(gIdSMTP);
    gIdssl.SSLOptions.SSLVersions := [sslvSSLv23];
    gIdSMTP.IOHandler := gIdssl;
    gIdSMTP.UseTLS := utUseExplicitTLS;
    gIdSASL := TIdSASLLogin.Create(gIdSMTP);
    gIdUpp := TIdUserPassProvider.Create(gIdSMTP);
    gIdUpp.Username := AppEmailUser;
    gIdUpp.Password := AppEmailPwd;
    gIdSASL.UserPassProvider := gIdUpp;

    gIdSMTP.Host := AppEmailHost;
    gIdSMTP.port :=AppEmailPort;

    gIdSMTP.Username :=AppEmailUser;
    gIdSMTP.AuthType := satSASL;
    gIdSMTP.SASLMechanisms.Add.SASL := gIdSASL;
    try
      gIdSMTP.Connect;
    except
      Result := false;
      Exit;
    end;
  end;

  idm := TIdMessage.Create;
  with idm, ts, gIdSMTP do
  try
    //附件文件处理
    CommaText := aAttah;
    From.Address := AppEmailUser;
    Recipients.EMailAddresses := aTo;
    Subject := aTitle;
    //发送附件
    if ts.count = 0 then
    begin
      Body.Text := aBody;
      ContentType := 'text/html;charset=utf-8';
    end
    else
    begin
      with TIdText.Create(MessageParts, nil) do
      begin
        Body.Text := aBody;
        ContentType := 'text/html;charset=utf-8';
      end;
      for i := 0 to ts.count - 1 do
        with TIdAttachmentFile.Create(MessageParts, ts.Strings[i]) do
        begin
          FileName := ts.Strings[i];
        end;
    end;
    //发送
    try
      send(idm);
    except
      result := False;
    end;
  finally
    ts.Free;
    idm.Free;
  end;
end;  

传入接收人,标题,内容,附件文件全路径名称,多个文件以“,”号分割,程序目录下放libeay32.dll,ssleay32.dll两个文件
----------------------------------------------
-
作者:
男 744840146 (744840146) ▲▲▲▲▲ -
普通会员
2024/6/20 10:08:00
25楼: 上面的代码少了ts的初始化过程

修改为
  idm := TIdMessage.Create;
  ts := TStringList.Create;

这样就可以正常发送邮件了,还有一个要注意的地方,用这段代码发送邮件,端口是587
----------------------------------------------
-
作者:
男 michael20130904 (delphi菜鸟一枚) ▲△△△△ -
普通会员
2024/6/20 11:15:04
25楼: 问题已解决,感谢各位大佬的帮助
小弟感激不尽!!!
----------------------------------------------
-
作者:
男 wwzjx123 (ww zjx) ★☆☆☆☆ -
普通会员
2024/6/20 11:24:04
26楼: CIS更简单,也不要带dll,有详实的demos
----------------------------------------------
SPAM
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2024/6/20 12:32:25
27楼: @wwzjx123
cis 是用的微软的ssl吗?
如果是 新系统用 没啥问题 
老系统可能 挑api ..
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/20 13:44:24
28楼: Indy能用
但是不能解码邮件

Cis能用
但是不能使用proxy(一些Proxy会莫名其妙报上下文过期的错)

归根结底一句话 没有一个靠谱的
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2024/6/20 14:09:11
29楼: indy挂证书引用一个unit,另外还需要libeay32.dll和ssleay32.dll两个库,这两个库应该是openssl的最原始版,后来因为系统位数的问题,统一改名成了libcrypto-系统位数.dll。
代码的话上面已经有很多,伸手党的话也可以直接网上搜。
至于库文件,你也可以网上搜一下,现在很多python的加密库里都会带,也可以下载一个最初版本的openssl自己编译。
----------------------------------------------
--
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/20 15:50:10
30楼: Indy 当然能够解码邮件。
----------------------------------------------
-
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2024/6/21 13:58:50
31楼: 作为多年邮件玩家, 劝楼主一句, 不要在邮件上浪费时间, 邮件问题多, 是人都控制不了.
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/21 21:42:47
32楼: @pcplayer
什么编码我忘记了  不算是编码
就是分组还是啥的算法。之前搞hotmail遇到的。

功能是提取邮件的纯文本内容(包含html)

我当时搜了谷歌翻了一大圈 只找到一个  半成品的函数
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/21 22:52:32
33楼: 你找现成代码没找到而已。不需要现成代码,自己做也很简单,Indy 已经提供了对应的控件的。其实就是 MIME 解码。EMail 的内容,可能分多个段。比如附件,也是内容里面的一个段。

你如果直接打开 EMail 内容的原始数据来看,就是一大堆文本。每个段之间,都有相应的文字描述,这个是一个标准。解码也就是分析这些字符串内容。当然我们不用自己去分析,直接用 Indy 提供的控件去做。

Hotmail 的邮件,我是搞过的,就用 Indy。
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/21 23:05:01
34楼: 关于 MIME 协议,我刚刚搜了一下,这篇文章说得还算靠谱,但不够详细:

https://www.cnblogs.com/diegodu/p/4097202.html

你只要懂了 MIME 协议,才能用好 Indy 的控件,去解析这个协议。

比如,我自己写了一个记事本程序,自己用。我想要记事的内容,图文混排,并且文字还要有格式。还要能够保持附件(可能这次记的事是一个下载的文件)。我又不想复杂的内容分成好几个不同的文件来存放。打算所有内容都在一个文件里面。于是我采用了 MIME 也就是邮件的方式。我就是用 Indy 的控件来实现的。这个程序我自己用了 10 多年了。现在还在用,从里面搜 10 多年前记录的东西都还能找出来。
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/22 0:30:41
35楼: @pcplayer

Indy 有空间解析?indy只有个idmessage啊 。怎么解析呢?

不管啥邮件  只提取文本内容(纯文本或者html文本)
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/22 3:50:14
36楼: 一个邮件,其内容就是一个 MIME 的字符串。你可以拿其它邮件客户端收一个包含了图片和其它附件的邮件,保存邮件的原始内容到一个文本文件里面,打开来看。

除了邮件正文,其它的附件,图片,等等,都在这一个文件里面。中间有分隔符号的。如何分隔,使用 IdMessage 就能搞定。把这个文件的内容给 IdMessage,它就帮你解析出来了。你读它的属性就可以获得。比如以下代码就是把邮件里面的多个附件取出来:

procedure TFmMailView.AcSaveAttachExecute(Sender: TObject);
var
  i: Integer;
  AFileName: string;
begin
  //另存附件。
  AFileName := TFrameAttach(TPanel(PopupMenu1.PopupComponent).Parent).MyFileName;
  SaveDialog1.FileName := AFileName;
  if SaveDialog1.Execute(Application.Handle) then
  begin
    //找到附件,保存它
    for i := 0 to Pred(IdMessage1.MessageParts.Count) do
    begin
      if TIdAttachmentFile(IdMessage1.MessageParts.Items[i]).FileName = AFileName then
      begin
        TIdAttachmentFile(IdMessage1.MessageParts.Items[i]).SaveToFile(SaveDialog1.FileName);
        Break;
      end;
    end;
  end;
end;

其实你只要去看 IdMessage 提供了哪些方法和属性,就知道该怎么用它了。你不知道它能用,只因为你没有仔细去看它都提供了什么功能。比如,读邮件正文内容:

for i := 0 to Pred(IdMessage1.MessageParts.Count) do
  begin
    if (IdMessage1.MessageParts.Items[i] is TIdAttachmentFile) then
    begin
      PanelAttach.Visible := True;
      AFilePanel := TFrameAttach.ShowAttachInfo(PanelAttach, PopupMenu1, TIdAttachmentFile(IdMessage1.MessageParts.Items[i]).Filename,
        0);
      AFilePanel.OnFileNameClick := Self.DoOnFileNameClick;
    end
    else
    begin //body text
      if IdMessage1.MessageParts.Items[i] is TIdText then
      begin
        ShowTextInBrowser(TIdText(IdMessage1.MessageParts.Items[i]).Body.Text);
      end
    end;
  end;

  //来自京东的邮件,这个 Count 就是 0. 用以下代码可以处理。
  if IdMessage1.MessageParts.Count = 0 then
  begin
    S := IdMessage1.Body.Text;
    if S <> '' then
    begin
      ShowTextInBrowser(S);
    end;
  end;
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2024/6/22 8:23:04
37楼: @pcplayer
谢谢大佬提醒
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/22 18:45:49
38楼: 邮件内容解析,使用 Indy 的 IdMessage 比较容易去调试。方法很简单,你用 Foxmail 或者其它邮件工具去收一个邮件,收下来的邮件,你保存邮件的全部内容为一个文本文件,而不是仅仅保存邮件正文。

那个文本文件,你用记事本打开,就可以看到,它里面其实包含很多部分,比如头,头里面比如有发件人的地址,收件人地址。比如标题。比如内容。内容部分又分很多个部分,各部分之间有分隔符。等等。

而 IdMessage 又有 LoadFromStream 这样的方法,你可以用这个方法来加载这个文本文件。这样你写的代码就很好反复调试了。因为每次都加载同一个文本文件,有问题容易重复出现。调试最怕的是每次都不一样,有问题无法重现。而且输出的内容,你有那个邮件的文本作为对照。

当然,邮件的某个部分的内容,可能本身不是直接的文本,而是一个 BASE64 编码后的文本,或者其它的编码。拿到后,需要去解码。Indy 也都有邮件里面常用的编码的编码解码控件。拿到内容后根据编码方式调用对应控件来解码就好了。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行100.0977毫秒 RSS