この記事の例では、Delphi7 で電子メール メッセージを大量に送信する方法について説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです。
この期間中、受験者全員に受験者情報と試験情報を電子メールで送信する必要があります。多くのデバッグを行った後、参考までに送信します。
一般的な考え方は次のとおりです。
1. LAN バージョンのメール サーバーをインストールし、サーバーがネットワーク外のユーザーに電子メールを送信できるように DNS を設定します。WinWebMail などの優れたソフトウェアが公式からダウンロードできます。 Webサイト;
2. 使用する必要があるコントロール: Indy10.0.15。Baidu 検索からダウンロードできます。
3. 送信するメールサーバーとアカウント情報を設定する
次のコードをコピーします: function setEmailInfo:integer; //戻り値 0: 電子メールの設定に失敗しました。 1: 電子メールの設定に成功しました。
変数
selectStr:文字列;
この結果:整数;
始める
この結果 := 0;
//アカウントを設定する
IdSMTP1.AuthType := atNone; // または atSASL;
IdSMTP1.Host := ホスト文字列;
IdSMTP1.ユーザー名 := ユーザー名文字列;
IdSMTP1.Password := passWordString;
試す
IdSMTP1.connect;
この結果 := 1;
IdSMTP1.Authenticate でない場合は、
始める
showmessage('電子メール アカウントの検証の送信に失敗しました! SMTP アカウントの設定を確認してください!');
この結果 := 0;
終わり
を除外する
showmessage('SMTP サーバーの接続に失敗しました! SMTP アカウントの設定とネットワークが正常かどうかを確認してください!');
この結果 := 0;
終わり
終わり;
結果 := この結果;
終わり;
4. 独立した機能としてメールでメッセージを送信しますが、送信時には遅延制御が必要です。
次のようにコードをコピーします。procedure sendEmailOnce(emailusername:string;
formAddress:string;receiptRecipientAddress:string;sendtoAdd:string;emailSubject:string);
始める
MsgKsbkxx.From.Name := emailusername //メール送信者の名前;
MsgKsbkxx.From.Address := formAddress //メール送信者アドレス;
MsgKsbkxx.ReceiptRecipient.Address := 受信者アドレス;
//返信アドレス。メール送信者のアドレスとは異なる場合があります
MsgKsbkxx.Recipients.EMailAddresses := sendtoAdd; //送信アドレス?
MsgKsbkxx.Sender.Address := formAddress //sendtoAdd; アドレスにメールを送信します。
MsgKsbkxx.Subject := emailSubject;
MsgKsbkxx.Body.Assign(emailMemo.Lines); //メールの内容
IdSMTP1.Send(MsgKsbkxx); //メール送信コマンド
終わり;
5. メールアドレスの正当性を単純に判断する
コードをコピーします。コードは次のとおりです。 // 文字列セパレータの表現に従って文字列 s を複数の文字列に分割し、rs 文字列リストに格納します。
プロシージャ SeparateTerms2(s:string;Separator:string;var rs:TStringList);
変数
AStr: 文字列;
idx: 整数;
ASubStr: 文字列;
始める
AStr := トリム;
while Pos(Separator, AStr) > 0 do
始める
idx := Pos(セパレータ, AStr);
ASubStr := Copy(AStr, 1, idx - 1);
rs.Add(ASubStr);
AStr := Copy(AStr, idx + 1, 長さ(AStr));
終わり;
if AStr+'a' <> 'a' then rs.Add(AStr) // 文字列が残っている場合は、文字列リストに格納します。
終わり;
//文字列がメールアドレスの標準を満たしているかどうかを判断します
//修正: OK を返す、エラーを返す
関数 emailAddressYesOrNo (emailAddress:String):string;
変数
getStrings:TStringList;
getYesOrNo:文字列;
始める
getYesOrNo := 'エラー';
getStrings := TStringList.Create;
SeparateTerms2(emailAddress,'@',getStrings);
getStrings.Count=2 の場合、
始める
getStrings.Clear;
SeparateTerms2(emailAddress,'.',getStrings);
getStrings.Count>1 の場合 getYesOrNo := 'ok';
終わり;
getStrings.Free;
結果 := getYesOrNo;
終わり;
6. メールを一括送信する
次のようにコードをコピーします。
変数
AccordAmount、i、j、タグ:整数;
emailusername,formAddress,sendtoAdd,emailSubject,receiptRecipientAddress,selectStr:string;
始める
//データテーブルに電子メールで送信する必要のあるデータがあるかどうかを判断し、存在する場合は送信します
Bmb.RecordCount >0 の場合
AccordAmount := Bmb.RecordCount
それ以外
出口;
//
//通常はデータ テーブルまたは INI ファイルに保存されているアカウント情報を取得します
emailusername := userNameString //メールの送信者;
formAddress := fromAddressString //送信メールアドレス;
RecipeRecipientAddress := RecipeRecipientAddressString // 返信メールアドレス;
emailSubject := emailSubjectString //メールの件名;
//
tag := 1; //フラグビット:送信エラー時に停止
i:=1; //送信されたメールの総数
j:=0; //進行状況バーを徐々に進めるために処理されるレコードの数。
list1.Clear //メールが正常に送信された生徒に関する情報を表示します。
//設定したメールボックスに接続可能かを判定し、戻り値が1の場合はメール内容と関連設定を取得して送信します。
setEmailInfo = 1 の場合
始める
Pb.ブロックサイズ := 1;
Pb.Max := AccordAmount ;
Formsjtj.リフレッシュ;
Bmb.最初;
試す
while (tBmb.Eof ではない) do
始める
//電子メール アドレスが空であり、電子メールの仕様を満たしているかどうかを判断します。両方の条件が満たされている場合は、そのアドレスに電子メールを送信します。
if Bmb.FieldByName('s_emailAddress').AsString+'a' <> 'a' then
始める
// 送信されたメールの内容を取得する
emailMemo.Clear;
...................................
//メール情報を設定します。メール送信時にエラーが発生した場合は、そのまま終了します。
tag=0 の場合は終了します。
//メールを送信する
sendtoAdd := trim(Bmb.FieldByName('s_emailAddress').AsString) //...メールボックスに送信する必要があります
if emailAddressYesOrNo(sendtoAdd)= 'ok' then //電子メールの形式が正しいかどうかを確認します
始める
sendEmailOnce(emailusername,formAddress,receiptRecipientAddress,sendtoAdd,emailSubject); //メールを送信する
i := i+1; // カウンタプラス 1;
list1.Items.Add(......); //メール送信に成功した候補者情報をリストに入れる
終わり;
//
終わり;
//50 通のメールが送信されるたびに 2 秒間停止します。
if (i mod 50) = 0 then sleep(2000);
dm_sjtj.ListBmb.next;
Application.ProcessMessages; // ループ内でプロセス情報を処理します。
//進行状況インジケーターを更新
j := j+1;
PB.進行状況:=j;
PB.ステップイット;
PB.リフレッシュ;
終わり;
ついに
タグ:= 0;
IdSMTP1.切断;
終わり;
終わり;
showmessage('送信総数'+intToStr(i-1)+' メール。');
終わり;
7. 注意すべき点
①スパムメールは国によって許可されていません
② バルクメールはほとんどのメールプロバイダーによって制御されているため、2 つのメールの間に遅延が発生することがよくあります。独自のメールサーバーをセットアップすることをお勧めします。
③ Indy コントロールには atNone と atSASL の 2 つのモードしかないため、メールサーバーを設定した後、検証を必要としない IP アドレスとアカウントを設定する必要があります。
④ 社内メールアドレスでは返信メールを取得できないため、返信アドレスと送信アドレスが異なる場合が多いです。現在発生している問題の 1 つは、ブラウザーでメールを開くと返信できないことですが、Foxmail ではメールを受信すると返信が得られることです。これには注意が必要です。
この記事が皆さんの Delphi プログラミングに役立つことを願っています。