gpt4 book ai didi

delphi - Indy 向具有 UTF-8 字符的接收者发送电子邮件

转载 作者:行者123 更新时间:2023-12-03 15:30:29 25 4
gpt4 key购买 nike

我正在尝试发送包含 TIdSMTP 的电子邮件Indy 10 中的组件和我的接收器列表中包含 Unicode 字符(例如 Роман Безяк <roman_bezjak@yahoo.com> )。但是当邮件发送时,在 To我看到电子邮件标题:"?????????" <roman_bezjak@yahoo.com> 。谁能帮我解决这个编码问题?

这就是我的程序:

procedure TMailClientForm.btnSendEmailClick(Sender: TObject);
var
mes : TIdMessage;
i : Integer;
begin
with SMTPClient do begin
Host := serverHost;
Port := SmtpServerPort;
Username := myUserName;
Password := myPassword;
UseTLS := utUseImplicitTLS;
end;
try
mes := tidmessage.Create(nil);
try
with mes do begin
ContentType := 'text/plain';
ClearBody;
Body.Text := memoEmailBody.Text;
Subject := txtEmailSubject.text;
From.Address := SMTPClient.Username;
From.Name := myName; // cyrillic symbols!
Recipients.Add.Address := myReceiver; // cyrillic symbols! like 'Роман Безяк <roman_bezjak@yahoo.com>'
CharSet := 'utf-8';
end;
if fileNames.Count > 0 then // attachments - the files are in the stringlist fileNames
mes.ContentType := 'multipart/mixed';
for i := 0 to fileNames.count - 1 do begin
if FileExists(fileNames[i]) then
TIdAttachmentFile.Create(mes.MessageParts, fileNames[i]);
end;
try
try
try
SMTPClient.Connect;
except
on e : Exception do begin
MessageDlg('ERROR=' + SMTPClient.LastCmdResult.Text.Text, mtError, [mbOK], 0);
Exit;
end;
end;
try
SMTPClient.Send(mes);
except
on e : Exception do begin
MessageDlg('ERROR=' + SMTPClient.LastCmdResult.Text.Text, mtError, [mbOK], 0);
Exit;
end;
end;
finally
if SMTPClient.Connected then
SMTPClient.Disconnect;
end;
fileNames.clear;
except
on e:exception do begin
MessageDlg(e.message, mtError, [mbOK], 0);
end;
end;
finally
mes.Free;
end;
except
on e:exception do begin
MessageDlg(e.message, mtError, [mbOK], 0);
end;
end;
end;

最佳答案

Recipients.Add.Address := myReceiver; // cyrillic symbols! like 'Роман Безяк <roman_bezjak@yahoo.com>'

如果 myReceiver 同时包含姓名和电子邮件地址,则需要使用 TIdEMailAddressItem.Text 属性而不是 TIdEMailAddressItem.Address 属性:

Recipients.Add.Text := myReceiver; // cyrillic symbols! like 'Роман Безяк <roman_bezjak@yahoo.com>'
// Name becomes 'Роман Безяк'
// Address becomes 'roman_bezjak@yahoo.com'...

TIdEmailAddressItem.Text 属性设置方法会解析输入字符串,并将其相应地拆分为 TIdEmailAddressItem.NameTIdEmailAddressItem.Address 属性。

TIdEmailAddressItem.Address 属性根本没有 setter 方法,因此您分配的任何内容都会按原样使用。

对电子邮件进行编码时,TIdEmailAddressItem.Name 值将按照 RFC 2047 进行 MIME 编码。如果存在任何非 ASCII 字符。由于假设电子邮件地址仅包含 ASCII 字符(Unicode 电子邮件地址确实存在,但尚未常用),TIdEmailAddressItem.Address 值不会进行 MIME 编码。电子邮件 header 必须采用 ASCII 格式,因此您会看到 Роман Безяк 变成 ????????? 因为您将其粘贴在 TIdEmailAddressItem.Address 属性,它会按原样转换为 ASCII(其中非 ASCII 字符变为 ?),而无需进行 MIME 编码。

因此,通过将名称地址分开,您应该会看到Роман Безяк得到正确处理。

关于delphi - Indy 向具有 UTF-8 字符的接收者发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28717150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com