Oracle Functions에서 Email Delivery와 협력하여 이메일 보내기

OCI (Oracle Cloud Infrastructure)의 Email Delivery 서비스와 함께 작동하여 Oracle Functions에서 이메일을 보냅니다.
Oracle Functions는? 라는 분은 여기 .

※방법 자체 변경했기 때문에 재투고하고 있습니다.
· Oracle Functions 정보
· Email Delivery 정보

구성 이미지





전제



・Oracle Functions 개발, 실행 환경이 구축되고 있는 것.
· Oracle Functions 설정
· Email Delivery 설정이 완료되었습니다.
⇒이하 Oracle Cloud 공식 블로그의 튜토리얼을 순서대로 실시하면 설정할 수 있습니다(그 1의 환경 구축이 완료되어 있으면 충분합니다).
Email Delivery를 이용한 외부로의 메일 송신 (그 1 배달 환경 구축편)
Email Delivery를 이용한 외부로의 메일 송신 (그 2 메일 송신편)

소스 코드 배치



여기를 사용합니다.
htps : // 기주 b. 이 m / y-Araki-Gi t / f-e-mai l - ぃゔぇr
공개된 go 코드에 오류가 있었기 때문에 수정되었습니다.
흐름으로서는
1. 소스 코드를 준비하고 배포.
2. 본문을 기재하는 텍스트를 작성.
3. 스크립트를 실행합니다.
· 스크립트 내 텍스트를 json 형식으로 작성
· 스크립트 내에서 OracleFunctions 시작 (메일 전송)
라는 형태로 해 보겠습니다.

golang의 코드를 조금 만져 Oracle Functions 단독으로도 메일 송신할 수 있습니다만(물론 그것이 서버리스),
여러가지 사용법을 모색하고 있기 때문에 이번에 이렇게 뭔가 스크립트와 제휴해, 함수에 json 형식의 값을 건네주어 실행합니다.

※Oracle Functions 개발 서버 내에서의 작업입니다.

애플리케이션 작성


fn create app fn-email-app --annotation oracle.com/oci/subnetIds='["OracleFunctios用に作成したPhoenixリージョンのサブネットOCID"]'

소스 코드 배치


クローンする
git clone https://github.com/y-araki-git/fn-email-deliver.git

移動
cd fn-email-deliver

EmailDelivery용 변수 설정


vi func.yaml
※以下記載。us-phonenix-1リージョンでEmailDeliveryの設定をした場合の例。

schema_version: 20180708
name: sendemail
version: 0.0.21
runtime: go
entrypoint: ./func
config:
  OCI_EMAIL_DELIVERY_APPROVED_SENDER: EmailDeliveryのApproved Senderで設定したアドレス=送信元アドレス
  OCI_EMAIL_DELIVERY_SMTP_SERVER: smtp.us-phoenix-1.oraclecloud.com
  OCI_EMAIL_DELIVERY_USER_OCID: EmailDelivery用ユーザのSMTP Credential USERNAME
  OCI_EMAIL_DELIVERY_USER_PASSWORD: EmailDelivery用ユーザのSMTP Credential PASSWORD
  REGION: us-phoenix-1

그건 그렇고, 개발 환경에서 설명한 변수는 OCI 측에 배포되기 때문에 극단적인 이야기 개발 서버가 손상되지 않아도 함수를 다시 움직일 수 있습니다 (개발 서버 측에서 계속 값을 가질 필요는 없다고 함) 물론입니다. 물론 서버리스).

배포


fn -v deploy --app fn-email-app

메일 본문 작성


vi send-mail.txt
※送信されるメールの内容です。既に以下記載されています。
 ジョブのエラーを検知するような例ですが、送信したい内容で編集してください。 
  %JOBNAME%,%ERRORCODE% に変数を渡して実行するなどの使い方もよいかと。
 (今回はやりません)。

---
* This email is sent automatically from %HOSTNAME%

The following error occurred when JOB was executed.

%JOBNAME%
[ %ERRORCODE% ]


---
Information system department
phone: xxx-xxx-xxx

기능 실행


権限付与
chmod +x send-mail.sh

実行
※引数に送信先アドレスを指定。
./send-mail.sh [email protected]

그러면 다음과 같이 메일이 전송되었습니다 (본문 오른쪽 상단의 araki-stp라는 것은 스크립트를 실행한 호스트 이름을 자동으로 변환하고 있습니다).


메일 전송 스크립트 정보



이번에는 쉽게 아래 스크립트(send-mail.sh)를 만들었기 때문에 이렇게 전송되었습니다. 일단 스크립트 로그도 내고 있습니다.
건명도 인수로 하거나 메일 본문을 그 밖에도 많이 준비해 메일 송신 전용 시스템을 만들어도 좋을지도 모릅니다.
#!/bin/bash
#
######################################################################
#
# [スクリプト名]
#  send-mail.sh
#
# [処理概要]
#  Oracle Functionsを使用したメール送信
#  1.メール送信関数(Oracle Functions)に渡すjsonファイル作成
#  2.ファンクションを実行しメール送信
#
# [引数]
#  1.送信先アドレス
#
# [関連ファイル]
#  ./send-mail.txt (メール本文記載ファイル)
#
######################################################################
# バージョン 作成/更新者   更新日      変更内容
#---------------------------------------------------------------------
# 001-01     yu araki     2019/07  新規作成
#
######################################################################
######################################################################
# 事前処理
######################################################################
#---------------------------------------------------------------------
# 変数、定数定義
#---------------------------------------------------------------------
## 作業用変数
# タイムスタンプ
NOW=`date "+%Y-%m-%d %H:%M:%S"`
# 日付
TODAY=`date "+%Y%m%d"`
# 作業ディレクトリ
WORK_DIR="$(dirname $0)/"
# このスクリプト名
SCRIPT_NAME=$(basename $0)
# ログディレクトリ
LOG_DIR="${WORK_DIR}log/"
# スクリプトログ
SCRIPT_LOG="${LOG_DIR}${TODAY}.send-mail.script.log"
# エラーログ
ERROR_LOG="${LOG_DIR}${TODAY}.send-mail.error.log"

