我想从我的Delphi程序发送一封简单的电子邮件。更具体地说,如果我的程序遇到异常,我想提供通过用户提供的任何指定电子邮件地址发送错误的选项,当然能够为任何情况发送电子邮件本身都是有益的。能够发送附件是一种奖励,但不是必需的。
我尝试了许多在线发现的例子,但大多数似乎没有用。其中一些需要参数,如SMTP服务器等,但如果我的用户可以自由输入自己的电子邮件地址,我的程序如何确定?另外我没有在我的电脑上安装默认的电子邮件客户端,所以如果我无法从我的程序发送电子邮件,那么我相信使用我的程序的任何人都会遇到同样的问题。
基本上我要问的是:
我希望我的帖子很容易理解。
由于
答案 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)
我将从可能的解决方案开始,然后解释为什么替代方案充其量只会出现问题:
首先谈谈SMTP协议本身,因为其他一切都基于此:
从用户的地址发送电子邮件时的第一个选项是使用本地安装的客户端和自动化,因此它们会显示一个现成的Outlook(或Firefox或其他)电子邮件表单,只需要单击“发送”。但是你说你希望你的解决方案即使没有安装本地电子邮件也能工作,所以这不是一个选择。
您提到希望实现此目的,要求用户仅她的电子邮件地址,没有服务器详细信息,我假设没有用户名和密码。 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;