顯示具有 Mail 標籤的文章。 顯示所有文章
顯示具有 Mail 標籤的文章。 顯示所有文章

2023-06-12

[PowerShell]小練習發送郵件含附件

剛出來的時候一直想玩沒空玩,現在重新學習
#####定義變量#####
$fromaddress = "mailuser@ace.com.tw"
$toaddress = "yolin_chen@ace.com.tw"
$Subject = “資訊安全檢查作業_特權帳號”
$body = get-content “C:\GPOReport.html”
#$attachment = “C:\GPOReport.html”
$smtpserver = "請填入SMTP IP Address"
##################################
$message = new-object System.Net.Mail.MailMessage
$message.From = $fromaddress
$message.To.Add($toaddress)
$message.IsBodyHtml = $True
$message.Subject = $Subject
#$attach = new-object Net.Mail.Attachment($attachment)
#$message.Attachments.Add($attach)
$message.body = $body
$smtp = new-object Net.Mail.SmtpClient($smtpserver)
$smtp.Send($message)

################################################# ##

2023-01-11

[Oracle]郵件測試

搭配以下程式
  • BLOB_TO_CLOB
  • CLOB_TO_BLOB
  • SEND_MAIL
DECLARE
  P_SUBJECT  VARCHAR2(200) := '[Oracle]測試報表'; --信件標題
  P_RCPT     VARCHAR2(200) := 'yolin_chen@XXXX.com.tw'; --,分隔郵件
  P_CC       VARCHAR2(200) := '';
  P_MSG      VARCHAR2(4000) := '';
  P_MSG_CLOB CLOB;
  P_FILENAME VARCHAR2(50) := '測試檔案';
  P_HTML     VARCHAR2(2) := 'Y';

  V_CRLF VARCHAR2(2) := CHR(13) || CHR(10);

  CURSOR CUR IS
    SELECT * FROM FND_USER WHERE 1=1;

BEGIN
  FOR C1 IN CUR LOOP
    P_MSG_CLOB := P_MSG_CLOB || TO_CHAR(C1.USER_ID) || ',' ||
                  TO_CHAR(C1.USER_NAME)
                 --|| ','
                 --|| TO_CHAR(X.CREATION_DATE, 'YYYY-MM-DD HH24:MI:SS')
                  || V_CRLF;
  END LOOP;

  --這邊已將UTF-8改為UTF-8 BOM,Windows系統開啟才不會亂碼
  SELECT ACE_UTL_TOOLS.BLOB_TO_CLOB(ACE_UTL_TOOLS.CLOB_TO_BLOB(P_MSG_CLOB))
    INTO P_MSG_CLOB
    FROM DUAL;

  P_MSG := '';
  P_MSG :=  --這邊可定義CSS
   P_MSG ||
           ' ';
  P_MSG :=  --這邊可定義郵件內文
   P_MSG || '


' || '

此信由系統發出請勿回覆, 如有問題請洽IT

' || '

PROCEDURE: ACEOMR004

'; P_MSG := --這邊可定義表格 P_MSG || '' || ' ' || ' ' || ' ' || ' ' || ' ' || ' ' || ' ' || ' ' || '
欄位一欄位二
你好HELLO
'; P_MSG := P_MSG || ' '; ACE_UTL_TOOLS.SEND_MAIL(P_SUBJECT, P_RCPT, P_CC, P_MSG, P_MSG_CLOB, --附件內容 P_FILENAME, --附件名稱 P_HTML); END;

2022-12-28

[Oracle]發送郵件,並突破VARCHAR2字元上限

