안녕하세요.
제가 리눅스 서버에서 php를 이용해 회원에게 메일보내는
페이지를
만들었는데, 걍 이것저것 보고 뚝딱뚝딱 만들어서 인지 문제가
많이
발생합니다.
일단 회원수는 2000명 정도이고요, 오라클 디비에서 회원주소를
읽어옵니다.
문제가 되는점은 2000명 정도되는 회원에게 HTML로 된 문서를
메일로 보내는데, 웹상에서 페이지를 읽어오는 중에 '작업취소'
화면이 뜹니다.
php로 서버에 메일보낸 로그를 텍스트로 남겨서 보면 한 200명 -
700명 정도 보내고 멈춰버리더군요.
또 회원주소 읽어오는 SQL문에 그다음 주소부터 읽어오게
한다음 다시 보내면, 잘 가다가 또 웹페이지를 찾을수 없다며,
멈춰버리는 경우가 많이 생깁니다.
phpschool에서 좀 뒤져보다가, delay나 set_time_limit를 사용해 보라고
해서 젤 위에 set_time_limit(2000) 주고, 메일 50개 보내고 나서
딜레이주고
등의 방법을 사용했지만 결과는 조금더 보내는것 외에는
나아진것이 별로 없습니다.
또, 세번째 문제는 위에서 말한데로 SQL문을 계속고쳐가며, 새로
보내면
이상하게 SQL결과상에 나오지 않는 위에 보냈던 사람한테 다시
메일을 보내버리는 오류가 생기더군요.
결과적으로 2000명 회원한테 메일을 보냈는데 실제로 메일은
3000번 정도 발송이 되고, 몇통씩 같은 메일을 받는 회원이
생깁니다.
어찌해야 할까요?
참..추가적으로
delay와 set_time_limit를 사용하지 않은 상태에서 보냈을경우,
2000명 전원에게 메일을 발송하지만 대부분 mail 함수에서 오류가
나고 한 300-500명 정도에게만 메일이 가더군요.
set_time_limit를 사용했을경우에는
중간에 끊겨 버리고...
이문제에 대해 아시면 꼭좀 부탁드립니다.
set_time_limit(2000);
$stmt = get_usermail_a();
while(OCIFetchInto($stmt,&$usermail,OCI_ASSOC)) {
$name[] = $usermail[NAME];
$email[] = $usermail[EMAIL];
$user_id[] = $usermail[USER_ID];
}
위처럼 메일주소를 읽어와서,
for($i=0;$i<sizeof($email);$i++) {
$sendhtml = $mailhtml;
if(($totalsend%50)==0) sleep(1);
$sendhtml =
str_replace("_user_name_","_".$name[$i],$sendhtml);
$sendhtml = str_replace("_usermail_",$email[$i],$sendhtml);
if(@mail($email[$i],$mailtitle,$sendhtml,$additional_headers)) {
$totalsend = $totalsend +1;
$email[$i] = trim($email[$i]);
fwrite($fp,$email[$i]."\n");
} else {
sleep(1);
$nosend = $nosend +1;
$email[$i] = trim($email[$i]);
$name[$i] = trim($name[$i]);
fwrite($fp2,$email[$i]."__".$name[$i]."\n");
}
}
위와 같이 메일을 보냅니다.
$sendhtml 이 메일보내는 내용이고,
str_replace부분은
회원이름쓰기 부분,
메일보내는 mail함수는 if조건문안에서
돌아가며,
메일보내기가 성공하면, 파일오픈변수 $fp에 기록,
실패하면 $fp2에 기록합니다.
|