이 기사의 예에서는 Delphi7에서 대량 이메일 메시지를 보내는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
이 기간 동안 시험에 응시하는 모든 응시자에게 응시자 정보와 시험 정보를 이메일로 보내야 합니다. 여러 번의 디버깅을 거친 후 참고용으로 보내드립니다.
일반적인 아이디어는 다음과 같습니다.
1. 메일 서버의 LAN 버전을 설치 하고 서버가 네트워크 외부의 사용자에게 이메일을 보낼 수 있도록 DNS를 설정합니다. 이 영역에는 WinWebMail과 같은 많은 소프트웨어가 있으며 공식 사이트에서 다운로드할 수 있습니다. 웹사이트;
2. 사용해야 하는 컨트롤: Indy10.0.15, Baidu 검색을 통해 다운로드할 수 있습니다.
3. 전송할 이메일 서버 및 계정 정보를 설정하세요
다음과 같이 코드를 복사합니다. function setEmailInfo:integer; //반환 값 0: 이메일 설정 실패 1: 이메일 설정 성공;
var
selectStr:문자열;
이 결과:정수;
시작하다
이 결과 := 0;
//계정 설정
IdSMTP1.AuthType := atNone; //또는 atSASL;
IdSMTP1.Host := 호스트스트링;
IdSMTP1.Username := userNameString;
IdSMTP1.Password := passWordString;
노력하다
IdSMTP1.connect;
이 결과 := 1;
IdSMTP1.Authenticate가 아닌 경우
시작하다
showmessage('이메일 계정 확인 전송에 실패했습니다. SMTP 계정 설정을 확인하세요!');
이 결과 := 0;
끝
제외하고
showmessage('SMTP 서버 연결에 실패했습니다! SMTP 계정 설정 및 네트워크가 정상적인지 확인해주세요!');
이 결과 := 0;
끝
끝;
결과 := 이결과;
끝;
4. 이메일로 메시지를 보내는 것은 독립적인 기능이며, 보낼 때 지연 제어가 필요합니다.
다음과 같이 코드를 복사합니다. 프로시저 sendEmailOnce(emailusername:string;
formAddress:string;receiptRecipientAddress:string;sendtoAdd:string;emailSubject:string);
시작하다
MsgKsbkxx.From.Name := emailusername //이메일 보낸 사람 이름
MsgKsbkxx.From.Address := formAddress //이메일 보낸 사람 주소
MsgKsbkxx.ReceiptRecipient.Address := 영수증RecipientAddress;
//답장 주소. 이메일을 보낸 사람의 주소와 다를 수 있음
MsgKsbkxx.Recipients.EMailAddresses := sendtoAdd; //보내는 주소?
MsgKsbkxx.Sender.Address := formAddress; //sendtoAdd; //이메일 보내기... 주소
MsgKsbkxx.Subject := emailSubject;
MsgKsbkxx.Body.Assign(emailMemo.Lines) //이메일 내용
IdSMTP1.Send(MsgKsbkxx); //이메일 보내기 명령
끝;
5. 이메일 주소의 적법성을 간단히 판단하세요.
코드를 복사하면 다음과 같습니다. // 문자열 Separator의 표현에 따라 문자열 s를 여러 문자열로 분리하여 rs 문자열 목록에 저장합니다.
절차 SeparateTerms2(s:string;Separator:string;var rs:TStringList);
var
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;
var
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. 이메일을 대량으로 보내기
다음과 같이 코드를 복사합니다. Procedure bEmailKsxxClick;
var
AccordAmount,i,j,tag:integer;
emailusername,formAddress,sendtoAdd,emailSubject,receiptRecipientAddress,selectStr:string;
시작하다
//데이터 테이블에 이메일로 보내야 할 데이터가 있는지 확인하고, 있으면 보낸다.
Bmb.RecordCount >0이면
AccordAmount := Bmb.RecordCount
또 다른
출구;
//
//일반적으로 데이터 테이블이나 INI 파일에 저장되는 계정 정보를 가져옵니다.
emailusername := userNameString //이메일 발신자
formAddress := fromAddressString; //이메일 주소 보내기
영수증RecipientAddress := 영수증RecipientAddressString //답장 이메일 주소
emailSubject := emailSubjectString; //이메일 제목
//
tag := 1; //플래그 비트: 오류 전송 시 중지
i:=1; //전송된 총 이메일 수
j:=0; //진행률 표시줄이 점진적으로 진행되도록 처리된 레코드 수
list1.Clear; //이메일이 성공적으로 전송된 학생의 정보를 표시합니다.
//설정된 메일박스에 연결 가능한지 확인합니다. 반환 값이 1인 경우 이메일 내용 및 관련 설정을 얻어서 보냅니다.
setEmailInfo = 1이면
시작하다
Pb.BlockSize := 1;
Pb.Max := AccordAmount ;
Formsjtj.Refresh;
Bmb.먼저;
노력하다
동안(tBmb.Eof 아님) 수행
시작하다
//이메일 주소가 비어 있고 이메일 사양을 충족하는지 확인합니다. 두 가지 조건이 모두 충족되면 해당 주소로 이메일을 보냅니다.
if Bmb.FieldByName('s_emailAddress').AsString+'a' <> 'a' 다음
시작하다
//전송된 이메일의 내용을 가져옵니다.
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이면 sleep(2000);
dm_sjtj.ListBmb.next;
Application.ProcessMessages; //루프에서 프로세스 정보를 처리합니다.
//진행률 표시 새로 고침
j := j+1;
PB.진행상황:=j;
PB.StepIt;
PB.새로고침;
끝;
마지막으로
태그 := 0;
IdSMTP1.연결 끊기;
끝;
끝;
showmessage('전체 전송량'+intToStr(i-1)+' 이메일.');
끝;
7. 주의가 필요한 문제
① 스팸메일은 해당 국가에서 허용되지 않습니다.
② 대량 이메일은 대부분의 이메일 제공업체에서 관리하므로 두 이메일 사이에 지연이 발생하는 경우가 많습니다. 자체 이메일 서버를 설정하는 것이 좋습니다.
③ Indy 컨트롤에는 atNone과 atSASL의 두 가지 모드만 있으므로 메일 서버 설정 후 인증이 필요하지 않은 IP 주소와 계정을 설정해야 합니다.
④ 내부 이메일 주소는 이메일 답장을 받을 수 없기 때문에 회신주소와 발송주소가 다르게 설정되는 경우가 많습니다. 지금 발생하는 문제 중 하나는 브라우저를 통해 이메일을 열면 답장을 받을 수 없지만 Foxmail을 통해 이메일을 받은 후에는 답장을 받을 수 있다는 것입니다. 주의가 필요합니다.
이 글이 모든 사람의 델파이 프로그래밍에 도움이 되기를 바랍니다.