如何在使用 ShellExecute 创建的电子邮件消息中包含换行符?

How do I include line breaks in an e-mail message created with ShellExecute?

我可以使用 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;

不同的邮件应用程序支持不同的 mailto 协议。并非所有应用程序都允许同时指定多个参数等。因此使用 mailto 发送电子邮件在不同的机器上会非常参差不齐。

也就是说,您实际上是在调用一个 URL,只是一个具有 mailto: 协议方案的。因此,您需要对保留字符进行 url 编码,例如空格和换行符。您可能不想使用 Indy 发送邮件,但您可以使用它来编码您的参数值,至少:

uses
  ..., IdURI;

iParam := 'mailto:' + iEmail + '?subject=' + TIdURI.ParamsEncode(iSubject) + '&Body=' + TIdURI.ParamsEncode(iBody);