需要搭配BLOB to CLOB轉換
  PROCEDURE SEND_MAIL(P_SUBJECT  VARCHAR2, --信件標題
                      P_RCPT     VARCHAR2, --收件者 以分號區分
                      P_CC       VARCHAR2 DEFAULT NULL, --副本 以分號區分
                      P_MSG      CLOB, --郵件內容
                      P_MSG_CLOB CLOB, --附件內容
                      P_FILENAME VARCHAR2, --附件名稱
                      P_HTML     VARCHAR2 DEFAULT 'Y') IS
 
    MAIL_CONN     UTL_SMTP.CONNECTION;
    V_USERNAME    VARCHAR2(200) := UTL_ENCODE.TEXT_ENCODE('mailuser@XXXX.com.tw',
                                                          'WE8ISO8859P1',
                                                          UTL_ENCODE.BASE64);
    V_PASSWORD    VARCHAR2(200) := UTL_ENCODE.TEXT_ENCODE('mail@@XXXX',
                                                          'WE8ISO8859P1',
                                                          UTL_ENCODE.BASE64);
    V_MAIL_SERVER VARCHAR2(200) := 'smtp.office365.com';
    V_MAILER      VARCHAR2(200) := 'mailuser@XXXX.com.tw';
    V_RCPT        VARCHAR2(4000) := REPLACE(REPLACE(P_RCPT, ' ', ''),' ','');
    V_CC          VARCHAR2(4000) := REPLACE(REPLACE(P_CC, ' ', ''),' ','');
    V_CRLF        VARCHAR2(2) := CHR(13) || CHR(10);
    V_IS_GROUP    NUMBER := 0;
    V_IS_GROUP_CC NUMBER := 0;
    V_RCPT_CNT    NUMBER := 0;
    V_CC_CNT      NUMBER := 0;
    V_RCPT_MAIL   VARCHAR2(2000);
    V_CC_MAIL     VARCHAR2(2000);
    V_REPLY       UTL_SMTP.REPLY;
    L_STEP        PLS_INTEGER := 12000; -- make sure you set a multiple of 3 not higher than 24573
  
  BEGIN
    --開啟 Mail Connection 物件
    MAIL_CONN := UTL_SMTP.OPEN_CONNECTION(HOST => V_MAIL_SERVER,
                                          PORT => 25,
                                          --TX_TIMEOUT                    => 100,
                                          WALLET_PATH                   => 'file:/u01/wallets/office365', --'file:/u1/PROD/wallets/office365',
                                          WALLET_PASSWORD               => 'XXXX',
                                          SECURE_CONNECTION_BEFORE_SMTP => FALSE);
    --建立連線
    UTL_SMTP.EHLO(MAIL_CONN, V_MAIL_SERVER); --DO NOT USE HELO
  
    V_REPLY := UTL_SMTP.STARTTLS(MAIL_CONN);
    UTL_SMTP.EHLO(MAIL_CONN, V_MAIL_SERVER); --DO NOT USE HELO
  
    UTL_SMTP.COMMAND(MAIL_CONN, 'AUTH LOGIN');
    UTL_SMTP.COMMAND(MAIL_CONN, V_USERNAME);
    UTL_SMTP.COMMAND(MAIL_CONN, V_PASSWORD);
  
    --設定寄件者
    UTL_SMTP.MAIL(MAIL_CONN, V_MAILER);
  
    --設定收件者
    V_IS_GROUP := INSTR(V_RCPT, ',');
  
    IF V_IS_GROUP > 0 THEN
      --多筆收件者
    
      LOOP
      
        SELECT INSTR(V_RCPT, ',') INTO V_RCPT_CNT FROM DUAL;
      
        IF V_RCPT_CNT != 0 THEN
          V_RCPT_MAIL := SUBSTR(V_RCPT, 1, V_RCPT_CNT - 1);
          UTL_SMTP.RCPT(MAIL_CONN, V_RCPT_MAIL);
        ELSE
          UTL_SMTP.RCPT(MAIL_CONN, V_RCPT);
          EXIT;
        END IF;
      
        V_RCPT := SUBSTR(V_RCPT, V_RCPT_CNT + 1);
      
      END LOOP;
    
    ELSE
      --單筆收件者
      UTL_SMTP.RCPT(MAIL_CONN, P_RCPT);
    END IF;
  
    --設定副本
    V_IS_GROUP_CC := INSTR(V_CC, ',');
  
    IF NVL(V_IS_GROUP_CC, 0) > 0 THEN
      --多筆收件者
      LOOP
        SELECT INSTR(V_CC, ',') INTO V_CC_CNT FROM DUAL;
      
        IF V_CC_CNT != 0 THEN
          V_CC_MAIL := SUBSTR(V_CC, 1, V_CC_CNT - 1);
          UTL_SMTP.RCPT(MAIL_CONN, V_CC_MAIL);
        ELSE
          UTL_SMTP.RCPT(MAIL_CONN, V_CC);
          EXIT;
        END IF;
      
        V_CC := SUBSTR(V_CC, V_CC_CNT + 1);
      
      END LOOP;
    
    ELSE
      --單筆收件者
      IF P_CC IS NOT NULL THEN
        UTL_SMTP.RCPT(MAIL_CONN, P_CC);
      END IF;
    END IF;
  
    --設定發信內容
    UTL_SMTP.OPEN_DATA(MAIL_CONN);
  
    --寫入發信標題
    --UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('DATE: ' || TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || V_CRLF));
    UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('FROM: ' || V_MAILER || V_CRLF));
    UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('TO: ' || P_RCPT || V_CRLF));
    UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('CC: ' || P_CC || V_CRLF));
    UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('SUBJECT: ' || P_SUBJECT || V_CRLF));
    UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('MIME-VERSION: 1.0' || V_CRLF));
    --Add v1.02
    IF P_FILENAME IS NOT NULL THEN
      --有附件
      UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('CONTENT-TYPE: MULTIPART/MIXED; BOUNDARY="SECBOUND"' || V_CRLF || V_CRLF));
    ELSE
      --無附件
      UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('CONTENT-TYPE: MULTIPART/ALTERNATIVE; BOUNDARY="SECBOUND"' || V_CRLF || V_CRLF));
    END IF;
  
    --設定發信內容
    UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('--SECBOUND' || V_CRLF));
    UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('CONTENT-TYPE: TEXT/HTML; ' || V_CRLF || V_CRLF));
    --UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('CONTENT-TYPE: TEXT/PLAIN; ' || V_CRLF || V_CRLF));--等待擴充
  
    --UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN, UTL_RAW.CAST_TO_RAW(P_MSG));
    FOR I IN 0 .. TRUNC((DBMS_LOB.GETLENGTH(P_MSG) - 1) / L_STEP) LOOP
      UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW(DBMS_LOB.SUBSTR(P_MSG,L_STEP,I * L_STEP + 1)));
    END LOOP;
    UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('--SECBOUND' || V_CRLF));
    UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('--SECBOUND' || V_CRLF));
  
    IF P_FILENAME IS NOT NULL THEN
      --設定附件
      UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('CONTENT-TYPE: TEXT/CSV; NAME="' || P_FILENAME || '.CSV"' ||V_CRLF));
      UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('CONTENT-TRANSFER-ENCODING: 8BIT' || V_CRLF));
      UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('CONTENT-DISPOSITION: ATTACHMENT;' || V_CRLF));
      UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW('FILENAME="' || P_FILENAME || '.CSV"' || V_CRLF));
      UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN, UTL_RAW.CAST_TO_RAW(V_CRLF));
      FOR I IN 0 .. TRUNC((DBMS_LOB.GETLENGTH(P_MSG_CLOB) - 1) / L_STEP) LOOP
        UTL_SMTP.WRITE_RAW_DATA(MAIL_CONN,UTL_RAW.CAST_TO_RAW(DBMS_LOB.SUBSTR(P_MSG_CLOB,L_STEP,I * L_STEP + 1)));
      END LOOP;
    END IF;
  
    --關閉發信內容
    UTL_SMTP.CLOSE_DATA(MAIL_CONN);
  
    --結束連線
    UTL_SMTP.QUIT(MAIL_CONN);
    DBMS_OUTPUT.PUT_LINE('郵件發送成功');
  EXCEPTION
    WHEN UTL_SMTP.TRANSIENT_ERROR OR UTL_SMTP.PERMANENT_ERROR THEN
      DBMS_OUTPUT.PUT_LINE('郵件發送失敗');
      UTL_SMTP.QUIT(MAIL_CONN);
      DBMS_OUTPUT.PUT_LINE(SQLCODE || SQLERRM);
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE || SQLERRM);
  END;