4

どうか、私はこの「問題」を12時間以上解決しようとしています...そして、ほとんど夢中になっています!DelphiとSynapse( http://synapse.ararat.cz )を使用して、一度に複数の受信者(宛先)に同じ電子メールを送信することは不可能だと思います。誰かが私が間違っていると言ってください:)

さて、私はsEmail変数を持っています。ここでは、次のように、電子メールをポイントセミコロン(;)で区切って取得します。

sEmails := 'email1@test.com.br;email2@teste.com.br';

これが私が使用しているコードです:

dSMTP := TSMTPSend.Create;
dSMsg := TMimeMess.Create;
Try 
  With dSMsg, Header Do
  Begin 
    Date := Now;
    Priority := mp_Normal;
    CharsetCode := ISO_8859_1;
    From := 'email@gmail.com';
    ToList.Delimiter := ';';
    ToList.DelimitedText := sEmails;
    Subject := 'Message Subject';
    dPart := AddPartMultipart('mixed', nil);
    AddPartHTML('<h1>Message Text</h1>', dPart);
    EncodeMessage;
  end;
  With dSMTP Do
  Begin
    TargetHost := 'smtp.gmail.com';
    TargetPort := '587';
    AutoTLS := True;
    UserName := 'email@gmail.com';
    Password := 'password';
    Try
      If Login Then
      Begin
        If MailFrom('email@gmail.com', Length('email@gmail.com')) Then
          If MailTo(sEmails) Then MailData(dSMsg.Lines);
        Logout;
      end;
    Except
      On E: Exception Do ShowMessage(E.Message);
    end;
  end;
Finally
  dSMsg.Free;
  dSMTP.Free;
end;

私はすでにこのように試しました:

If Login Then
Begin
  If MailFrom('email@gmail.com', Length('email@gmail.com')) Then
    If MailTo(dSMsg.Header.ToList[0]) Then MailData(dSMsg.Lines);
  Logout;
end;

...しかし、最初の電子メールのみが送信されました:(残りの電子メールをHeader.CCListに追加した場合でも。

別のテストでは、同じ問題で、ポイントセミコロンをコンマ(、)に変更しようとしました...

どうか、誰かが私が間違っていることを教えてもらえますか?

ありがとうございました!

4

2 に答える 2

4

のドキュメントにSendToよると:

「Maildata」(SMTPヘッダーのない電子メールのテキスト!)を「MailFrom」電子メールアドレスから「Subject」付きの「MailTo」電子メールアドレスに送信します。(複数のレシーバーが必要な場合は、アドレスをコンマで区切ります)。

したがって、このようなものは機能するはずです(ただし、明らかに機能しないため、以下を参照してください)。

sEMails := 'joe@gmail.com,fred@gmail.com,mary@gmail.com';
....

if MailTo(sEMails) then 
  MailData(dSMsg.Lines);

コンポーネントに複数のメールアドレスを正しく設定する方法がないようSMTPSendです。それぞれを個別に送信する必要があります。dSMsg.Header.ToListただし、コードの前半でアドレスをすでに追加しているため、自分でアドレスを解析するよりも簡単に行うことができます。

// Declare i as an integer variable, and post all the send to addresses
// one at a time to the MailTo() function
for i := 0 to dSMsg.Header.ToList.Count - 1 do
   MailTo(dMsg.Header.ToList[i]);

// Now send the mail body
MailData(dSMsg.Lines)

IMO、Synapse SMTPサポートは低レベルであるため、何らかの理由で特に低レベルのサポートが必要な場合を除いて、簡単に使用することはできません。Indy(Delphiがプリインストールされています)とICSはどちらも、はるかに簡単な実装を提供しSMTP、テキストとHTMLの両方の電子メールとMIMEエンコードされた添付ファイルをサポートし、Gmailの操作に必要なTLSをサポートします。

于 2013-03-24T21:51:30.027 に答える
0

これは、私が複数の受信者に送信する方法のコードのサンプルです。まず、TMimeMess(この例ではvar Mime)を設定する必要があります。

uses
  mimemess, smtpsend, mimepart, synautil; //not sure if this list is complete

var 
  SMTP: TSMTPSend;
  s, t: string;
  Mime: TMimeMess;

...

{ log in to SMTP server }
if SMTP.Login then
begin
  { set sender address and total send size }
  if SMTP.MailFrom(synautil.GetEmailAddr({your from address}), 
    Length(Mime.Lines.Text)) then
  begin
    s := {your comma separated e-mail string};

    { add all recipient addresses }
    repeat
      { split addresses by comma and send to each }
      t := synautil.GetEmailAddr(Trim(FetchEx(s, ',', '"')));
      if (t <> '') then
        Result := SMTP.MailTo(t);

      if not Result then
      begin
        //handle failure if necessary here

        Break;
      end;
    until s = '';

    { now send e-mail content }
    if Result then
      Result := SMTP.MailData(Mime.Lines);
  end;

  { and log out }
  SMTP.Logout;
于 2013-03-25T14:39:26.293 に答える