2011-01-17 7 views
0

모든 이메일을 한 번만 보내도록 내 앱 사용자에게 이메일을 보내고 싶습니다. 이메일 전송을 데이터베이스에 기록합니다. 내가 작업의 순서로 사용하는 경우 : PHP와 MySQL에서 이메일을 트랜잭션화할 수 있습니까?

  • 데이터베이스 보내기 이메일로

    1. 삽입을
    2. 커밋 기회 단지 (단계 # 메일을 보낸 후 밖으로 해당 스크립트 시간이 있습니다

    2)와 커밋을하기 전에 (# 3 단계). 이 경우 1 단계의 변경 사항이 커밋되지 않으며 전자 메일을 보내는 작업에서 지난 번 전자 메일이 성공적으로 전송되었음을 알 수 없으므로 동일한 전자 메일이 다시 전송됩니다.

    탈출구가 있습니까? 아니면 가끔씩 중복되는 이메일을 사용해야합니까?

  • +0

    왜 DB를 통해 전송되는 이메일을 추적하지 않습니까? 그래서 당신은 이메일을 다시 보내지 않습니까? 또한 예외 처리'try/catch' 메서드를 사용하여 시간 초과 작업을 시도하십시오. – Jakub

    +0

    @Jakub, 웹 서버가 호출 한 스크립트가 너무 오래 실행되고 종료되어야한다고 결정할 때 스크립트 타임 아웃 i-e를 언급했습니다. try/catch가이 시나리오에서 도움이되는지 여부를 모르겠다. –

    +0

    어떤 종류의 이메일을 보내 시간이 초과 되었습니까? 아니면 단순히 이메일로 보았던 부작용입니까? 호기심, 그리고 그 시나리오에서 try/catch 도움이되지 않습니다. – Jakub

    답변

    0

    그냥 내 자신의 질문에 대해 생각할 시간이 있습니다. 여기에 내가 지금 무슨 생각입니다 :

    문제의 단계를 보내는 이메일이었다 : 데이터베이스

    1. 삽입

    이메일이 때문에 거래를 할 수 없습니다 커밋 이메일 보내기 2 단계 (위)는 트랜잭션이 활성화되어있는 동안에도 트랜잭션의 일부가 아닙니다.

    이러한 단계를 수행하면 실패한 전자 메일 보내기 시도가 다시 시도되지만 전자 메일이 두 번 이상 발송되지 않을 수도 있습니다. 이 상황은 전자 메일 보내기 엔진이 트랜잭션 인식 인 경우에만 향상 될 수 있습니다. 이러한 엔진 것 (이어야) 다음을 수행하십시오

    1. 이메일 작업 제출에 동의하지만, 커밋은
    2. 이 이메일이 전송되지 않은 경우 실패 커밋 확인 수행 될 때까지 이메일을 보내하지 않습니다. 트랜잭션이 롤백되는 경우
    3. 는 제출 된 작업을 취소

    내가 어떤 이메일 서버를 인식하지입니다.

    Nishant는 그의 answer 제안 다음 단계 :

    1. 는 메일을 보내기 전에 데이터를 삽입합니다. 그리고 상태를 보내기로 설정하십시오.
    2. 메일을 보내십시오. (2)의 결과에 따라
    3. 을 기반으로 행을 실패 또는 전송 성공으로 업데이트하십시오. 위에서 언급 한 바와 같이

    이 단계 인해 같은 이유로 스크립트 시간 초과로 이메일을 보내는 중복을 보장 할 수 없습니다.

    지금까지는 가끔씩 중복 이메일을 사용해야 만했습니다.

  • 1

    잘 값은 이제

    sending, failed, sent_successfully을 대표로 enum 또는 int을 할 수있는 열 status을 만들 수 있습니다, 당신은이 작업을 수행 : 메일을 보내기 전에

    1. 삽입합니다 데이터. 그리고 단계의 결과에 따라 메일
    2. 보내기 sending
    3. status 설정 (2), update 행 중 하나 failed 또는 sent_successfully.

    또한 열 triestries < TRY_THRESHOLD 경우, 매 30 분 failed 메일을 전송하는 일괄 처리를하는 것 같아서. 그런 다음 statusfailed_permanently 또는 sent_successfully으로 설정하고 오류를 기록하십시오.

    2

    MySQL 트랜잭션을 사용할 수 있지만 기본적으로 모든 쿼리를 준비하고 그렇게 할 때 쿼리를 실행합니다.

    메일을 보내기 전에 쿼리를 준비한 다음 메일을 보낸 후에 커밋하십시오.

    http://dev.mysql.com/doc/refman/5.0/en/commit.html

    더 많은 정보는 다른 방법 보류로 메일을 설정하고, 이후에 완료로 업데이트 할 수 있습니다. 그런 다음 특정 시간 동안 실행중인 보류중인 작업을 종료하는 cron 작업을 실행하거나 다시 처리하십시오.

    3

    길게는 으로 끝내려면으로 이메일을 보내면 안됩니다.

    smtp 서버가 메시지 전송 요청을 받았음을 알고 있습니다. 그러나 당신은 그것이 보내 졌는지, 받았는지 또는 반송되었는지 알 수있는 방법이 없습니다.

    이미 제안했듯이 가끔씩 중복되는 이메일을 보내는 것이 가장 좋습니다. 그것은 어쨌든 매우 드문 행사가 될 것입니다.

    관련 문제