发送电子邮件的最简单方法是什么?

时间:2011-05-06 13:57:48

标签: delphi email

我想从我的Delphi程序发送一封简单的电子邮件。更具体地说,如果我的程序遇到异常,我想提供通过用户提供的任何指定电子邮件地址发送错误的选项,当然能够为任何情况发送电子邮件本身都是有益的。能够发送附件是一种奖励,但不是必需的。

我尝试了许多在线发现的例子,但大多数似乎没有用。其中一些需要参数,如SMTP服务器等,但如果我的用户可以自由输入自己的电子邮件地址,我的程序如何确定?另外我没有在我的电脑上安装默认的电子邮件客户端,所以如果我无法从我的程序发送电子邮件,那么我相信使用我的程序的任何人都会遇到同样的问题。

基本上我要问的是:

  • 如何发送电子邮件
  • 附件不是必需的,但会有其优点
  • 如何处理SMTP服务器,端口号等内容?
  • 如果未安装默认电子邮件客户端,如何处理此

我希望我的帖子很容易理解。

由于

5 个答案:

答案 0 :(得分:5)

如果您希望程序在发生异常时向您发送电子邮件,则应该查看MadExcept。它会自动为您完成,并包含完整的堆栈跟踪和其他有用的调试信息。

答案 1 :(得分:2)

JEDI Code Library中的单元JclMapi包含两个使用已安装的MAPI客户端的简单方法:

function JclSimpleSendMail(const Recipient, Name, Subject, Body: AnsiString;
  const Attachment: TFileName = ''; ShowDialog: Boolean = True; ParentWND: THandle = 0;
  const ProfileName: AnsiString = ''; const Password: AnsiString = ''): Boolean;

function JclSimpleBringUpSendMailDialog(const Subject, Body: AnsiString;
  const Attachment: TFileName = ''; ParentWND: THandle = 0;
  const ProfileName: AnsiString = ''; const Password: AnsiString = ''): Boolean;

无需在Delphi中配置服务器等 - 将使用已安装客户端的设置。

但是,如果没有安装邮件客户端,则此简单解决方案不起作用。很抱歉回答得太快了。

另一个选择是提供一个公共网络服务器(我使用Google App Engine),它可以通过发送HTTP请求从Delphi应用程序用作电子邮件网关。这可以通过Indy来完成,并且由于具有Internet访问权限的客户端通常能够执行HTTP请求,因此不需要特殊配置,因为并不总是允许SMTP客户端通过公司防火墙。

madExcept库提供相同的传输方法(通过HTTP发送),因为它只需要服务器地址作为应用程序中定义的常量。

答案 2 :(得分:2)

我将从可能的解决方案开始,然后解释为什么替代方案充其量只会出现问题:

可能的解决方案

  • 不要从客户端计算机发送电子邮件,使用Web服务传递邮件。无论什么技术推动您的网站,它可以处理发布的表单,它可以发送电子邮件。只需将用户的问题发布到您的Web服务,并让您的Web服务使用电子邮件将其发送给您或将其保存到数据库。如果用户认为他已连接到互联网,他可能会这么说,因为他的浏览器正常工作,但只说HTTP正在运行:SMTP可能被公司防火墙或ISP阻止。这是我的首选解决方案。
  • 使用您的 SMTP服务器和您的凭据发送电子邮件。从用户的地址发送电子邮件非常不可靠。您可以将用户的电子邮件地址包含在“REPLY TO”标题中,或者只是将其放在邮件正文中。您可以使用Indy组件执行此操作,因为它是您的SMTP服务器和您的凭据,您知道所有详细信息。如前一篇文章中所述,这可能会失败,因为SMTP可能会被用户的防火墙或ISP的防火墙阻止。

关于SMTP

首先谈谈SMTP协议本身,因为其他一切都基于此:

  • SMTP是用于发送电子邮件的 协议。还有其他特定于实现的协议,但所有eMail服务器都需要实现SMTP。
  • SMTP是在垃圾邮件之前设计的。它允许任何计算机向任何服务器发送电子邮件。绝对不需要(理论上)发送电子邮件消息的身份验证,并且服务器的SMTP服务器地址作为MX记录存储在DNS中。
  • SMTP本身绝对无法对发件人进行身份验证,也没有尝试检查用户是否真的是“发件人”字段中的用户。

从用户的电子邮件地址

发送电子邮件有什么问题

从用户的地址发送电子邮件时的第一个选项是使用本地安装的客户端和自动化,因此它们会显示一个现成的Outlook(或Firefox或其他)电子邮件表单,只需要单击“发送”。但是你说你希望你的解决方案即使没有安装本地电子邮件也能工作,所以这不是一个选择。

您提到希望实现此目的,要求用户她的电子邮件地址,没有服务器详细信息,我假设没有用户名和密码。 SMTP协议实际上允许这样做,因为它没有内置机制来验证发件人。垃圾邮件发送者利用这一点,它被称为“欺骗发件人地址”。为了防止这两件事发生:

  • SMTP主机不再接受来自任何人的电子邮件,他们尝试以某种方式验证发送SMTP服务器。换句话说,您的 SMTP服务器将拒绝您发送给自己的虚假电子邮件!建议的解决方法是使用SMTP中继。但是......
  • SMTP中继不再向未知用户转发电子邮件! SMTP本身不提供任何身份验证机制,但通常的解决方法是首先阅读电子邮件(因为该部分 需要身份验证)才发送电子邮件。这是由您可能正在使用的发送SMTP组件自动完成的,但不过,这需要用户名和密码。

如果这还不够,请考虑另一种方式:您是否希望知道您的电子邮件地址的人能够通过您的电子邮件地址发送电子邮件? / p>

答案 3 :(得分:1)

如果您拥有并知道电子邮件主机的名称,请使用TidSMTP组件。部分indy客户。

然后用你的信息打电话给它填写

Email.QuickSend('mail.YourEmailHost.com','Title','Addressed To',
                'Where_the_email_looks_like_it_came_from@YourDomain.com','EmailText');

答案 4 :(得分:1)

我认为发送电子邮件最简单的方法是使用Windows协作数据对象(CDO)。另一种方法是使用Indy的组件,但我不喜欢它的巨大二进制文件大小。

在使用CDO之前,从c:\ windows \ system32 \ cdosys.dll导入类型库。以下示例显示如何使用CDO发送电子邮件:

uses CDO_TLB;

var M: IMessage;
    s: string;
begin
  M := CoMessage.Create;
  M.From := 'from-email@host.com';
  M.To_ := 'to-email@host.com';
  M.Subject := 'This is subject';
  M.TextBody := 'This is text body';

  s := 'http://schemas.microsoft.com/cdo/configuration/';
  with M.Configuration.Fields do begin
    Item[s + 'sendusing'].Value := cdoPostUsingPort;
    Item[s + 'smtpserver'].Value := 'smtp.host.com';
    Item[s + 'smtpauthenticate'].Value := cdoBasic;
    Item[s + 'sendusername'].Value := 'user_name';
    Item[s + 'sendpassword'].Value := 'password';
    Item[s + 'smtpserverport'].Value := 587;
    Item[s + 'smtpusessl'].Value := False;
    Item[s + 'smtpconnectiontimeout'].Value := 5;  // default is 30 seconds
    Update;
  end;

  try
    M.Send;
    // success
  except
    // fail
    on E: Exception do
      ShowMessage(E.Message);
  end;
end;