리눅스 (CentOS 64 비트)에서 C 프로그램의 전자 메일을 보내려고합니다. 다음 코드는 치료를 처리합니다.C에서 비 차단 sendmail
asprintf(&cmd,"/usr/sbin/sendmail -oi -t -f [email protected] [email protected]");
asprintf(&bdy,"From: [email protected]\nTo: [email protected]\nSubject: blah blah\n\nThis is the message body\n");
FILE *out = popen(cmd,"w");
fprintf(out,"%s",bdy);
pclose(out);
문제는 차단하기까지이며 돌아 오기 전에 최대 2 분 또는 2 초가 걸립니다. 차단하지 않고 이메일을 보내는 방법은 무엇입니까?
추가 정보 : 문제는 popen이 (가) 차단되어 돌아 오기 전에 완료되기를 기다리는 것입니다. 그래서 아마 센드 메일을 사용하는 또 다른 방법을 찾고있을 것이다. 나는 정말로 그 모든 팽창과 함께 추가 라이브러리를 사용하고 싶지 않습니다. 가능한 한 포크를하지 않는 것이 좋습니다. (popen은 이미 fork하지만, 호출자에게 리턴하기 전에 완료하기를 기다린다.) popen에 해당하는 블록이 있는가?
메일을 보내는 동안 계속 실행 프로그램을 할 수 있습니다 (fork()를 사용하는 것처럼 간단 할 수있다) 다른 스레드에서 보낼 수 있습니다, 쉘에서 직접 같은 호출을하면 시간이 좀 걸릴 것입니다. "느린"센드 메일은 로컬 컴퓨터의 DNS 구성에 문제가 있음을 나타낼 수 있습니다. – ShiDoiSi
실제로 그것은 디자인에 의해 차단되고 작업이 완료 될 때까지 기다리는 popen과 관련이 있습니다. 지금까지 내가 생각한 최선의 해결책은 이메일을 파일에 작성하고 bash 스크립트로 보내도록하는 것이다. 그러나 이것은 지저분한 일이며 C로 처리하는 것이 훨씬 편할 것입니다. – poby
MTA에 이메일을 보내면 너무 오래 걸리지 않을 것입니다. 일반적으로 설정을 변경하지 않는 한 메일은 그냥 스풀링됩니다. – ShiDoiSi