## 引数
# 引数1.送信先アドレス
TO="$1"

## OracleFunctionsのメール送信関連
# メール本文ファイル
MAIL_FILE="send-mail.txt"
# メール本文ファイルパス
MAIL_DIR="${WORK_DIR}${MAIL_FILE}"
# 一時作成jsonファイル名
TMP_JSON="tmp.json"
# 一時作成jsonファイルパス
TMP_JSON_DIR="${WORK_DIR}${TMP_JSON}"
# メール件名
SUBJECT="Urgent! ORA Error detection of XXX job"
# メール本文をjson用に変換 ※実際は一つ下を使用
BODY=$(cat ${MAIL_DIR} | sed -e 's/$/\\'\n'/g' | tr -d '\r' | tr -d '\n' | sed -e "s/%HOSTNAME%/$(hostname)/")
# メール本文をjson用に変換 (%JOBNAME%,%ERRORCODE%に値を入れられるようsed等で変換する。)
#BODY=$(cat send-mail.txt | sed -e 's/$/\\'\n'/g' | tr -d '\r' | tr -d '\n' | sed -e "s/%HOSTNAME%/$(hostname)/" -e "s/%JOBNAME%/$(grep xxx)/" -e "s/%ERRORCODE%/$(grep "ora-" /xxx/xxx/xxx.log)/")

## スクリプト失敗通知関連
# メール件名
FAIL_SUBJECT="Script execution failed"

######################################################################
# 共通処理
######################################################################
#---------------------------------------------------------------------
# スクリプト終了時自動実行処理
# ・一時ファイル(tmp.json)削除
# ・事後処理終了ログ出力
#---------------------------------------------------------------------
trap fnc_trap_process 0

######################################################################
# 関数定義
######################################################################
#---------------------------------------------------------------------
# ログ出力関数
#---------------------------------------------------------------------
function fnc_output_scriptlog() {
  (echo "$SCRIPT_NAME: $1 $NOW" >>$SCRIPT_LOG) 2>/dev/null
  return $?
}
#---------------------------------------------------------------------
# スクリプト失敗通知関数
#---------------------------------------------------------------------
function fnc_alert_mail() {
  echo -e "$1 \n\nfilename: $SCRIPT_NAME" | mail -s "$FAIL_SUBJECT" $TO
  return $?
}

#---------------------------------------------------------------------
# スクリプト終了時自動実行関数
#---------------------------------------------------------------------
function fnc_trap_process() {

  ## 一時ファイル削除
  [[ "$TMP_JSON_DIR" ]] && rm -rf $TMP_JSON_DIR

  # 事後処理終了メッセージ出力
  fnc_output_scriptlog "The temporary file ${TMP_JSON_DIR} has been deleted."

  exit 0
}

######################################################################
# メイン処理
######################################################################
#---------------------------------------------------------------------
# 1.メール送信関数(Oracle Functions)に渡すjsonファイル作成
#---------------------------------------------------------------------
# 開始ログ出力
fnc_output_scriptlog "[Start] Start send-mail.sh process."

# ログディレクトリ確認
mkdir -p ${LOG_DIR}

# 作業ディレクトリ移動
cd ${WORK_DIR}

# メール送信用jsonファイル作成
cat <<EOF > ${TMP_JSON_DIR}
{
    "To": "$TO",
    "Subject": "$SUBJECT",
    "Body": "$BODY"
}
EOF

# 成否確認
if [ "$?" = "0" ];then
  fnc_output_scriptlog  "Succeeded in creating json file."
else
  # エラー通知
  for i in fnc_output_scriptlog fnc_alert_mail; do ${i} "Failed to create json file."; done
  # エラー終了
  exit 1
fi

#---------------------------------------------------------------------
# 2.ファンクションを実行しメール送信
#---------------------------------------------------------------------
# jsonファイルを渡しメール送信ファンクション実行
cat ${TMP_JSON_DIR} | fn invoke fn-email-app sendemail 2>> $ERROR_LOG

# 成否確認
if [ "$?" = "0" ];then
  fnc_output_scriptlog  "Succeeded in sending mail using Oracle FUnctions."
else
  # エラー通知
  for i in fnc_output_scriptlog fnc_alert_mail; do ${i} "Failed to send mail using Oracle FUnctions."; done
  # エラー終了
  exit 1
fi

######################################################################
# 終了処理
######################################################################
# 終了ログ出力
fnc_output_scriptlog "[End] send-mail.sh process is complete."

exit 0


단 하나의 어려움이 일본어를 표시하는 데
문자 코드를 무엇으로 하면 좋을지 모르는 것입니다.
여러가지 변환해도 메일로 문자 화하기 때문에, 누군가 가르쳐 주었으면 합니다.

관련 기사



· Oracle Functions에 대한 메모
· Oracle Functions 설정
· Oracle Functions에서 APEX의 Restful Service와 협력
· Oracle Functions에서 TensorFlow로 이미지 분류
· Oracle Functions에서 Object Storage 작업 (텍스트 저장, 검색 + 텍스트를 PDF로 변환)
· Fn Project - Fn Server 구축 (Oracle Linux 7.6)
· Oracle Functions에서 OCI Go SDK를 사용한 인스턴스 작업

참고

좋은 웹페이지 즐겨찾기