Explorar el Código

新增邮件脚本可以再内容和标题中加入空格

lt hace 3 meses
padre
commit
aa92820ee6
Se han modificado 3 ficheros con 182 adiciones y 55 borrados
  1. 42 13
      jenkins/mail_role.sh
  2. 74 25
      jenkins/mail_server_all.sh
  3. 66 17
      jenkins/mail_server_one.sh

+ 42 - 13
jenkins/mail_role.sh

@@ -1,11 +1,36 @@
 #!/bin/sh
 
-serNum=$1
-uid=$2
-title=$3
-content=$4
-reward=$5
+usage() {
+    echo "Usage: $0 serNum uid \"title\" \"content\" [reward]"
+    exit 1
+}
 
+# Positional parameters only: serNum uid title content [reward]
+serNum="$1"
+uid="$2"
+title="$3"
+content="$4"
+reward="${5:-0}"
+
+# Validate required params
+if [ -z "$serNum" ] || [ -z "$uid" ]; then
+    echo "server id and uid are required"
+    usage
+fi
+
+# urlencode: prefer python3, then python, fallback to simple sed
+urlencode() {
+    if command -v python3 >/dev/null 2>&1; then
+        python3 -c "import sys,urllib.parse as u; print(u.quote(sys.argv[1]))" "$1"
+    elif command -v python >/dev/null 2>&1; then
+        python -c "import sys,urllib; print(urllib.quote(sys.argv[1]))" "$1"
+    else
+        # best-effort simple replacement for common problematic chars
+        printf '%s' "$1" | sed -e 's/ /%20/g' -e 's/&/%26/g' -e 's/?/%3F/g' -e 's/+/ %2B/g' -e 's/=/ %3D/g' | sed 's/  */ /g'
+    fi
+}
+
+# ...existing code... (server list lookup)
 url=""
 for server in `cat /data/shell/jenkins/serverlist`;do
     attr1=`echo $server | cut -d',' -f1`
@@ -21,16 +46,20 @@ if [[ $url == "" ]];then
     exit 0
 fi
 
-echo 传入的服务器id:$serNum
-echo 传入的玩家uid:$uid
-echo 传入的邮件标题:$title
-echo 传入的邮件内容:$content
-echo 传入的邮件奖励:$reward
+echo "传入的服务器id:$serNum"
+echo "传入的玩家uid:$uid"
+echo "传入的邮件标题:$title"
+echo "传入的邮件内容:$content"
+echo "传入的邮件奖励:$reward"
+
+# URL-encode title and content
+enc_title=$(urlencode "${title}")
+enc_content=$(urlencode "${content}")
 
-if [[ $reward == "0" ]];then
-    curl "$url/gm/mail?type=add&id=1&uid=$uid&title=$title&content=$content"
+if [[ "$reward" == "0" ]];then
+    curl "${url}/gm/mail?type=add&id=1&uid=${uid}&title=${enc_title}&content=${enc_content}"
 else
-    curl "$url/gm/mail?type=add&id=1&uid=$uid&title=$title&content=$content&reward=$reward"
+    curl "${url}/gm/mail?type=add&id=1&uid=${uid}&title=${enc_title}&content=${enc_content}&reward=${reward}"
 fi
 
 echo "-----执行完毕-----"

+ 74 - 25
jenkins/mail_server_all.sh

@@ -1,38 +1,87 @@
 #!/bin/sh
 
-title=$1
-content=$2
-reward=$3
-level=$4
-money=$5
-
-echo 传入的邮件标题:$title
-echo 传入的邮件内容:$content
-echo 传入的邮件奖励:$reward
-echo 传入的等级筛选:$level
-echo 传入的充值筛选:$money
-
-for server in `cat /data/shell/jenkins/serverlist`;do
-
-    url=`echo $server | cut -d',' -f2`
-    ro=`echo $server | cut -d',' -f3`
-    
-    if [[ $reward == "0" ]];then
-        url="$url/gm/mail?type=add&id=1&title=$title&content=$content"
+usage() {
+    echo "Usage: $0 \"title\" \"content\" [reward] [level] [money]"
+    exit 1
+}
+
+# Positional parameters only
+title="$1"
+content="$2"
+reward="${3:-0}"
+level="${4:-0}"
+money="${5:-0}"
+
+if [ -z "$title" ] || [ -z "$content" ]; then
+    echo "title and content are required"
+    usage
+fi
+
+echo "传入的邮件标题:$title"
+echo "传入的邮件内容:$content"
+echo "传入的邮件奖励:$reward"
+echo "传入的等级筛选:$level"
+echo "传入的充值筛选:$money"
+
+# urlencode: prefer python3, then python, fallback to simple sed
+urlencode() {
+    if command -v python3 >/dev/null 2>&1; then
+        python3 -c "import sys,urllib.parse as u; print(u.quote(sys.argv[1]))" "$1"
+    elif command -v python >/dev/null 2>&1; then
+        python -c "import sys,urllib; print(urllib.quote(sys.argv[1]))" "$1"
     else
-        url="$url/gm/mail?type=add&id=1&title=$title&content=$content&reward=$reward"
+        # best-effort simple replacement for common problematic chars
+        printf '%s' "$1" | sed -e 's/ /%20/g' -e 's/&/%26/g' -e 's/?/%3F/g' -e 's/+/ %2B/g' -e 's/=/ %3D/g' | sed 's/  */ /g'
     fi
+}
 
