2013-09-02 3 views
1

지난 24 시간에 전자 메일을 전송 된 전자 메일 주소를 무시 전자 메일 주소는 텍스트 파일에 날짜 및 시간과 함께 저장되고 24 시간 이내에 전자 메일 주소가 하나 이상의 전자 메일을받지 않도록 검사가 수행됩니까?BASH 내가 BASH 스크립트 아래처럼이

+0

임시 파일을 사용할 수 있습니다. 내부에 날짜를 쓰고 확인해주세요. –

+0

@ Aleks-DanielJakimenko 네,이게 정확히 제가 필요로하는 것이지만, 제 코드를 어떻게 사용하는지 예제가 필요합니까? – user2656114

+0

@ user2656114 이메일이 무엇인지 알려 주시면 감사하겠습니다. 내가 정말로 알고있는 것은 아니지만 .. – konsolebox

답변

2

한 가지 방법은받는 사람 당 파일을 만들고 파일의 타임 스탬프를 사용하는 것입니다.

MAIL_TIMESTAMPS=/var/cache/mailstamps 
mkdir "$MAIL_TIMESTAMPS" 

cat limit_mail.out | while read num email limit orders; do 
    echo "Sending mail to '$email'" 
    email_hash="$(md5sum <<< "$email" | cut -d' ' -f1)"; 
    # Check that a timestamp file doesn't exist, or that it was modified over 24h ago 
    if ! test -n "$(find "$MAIL_TIMESTAMPS" -mtime -1 -name "$email_hash")"; then 
     touch "$MAIL_TIMESTAMPS/$email_hash" # Update timestamp 
     printf "$email_template" "$email" "$num" "$limit" "$orders" | 
     sendmail -oi -t 
    fi 
done 

편집 : 이메일 주소의 내가 추가 한 해싱. 그것은 내가 어쨌든 할 계획이었던 것이었지만, Aleks-Daniel's code for that은 너무 좋고 간결해서 여기서 빌렸다. sha256sum에서 md5sum으로 바뀌었다. MD5는 더 빠르며 잠재적 인 문제가 있지만 여기서는 문제가 될 것이라고 생각하지 않습니다. 물론 선택할 수는 있습니다. 또한 Hashing은 find의 파일 이름 일치를 뒤엎는 특수 문자의 문제를 피합니다. 파일에

+0

나는이 제안 된 코드를 사용하여 테스트했지만 전자 메일이나 파일을 보내지 않았다. 전자 메일 주소와 내가 설정 한'$ MAIL_TIMESTAMPS' 디렉토리를 이용한 수동 터치는 괜찮습니다. 이것에 대한 어떤 제안? – user2656114

+0

코드를 업데이트했고, 최신 버전을 사용하고 있는지 확인했습니다. (테스트 해본 결과 나에게 유용합니다) – MattJ

1

사용하여 타임 스탬프 : 당신은 누군가가 임시 폴더에 이메일 주소를 표시하지 않으려면

또한
DELAY_FOLDER='myTempFolder/' 
DELAY=$((24*60*60)) # one day 

while read num email limit orders; do 
    echo "Sending mail to '$email'" 
    if [[ -f $DELAY_FOLDER/$email ]] && (($(cat "$DELAY_FOLDER/$email") + DELAY > $(date +%s))); then 
     echo "email has been sent already" 
    else 
     printf "$email_template" "$email" "$num" "$limit" "$orders" | sendmail -oi -t 
     echo "$(date +%s)" > "$DELAY_FOLDER/$email" 
    fi 
done < limit_mail.out 

, 당신은 당신의 주소를 충당하기 위해 MD5 또는 SHA 금액을 사용할 수 있습니다. 좋아요 :

DELAY_FOLDER='myTempFolder/' 
DELAY=$((24*60*60)) # one day 

while read num email limit orders; do 
    echo "Sending mail to '$email'" 
    emailsha=$(sha256sum <<< "$email" | cut -d' ' -f1) 
    if [[ -f $DELAY_FOLDER/$emailsha ]] && (($(cat "$DELAY_FOLDER/$emailsha") + DELAY > $(date +%s))); then 
     echo "email has been sent already" 
    else 
     printf "$email_template" "$email" "$num" "$limit" "$orders" | sendmail -oi -t 
     echo "$(date +%s)" > "$DELAY_FOLDER/$emailsha" 
    fi 
done < limit_mail.out 
+0

MD5 솔루션의 경우 + 1, [cat's의 쓸데없는 사용] (http : //partmaps.org/era/unix/award.html). – tripleee