我可以使用ShellExecute成功发送电子邮件。收件人地址是正确的,发件人地址是正确的,主题是正确的。电子邮件的正文是正确的,除了根本没有换行符,所有内容都显示为单个段落,没有换行符。我的默认电子邮件客户端是Windows 8.1邮件。
我的问题是,可以使用ShellExecute以保留换行符吗?我不打算直接发送电子邮件给Indy。我需要做的就是向默认的电子邮件客户端发送电子邮件并正确格式化。
procedure TForm1.Email1Click(Sender: TObject);
var
iGridTableItem: TcxCustomGridTableItem;
iName, iDate, iEmail, iSubject, iBody, iParam: string;
begin
iGridTableItem := cxGrid1DBTableView1.DataController.
GetItemByFieldName('EMail');
if iGridTableItem.EditValue <> null then
iEmail := iGridTableItem.EditValue;
iGridTableItem := cxGrid1DBTableView1.DataController.
GetItemByFieldName('Name');
if iGridTableItem.EditValue <> null then
iName := iGridTableItem.EditValue;
iGridTableItem := cxGrid1DBTableView1.DataController.
GetItemByFieldName('Date');
if iGridTableItem.EditValue <> null then
iDate := DateToStr(iGridTableItem.EditValue);
iSubject := 'ImageEn EBook';
iBody := 'Dear Mr. ' + iName + ',' + sLineBreak + sLineBreak +
'PayPal has advised me that you purchased xxxxx on ' + iDate +
'.' + ' Thank-you for your purchase.' + sLineBreak + sLineBreak + 'You may ' +
'download the xxx at' + sLineBreak +
'http://www.xxxxx.xxx/xxx/EBook/xxx101.zip' + sLineBreak +
'Best regards,' + sLineBreak + 'William Miller' + sLineBreak +
'Adirondack Software and Graphics ' + sLineBreak + 'Email: xxx@xxxxxxxx.xxx'
iParam := 'mailto:' + iEmail + '?subject=' + iSubject + '&Body=' + iBody;
ShellExecute(Form1.Handle, 'open', PChar(iParam), nil, nil, SW_SHOWNORMAL);
end;
答案 0 :(得分:6)
不同的邮件应用程序支持mailto
协议。并非所有应用都允许同时指定多个参数等。因此,使用mailto
发送电子邮件将在不同的计算机上非常不稳定。
话虽这么说,你实际上是在调用一个URL,只有一个mailto:
协议方案。因此,您需要对保留字符进行url编码,例如空格和换行符。您可能不想使用Indy发送邮件,但您可以使用它来编码参数值,至少:
uses
..., IdURI;
iParam := 'mailto:' + iEmail + '?subject=' + TIdURI.ParamsEncode(iSubject) + '&Body=' + TIdURI.ParamsEncode(iBody);