-    uids=$(mysql -uroot -p123456 $ro -N -e "select uid from role where base_level>=$level and total_recharge>=$money;")
-    for id in ${uids}; do
-        curl "$url&uid=$id"
-    done
+enc_title=$(urlencode "${title}")
+enc_content=$(urlencode "${content}")
+
+# Read server list line-by-line to handle spaces safely
+serverlist_file="/data/shell/jenkins/serverlist"
+if [ ! -f "$serverlist_file" ]; then
+    echo "server list not found: $serverlist_file"
+    exit 1
+fi
+
+while IFS= read -r server || [ -n "$server" ]; do
+    # skip empty lines
+    if [ -z "${server}" ]; then
+        continue
+    fi
 
-done
+    url="$(printf '%s' "$server" | cut -d',' -f2)"
+    ro="$(printf '%s' "$server" | cut -d',' -f3)"
 
+    if [ -z "$url" ] || [ -z "$ro" ]; then
+        echo "skip invalid server line: $server"
+        continue
+    fi
 
+    if [ "$reward" = "0" ]; then
+        full_url="${url}/gm/mail?type=add&id=1&title=${enc_title}&content=${enc_content}"
+    else
+        full_url="${url}/gm/mail?type=add&id=1&title=${enc_title}&content=${enc_content}&reward=${reward}"
+    fi
 
+    # Query uids and send mails line-by-line
+    uids=$(mysql -uroot -p123456 "$ro" -N -e "select uid from role where base_level>=${level} and total_recharge>=${money};")
+    if [ -z "$uids" ]; then
+        echo "no uids found for server $ro"
+        continue
+    fi
+
+    # iterate uids safely (line-by-line)
+    printf '%s
+' "$uids" | while IFS= read -r id; do
+        if [ -z "$id" ]; then
+            continue
+        fi
+        curl "${full_url}&uid=${id}"
+    done
 
+done < "$serverlist_file"
 
 
 echo "-----执行完毕-----"

+ 66 - 17
jenkins/mail_server_one.sh

@@ -1,12 +1,57 @@
 #!/bin/sh
 
-serNum=$1
-title=$2
-content=$3
-reward=$4
-level=$5
-money=$6
+usage() {
+    echo "Usage: $0 -s server -t \"title\" -c \"content\" [-r reward] [-l level] [-m money]"
+    echo "Or (backward compatible): $0 serNum \"title\" \"content\" [reward] [level] [money]"
+    exit 1
+}
 
+# Default values
+reward=0
+level=0
+money=0
+
+# Parse options
+while getopts "s:t:c:r:l:m:h" opt; do
+    case $opt in
+        s) serNum="$OPTARG" ;;
+        t) title="$OPTARG" ;;
+        c) content="$OPTARG" ;;
+        r) reward="$OPTARG" ;;
+        l) level="$OPTARG" ;;
+        m) money="$OPTARG" ;;
+        h) usage ;;
+        *) usage ;;
+    esac
+done
+
+# If no options provided, fall back to positional (backward compatibility)
+if [ -z "$serNum" ]; then
+    serNum="$1"
+    title="$2"
+    content="$3"
+    reward="${4:-0}"
+    level="${5:-0}"
+    money="${6:-0}"
+fi
+
+# Validate required
+if [ -z "$serNum" ]; then
+    echo "server id is required"
+    usage
+fi
+
+# Basic URL-encode for a few characters (space, &, ?, =, +)
+# This is not a full encoder but handles common problematic chars for URLs in this script.
+urlencode() {
+    local s="$1"
+    s=$(printf '%s' "$s" | sed -e 's/ /%20/g' -e 's/&/%26/g' -e 's/?/%3F/g' -e 's/=/ %3D/g' -e 's/+/ %2B/g')
+    # Trim accidental spaces introduced above
+    s=$(printf '%s' "$s" | sed 's/  */ /g')
+    printf '%s' "$s"
+}
+
+# ...existing code... (server list lookup)
 url=""
 ro=""
 for server in `cat /data/shell/jenkins/serverlist`;do
@@ -25,23 +70,27 @@ if [[ $url == "" ]];then
     exit 0
 fi
 
-echo 传入的服务器id:$serNum
-echo 传入的邮件标题:$title
-echo 传入的邮件内容:$content
-echo 传入的邮件奖励:$reward
-echo 传入的等级筛选:$level
-echo 传入的充值筛选:$money
+echo "传入的服务器id:${serNum}"
+echo "传入的邮件标题:${title}"
+echo "传入的邮件内容:${content}"
+echo "传入的邮件奖励:${reward}"
+echo "传入的等级筛选:${level}"
+echo "传入的充值筛选:${money}"
+
+# URL-encode title and content (basic)
+enc_title=$(urlencode "${title}")
+enc_content=$(urlencode "${content}")
 
 if [[ $reward == "0" ]];then
-    url="$url/gm/mail?type=add&id=1&title=$title&content=$content"
+    url="$url/gm/mail?type=add&id=1&title=$enc_title&content=$enc_content"
 else
-    url="$url/gm/mail?type=add&id=1&title=$title&content=$content&reward=$reward"
+    url="$url/gm/mail?type=add&id=1&title=$enc_title&content=$enc_content&reward=$reward"
 fi
 
-
-uids=$(mysql -uroot -p123456 $ro -N -e "select uid from role where base_level>=$level and total_recharge>=$money;")
+# Query uids and send mails
+uids=$(mysql -uroot -p123456 "$ro" -N -e "select uid from role where base_level>=${level} and total_recharge>=${money};")
 for id in ${uids}; do
-    curl "$url&uid=$id"
+    curl "${url}&uid=${id}"
 done