From e60d499fa3e2d42fcb5650162b5b46366a107c85 Mon Sep 17 00:00:00 2001 From: SHM Date: Mon, 23 Feb 2026 10:29:45 +0900 Subject: [PATCH] =?UTF-8?q?[=EC=84=B1=ED=98=84=EB=AA=A8]=20KeficoMailServi?= =?UTF-8?q?ce=20=EC=B6=94=EA=B0=80,=20KMS=20=EC=9D=B8=EC=A6=9D=EC=84=9C=20?= =?UTF-8?q?=EC=BB=A8=ED=94=BC=EA=B7=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dacpac/SystemX.DB.AccountDB.dacpac | Bin 3502 -> 3501 bytes .../dacpac/SystemX.DB.CPMeta.dacpac | Bin 2679 -> 2678 bytes .../sqlScripts/dacpac/SystemX.DB.CPXV2.dacpac | Bin 5807 -> 5806 bytes .../dacpac/SystemX.DB.CPXV2Log.dacpac | Bin 5137 -> 5136 bytes .../dacpac/SystemX.DB.UniqueKeyDB.dacpac | Bin 2763 -> 2762 bytes .../dacpac/SystemX.DB.VPKI_DataDB.dacpac | Bin 3093 -> 3089 bytes .../WebApi.Project.ProxyKMSApi.Config.json | 5 + Projects/DLL/SystemX.Core.DB.dll | Bin 75776 -> 75776 bytes Projects/DLL/SystemX.Core.dll | Bin 62976 -> 62976 bytes Projects/NetStandard/KeficoMailService.zip | Bin 0 -> 4633 bytes .../NetStandard/KeficoMailService/Address.cs | 14 ++ .../KeficoMailService/HtmlFormType.cs | 14 ++ .../KeficoMailService.csproj | 51 ++++++ .../NetStandard/KeficoMailService/MailType.cs | 14 ++ .../NetStandard/KeficoMailService/Manager.cs | 163 ++++++++++++++++++ .../Properties/AssemblyInfo.cs | 33 ++++ Projects/NetStandard/NetStandard.sln | 6 + .../PlayGround.NetFramework.csproj | 4 + .../PlayGround.NetFramework/Program.cs | 60 +++++-- .../SystemX.Core/Services/HttpService.cs | 4 +- .../Models/ProxyKMSConfig.cs | 4 + .../Services/KmsService.cs | 92 ++++++++++ 22 files changed, 445 insertions(+), 19 deletions(-) create mode 100644 Projects/NetStandard/KeficoMailService.zip create mode 100644 Projects/NetStandard/KeficoMailService/Address.cs create mode 100644 Projects/NetStandard/KeficoMailService/HtmlFormType.cs create mode 100644 Projects/NetStandard/KeficoMailService/KeficoMailService.csproj create mode 100644 Projects/NetStandard/KeficoMailService/MailType.cs create mode 100644 Projects/NetStandard/KeficoMailService/Manager.cs create mode 100644 Projects/NetStandard/KeficoMailService/Properties/AssemblyInfo.cs diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.AccountDB.dacpac index 083cc699263d42082c33d6a1c02901f290fb8cf7..63b3f1aa016ca6bb153f83df8024df2260749b82 100644 GIT binary patch delta 712 zcmZ1{y;hnpz?+#xgn@y9gW;i1c+5t=ZdMi$WAj|rX-r_&WOI&poFJj#z9n=7zf{K@&OPu_p>f#gu@o(Bp$q6TxFSR&=gP>P%Vw#G zn(h(YF;luAT30f+Elv5hyxr?b|9zyzZrh&o`;g0;pLk=X*m~aV()CWC_FQ(-vUbd$ z!+b|Tr1ADPmwNxS^0GpgdL3TD>+3x&S2Kkqo!2yU>SNa|Eb?+<54CJI;D44g&pknF z{+R_q>JpC*G~PIv!hV>QQ+&dX6gdI;c6lF$Lvbnb77I3Q+tc|m?ZS5fIm6nU4F=CO zb~}CNQ|-U(`|@pRxzm+Xcjv92xO?%d472lJ=bB0gEl&9G|D0F-?x^xfM|EFsS+Xqc z@>5fNyN%c9T5K{qr?~P@R+wVQuVV~ZIe)spN1d{0-M9DsH<{qC_RLa?#9L4PkNe%3 z`l4L&``4JoUk-FFel_c*VGrZ$?k5|0r2;qIGUdPMw?{RyI`dU(+_pIj+u1k8E!A`s zNaIg@a9GFV`NHYzHi@3$;Cg6&%m1X7^UYh)NiuAX8FHsDR8J^6D{K2LM11XH{Trq$ zqzgZLH@uwfQOAs$xF%2Keg;WW^*qK9#x@=c2;&ovB~l_Y;nkN1B{};?o?f$oiSscK T3j;9%v`uc}Rb$KJ0f_(r0;M*M delta 713 zcmZ20y-u1hz?+#xgn@y9gJF46T=Yi1ZdMi$WAj|rX-r_&WOI&poFE~FiEX|bll3@_ z>kszLHW1hw{>olqUF?QlUQWRcUK|rwW$m6g>D#*o&ovC^ZY{g@<$Bc%^{?VtLJNGS z+J@Ryrrq1~+sv>+Ut4LRrvOa)@?^;#fa>=dAw}3cY2n++WY&i-m~nz z_dV}TW$5jC+k9=gB!iayhFMzMpY0U!nsV!`EAJKW`lT~WavdFuHzZEF+*QB))&vHA zC4PtVX0f{3QJ4RCe9zH6+Ua?A=B^gsN3TPJn__RQ<=|HQE1+*GA@)TUdX5r(MB)*l()E^)(mga-A$+D;9K< zv+A+TgT4hEcebn6SDEeZ?q>d#oY=9$PTe))i4I2%dz)&ZN92!le2%Xs$nutFSZR7o zxg_YwpIs27F88H|-I4vU?x!@lS&EMyT{tdxOg_P)d4upx(Qhl(XueB2(IQ~u$h=JZ zwcs-u*V(VnEqs!>M|1ApcVQh~J7=FZE!rL;d-mDVstr}nNg`kV+1E#8M!yW(v?Fot zv@2KE+>Sl^+5gQRQTJ;{tUJ8-&zZs@YPV#Dl=S~cd#4)tEX;ntTlRRw-}4Q>UW6uo z+JC(+<>l|#ueE#FkZS{YDNZz&I-urPb z*U1X;*(chTIqsemzUKDvwDnopiTBjs-*?Rpvg6v8K6fGG+@7<|LCaMcHrZU5=CM0< z>4QnvPw7>1KM7V|c_G)))oa7jripEPh3c1jGPH3pclh4DYOsh`vp>b(ylMW5fSyyu z5$gM5O;r1M+eI5S4W1d_(>!D~(|-PrfGttNu9IeE+~c@&rgz6$p($IEH+R0}pI>;g zUQxIAEMvObk8Mrc4Zd9YFnwBCR)Au}MQyz$GZ&bjW6a~|I*=Q^$bGN%Zi|KXp|d(x zPG9n^{?7)dh50-63U$RFwT4b$h~%hjW&W$Ak#*K~`uQ}0g+e?V^Br>%)7cL%71moQ zCT+pp@sVA&p+LY=q;JKZ)pU0dieEvze5(APeI?&)EuUk4>E68c z6Za~AT4C;gcCMk6kaGQ(|L0Epa{JnJO!nG(b6| za)O1+?H}Urw@%6Aa;`ovXYuS+J)4P}KG)>`d%qcx{j80a7oH8)fn)kNfW#(u9zTQ9oH8}u z^lb0!%*l}2qFZtDmUB|ss!dLx?P~w)#Z7(`xPdvFmp3CdNp7l@KEs5g6U|(1@oKY7 z-xE}JP+DPrmS<}ow^vYuu4vDdH&Zq0eVGhgBph;Ht!op^_b60i-zE6Rr!^@g?vT~T zx2rTub8f7c=xJ1(|1nJP+NnQ3&$KRjI!j|xn9Jv531;RGws{3y;yLTK&A#TC>Hk&} z6T|8`Gaps5<|n?``AnZTH*~$zhT7#jCZu)UvtXYgDAHUR{m6aq?j073?5ED^SUKI~ zhI{?PdtYOoL?FiB9IlTwvc(zzhaNqT3@%YzVt|CcUl!s@_`>( z5lKyL)3TGiPgmc`!GtB8*qm<4&>wT-;aU@d0WuEXlfg_dk66aLsJ<~Cs!7BgP z#@YM6M@>YNmvY>KB%)?c hV+dmxrzKKq`opOY5!UCDVw^GAi%X5IgcFzs82~@xD60Sf diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2.dacpac index 5e37354fe096e563c89dcf0509d457da4dbc3db8..d8fdfeb6e3f845af7cb851dc00210f6634e29cd8 100644 GIT binary patch delta 711 zcmZ3lyH1xcz?+#xgn@y9gW-u!c+5sVeSQ`YW3wawH%2gPvbEqFPLNR8^=3=8$p%8k z^#}9j7zpeQe`T+*j`zk5fj1l-X1f(aLuYy1{PxaNZKK$SV`ib3;$JVEe7%pqjU%yuH)>c;2#}E86PDcHl8|ls@ z&?C@rqCD1Ce|Kul`FBUxhOsYPEAmYBjZl35EH0Ttg{cXAK0mj<(w)3lb3UI}bYT9B zRM*2Y`D}jA)b7l^+Eg06dFEUG`Q>No)8?M|EBIXe#g?Y+29GYRdhYk7EM(!+ybWH` z`#bJguv;iax7T(T1vFr9MbtDZy4GDjJ1!8a@q8Sj3aahu+zPp~j!#;PFtMsn+7vkYxvRE@)PiFagx<1~r zCu;eIRhL$^Z17QZJ;}BHlEg9TCU3JI}C7Hh0L#d~byW#jMjmh5?UZk_w8#n*0% zi(KNF)3H0AN$0-HM`_fwHF=uIGf0YR5H*G{wu@Ro7@tKgkE&|eR8vy8e6_7NCW`JFG#!q delta 712 zcmZ3dyIz+sz?+#xgn@y9gJES-T=YgheSQ`YW3wawH%2gPvbEqFPLR;Vg0Sc6lMRH7 z>reO1HW0ZR{>olqo9qW}CYJ*mlN&-pFLzGaQqAs@#9DC7?5a=w+U~lb`h{wYw?bxy zKArl0@AG+&i*x_~`e?kbJ~QjJ^yIE?vyBtEbGx^;YEea;}WrxoFlh zQPVw!J7!83Nb5@GwxucGmbZI7>A#Qkv>UeP{66Ng<|p1*DYl+ByL7$Nr`YAKA!S|n zEZBD_YOrn3?W~`F=G~h|9seSvl-9)u$B6Q!hqfi~e zW^lgQrrCfyq2(`YB#YdaFh%o|9GssUey}LppAT!Pa65madP31zS^IAx;%gV{-{?&$ zP|mC4G^iDRnU9*dCQlW421!!&qQ(%$Hc<-*bV&I9)L`+{E#It|o=`|aeI3EMC SFc2d^$K)n4HMRm#kO%-;CovWP diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2Log.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.CPXV2Log.dacpac index 4ccf6d53ca33c25b591d0d421f9bc07bea6556fb..cdcfd6a9851c8cdf89c1e0833d4bcf7e29d21fb4 100644 GIT binary patch delta 690 zcmbQJF+qbbz?+#xgn@y9gW<7Hc+5sV5gry0W3w7h0TY-tc^2P$PLNRQ57YT-lPB>T z*Prg2Z6I37dgKCdp-U>Oh z%E{@|-tTvcYu3Gux36>ie%?2?X1SBmy<^LA9WO7)J?MQ+E@^Y{RV9P>lfS=TWU490 zYQ5pwg@&+W&jMF|7Gj8$$#hy4m;9%th^FR3s% zN;7u&+`VeBh*#6^iGz95{FMPcr@SN7_r;p3-e~$O-e_p>#Q2`pp{SYm^LGYpi4k_4 z)Rl3Mi+9Hx@Qo|3H_=_WGZt3)j91<=FOKMEsJ^ z8}o0BX)LY@_omgq2wbnH*Z0DIsan!2RZYV!8~3|&-!A=l=;q=AN1MOJT<1$C`g3hR zBsk-gx^YJUXVZyjhb;~j?1xqPreE01bh~&$v;7N(mc1wT6*xT2we04!ZK<`EF|57W zaN)PcZl|w&s{EHdU%uU1Hs|`KTXB68w<>>HBJTfnuAzj`?RyXY&#j+Wy7d)HZ}crq z$C9(lZeL&X!zaG%kIU@}{=%nWb*Z+Ul+s-alu0s&9+M$#paJ4oev9;}V;_;GybT-CDt~56=_|teYU4Vo?&n5Ud~H ze(n_KW|I=;84G2e*6sQvJ7=+hgIVUQBx%L`xjXZIU38B+f1`Rr(P>%RFCpP;7wezk zQZ^92zMf^qyv`@)sA+5R55Z@U6!l2R7{ZVgwtz4~g)NcN*mPlii0~<4DaMzRp9-t7 KT@(VQQ3e2Yhv z>tpk08;I1--}1kqBKDyCkp|@jUYwJct;}AUR$YEzNf^WOZ8LBE+iLqp{jL5Pl>^f> zYiCt_+WY-Zam_o^{dIqQ*3G|t?B}_uVw=2UpEzHC7^|s$@oms{^R42$uiyM#esb2- za<4Zo&m$a`2Y{o$VuOcjigKWz5#?GjDy8jBjv8BED`)8{5Gx_tDrqt@Zo zrp7v}XFl~kaP&?`wL#bBvK+IGe;*e6{nTIcbfxu!J3R4WAH>?^rG8%ebdE=B%8hSs zT5r={^j0@;HwhKote^Je+`K+LzZd>fRfV3ZuI6kh?eOl;%Y3O@;bSA!dg1mY1+Ge& z9K%h=&OF^L=`)kZ*~f-uFGHR{T+$YoiSo%F&Q5j?yIKkaEJgZOELyFXl))k{xI{Qj zLt5~gTxk5PgA3o3-J5bSu3kBH@!$5xQa`1aegF31N{r=VMNKaE|Lg1L?8*08UvcZ> zJ&m;NcfWI$Po4jhs{DPA_jZF7p0ZatLRmI7L`wgEWINr+H!;KiPh;}Bf9Vd%UzQmB zzQ1*TMY zw+W;8qi_0*&+fZ?lSWNklfMf-gCwbkLdFn=gs=sK5h84fl*pzD>&t_Zoc$wDui3!F W`51_WffxZ^O@1P*#&$^vBmw}@dPJK5 diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.UniqueKeyDB.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.UniqueKeyDB.dacpac index 2ec36d3ca70a996ae55e2fb6a5ebf679335fc11e..e0c452704cc5e7665916af105e0ef796484b9b49 100644 GIT binary patch delta 691 zcmX>tdPSe~A4 z;r;1)|NNs@i?3JRZ!rt{y0qWvMfIZeuG9Y(eqq1OGP6E(Z+-Y0jonv2IeweR{AJk} z`L%cBnG$X+ezAhn`s5a)RT~w9Wexn-)(hU+$~woWK!3}UwSWB9Dl9&4zrVL1M2v1G_? zF6TKc0_+yI4*W4XrJpFH#xjxPA-^8OLyaPxIRUTd%|EW9*_mLJd~6fv!*d7O)7;xv z&3^1F`Igt*YpdFx`n_%s+h)zZZL?MUUW!NOq?7--^DXPQlwDZ#=4gUxscHG)ZByS& zuDH2k?u*m9J+pRrO1D(-WV+1lt^YXBYvyu;ZRMvvTFk5uTHern=vDptzY|kml}mho z8PolAae}pR$?@X`?0fX1rrEs^5zl=gw1I7OIm2_EXVa3XL9Z{y~8IB2JlO?V$>ARaev&uinZ)f-HiLVxveq(K~WIT7|u0CVm zeV4D&s0nKFFOFM~1a*Vc7{cJ^vP4Q*fn56Xpmg?j;pGSYz;w7Ch=qX|0bWm@&!xt8 IoD(Dh0HY2(U;qFB delta 692 zcmX>ldRmk(z?+#xgn@y9gJDHdT=Yi1PF5BWWAbd)51b$dkCa=M`s68WCiQ)@4MgsS zzp_`@Ci{W;j53qkWcHv?U-h6%?_>=+MGr{c4l(|_RqvPQ-_}_y8NsPxQ^WUtpI6;? ze(T@Y$In0cw{+#&d><{nTUXrlw&-3HTlD0u-B#;Z%Zat~_tsC>$^5ADbKdr8j9av} z@<+{2V_5O%fYhoxZQ?;1ftlL{cmvLFtxvkNg;iDeK%1vu_P@DV&P)a_5)L`D*G-$c zCbMu!^|on`jx2fRGxxCC$FGYtKgZly&(hPVxL;uHvOS@zr%#?RYpVCE%&@@2vm0jb zWZZsn(#5n4vrT^=Zr1yGeoNxYyN}=S+z^vjf6@%F+FhvVr61%H%!WV|w-h!}Dvo;h@(e>IEG)5(${ zuXvn&WLRYR^91K5nm9K~Pmox6;5Wl#$(Fq*_7ym+z4ggVjfYd^U&qVSY%P}VH$``q zYgEt4^U7bpTXa#_yJt1McXUJDH&?EEzvkcs5!UAa<<}O~uP#-OytT>CJ1gtj-F457 zs(;%h>V9pR^^4FYT-q&OOe@`cd+R^Oc}p(8uw6axykY2n;{}RUfiwQT-#R~{t!{c@ z{CU$znTW!WSYz8Z!-U$2Hd`H)y~1`sQ@j-^S7mu7T!5Y1X8vM}4`TnC{-qbKel^{-U^IX9Y&yeb z^ND}iP*c?8pB%R!De5|>F@(X#Wr>uu0=V?$K?&{c!pjf(feCRv5DNn_0=$_#k4ug1 I1Sd!Y0A*x0egFUf diff --git a/DBPatch/sqlScripts/dacpac/SystemX.DB.VPKI_DataDB.dacpac b/DBPatch/sqlScripts/dacpac/SystemX.DB.VPKI_DataDB.dacpac index 8bdc1acf4962f9521359a08d1e8582de1efa9806..c15185c416ce0f94b5a0ad928151f272d252820e 100644 GIT binary patch delta 668 zcmbO#F;Rjqz?+#xgn@y9gW-`+c+5t=3v4VP#^gtApEyAbkAk1^DwFTBo7DHsHW0ZR z{>olqo9u>-l`R|+sx2O&rgJ?!cb6Yf31djl3HJS!9s6bSFK$!L3(JziriSnPKCk+m zZQY+=AC0SO)@nbN7M=7_%}iE$7F%vn+=gcYv)5{^o%wUdo_g`M9{+T1G@7=tnHZV% zd(C~$aN>_gw$j^KPn*2sw5*?-PSBrPzr<-fE9=RF)41HUzRlI}WfCY6XgF~tmRI@K zgg-8PCCWc$avfc*qSYv16e+#72-cpB~Ie{vJNcH+&~Gp&n`c448ch}STFH(>D zZ|VFlFg;H4MI|@C(3ppGY{kJ>bpEvdD zH?cptO-}x>fWbZvvDpirv98VeD{xk&)b_rsT$%HnwU=^UR&-yDTF>IHG5`SVG%)=D delta 672 zcmbOzF;#*uz?+#xgn@y9gJF46T=Yi13v4VP#^gtApEyB`CAsr7G$!9=H>uCNZ6L5m z{DnQoE;FI~n^HZv{sc5E@(@0d_kN3qYLn_k#g$4g*MGg>|4M&Km+Dr%Il%{o%gf8! zHmlVC{V_Af-hAtK->l%3W?ut2YW=sh3Wffj@N2Ga^UnIYd+Vp?R1_{>-M;Fp%mUMu z|1;heGB#++r5^UZ5z-pwHq}fgg!xQxeeRO7+{Op2H@sp$?)r6Ztumv85|6^S*zoh- z?ser<%aS^K)yK?)s?7_VQD=1?B8`8hKJSpGof- z+nsA!Cuc9bdE#69dF!Y4pWT+#^?x?5i98rBQMu--w{rCD)fcYr+w3K6@0>q}IYwYg z!|84HD&=|KUp?yhry&!V8gF#UIfJ1qp#2&J~RpnKn*Hv{JA5#(0dIqk3ZP!-iAQg_6eI3ThWSUY=%av2K6Cb=!K% zT|e`s+s*H2hR!bdUDbO?)|`EN<*N024o(npZT=sAuYT9++~ujaPMynom-TLUZLH}0 zC#U^nQ)a(Y)Qq&$78K$sIyASp{^LAv$>kTerzf5_4E=AsK(Q)l#^3i_=SQ^FEiasZ z-Zaww)T4x5X;nPQ2YxSFeTBVOXcOOE=P#R0Qw5LqT$u4>cIiH+oSi!hwbf0Im$(`p zyx6lQ@6k`+Em1;K%rB?f+}w4xYQEZ{Gt0zXPp1eybk% y;+wLc5j9CocHp`NNm6p$#t=p*w!8t_=2T>dpRKnY3L)k?{+& zzcE7^gC&CrLn4DYLlT1#7^eZrWS}TWJcYpmNE-p=O@S)RfP8bHC`b;Z&ypb(D4q;d Rp9WNy$Y8iVTa|Gt69A`5P%{7k delta 247 zcmZp;z|wGmWkLr_`2Dxr8+*3)FeY#b*gRRd+uL)GPjgKov%|67HrxMjF%}AIn46iV znI)SUn_HL|8ChDSnH!{-8yQ-fC#R;QnHia+85*RTrKT8KY@aH}IG>SaMsCLa=@tr% z0RktsA9u<;y3%)!%R#r?S+8$RpP|55pa2!U8v_*us*jHimR9q8q~p-}e^1L#KW(=kbX+Sa=h>aP{87vq~7>t0>639ve@(mbLfTR(FAyC8|s45l62dOs#s!Ick U8URJiz@ml>7TdE`8K*J<0Ml$u{Qv*} diff --git a/Projects/DLL/SystemX.Core.dll b/Projects/DLL/SystemX.Core.dll index 64131243907a7fc580fa1aee7c3364ff92581c83..3049e78600d1d97a5c3811ab5a68877aa600f2fe 100644 GIT binary patch delta 299 zcmZp8!`$$Oc|r$^z4E8m8+#-T81pADGXRpCuNz!u0&-RxZw7MWP2MvDIsO(P4zuN1 z1A!xqn##IDwhS8j3_x&%ar1-BkSu}h92U9Qe-194Ikp$~ZuDQU+2u;Hh=y^RrAeZB zl2MXTT2iv5rAdl~rBR}(xmk+2iKS(lrDdvVa#ET_qT%NIFIrhxyrt{rPtJH7ARv5M zS7dofx%(`sjd@x1ms=*Ec$=jF6O4iif>r<7w3R2BS!2@ANq05}z1zm(Z_JR!V98*@ zkjP-pki=jF#%Vw@87K-8PhqeC(ndgeQ=kenAm1D)3X%iqvt&pGiYEirrvcR^G8k?S I|Gbh303kzRo&W#< delta 299 zcmZp8!`$$Oc|r%vil=G|H}*&xFltO*W&k8NUpKhS1mvtX-VEf#o4jWRa{Mho9A?Y2 z1_CV%n##IDwhS8j3_#Gru=zn|NS45=+Rd#0KkadzId#U~z$4$vHoIIY7SS*_HZ(I! zG%&I-H8U_sHL*xeOHMXOvrMxzHZV6ZGPOuCF-uNOHZ$IQ|3xbc3u9C5naLS%0|flC z&K&C7ch{|tA$Lwepi}DP6K}H=pn`0CP(hIDS=BrCmoJ!}vqUVtY;(}NZ7lxg48{zG z3}!%>$Y8)=#9+Z-3S=7qVJd?OkeAGm2E@rgej0-%7#joG=0I!&RB6GG0#s!Nlurd> NGX~?$;h$GB0RRk~VPpUR diff --git a/Projects/NetStandard/KeficoMailService.zip b/Projects/NetStandard/KeficoMailService.zip new file mode 100644 index 0000000000000000000000000000000000000000..c42bc1d9e5d6b1c1d7ea99c154c07551f19759c7 GIT binary patch literal 4633 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 bjDAKvi<+u + + + + Debug + AnyCPU + {63FF04EE-D1A5-4406-9267-1EE1E9FBB9E7} + Library + Properties + KeficoMailService + KeficoMailService + v4.8.1 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Projects/NetStandard/KeficoMailService/MailType.cs b/Projects/NetStandard/KeficoMailService/MailType.cs new file mode 100644 index 0000000..af123e9 --- /dev/null +++ b/Projects/NetStandard/KeficoMailService/MailType.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace KeficoMailService +{ + public enum MailType + { + Text, + Html + } +} diff --git a/Projects/NetStandard/KeficoMailService/Manager.cs b/Projects/NetStandard/KeficoMailService/Manager.cs new file mode 100644 index 0000000..093d9cb --- /dev/null +++ b/Projects/NetStandard/KeficoMailService/Manager.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Runtime.Remoting.Messaging; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace KeficoMailService +{ + public class Manager + { + public string Host { get; set; } = "https://service.kefico.co.kr"; + + public readonly string GetFormHTML = "/KEFICO.XML/MAIL/MailManager.asmx"; + public readonly string SendMailDetailHTML = "/KEFICO.XML/MAIL/MailManager.asmx"; + + public string GetFormHtml(HtmlFormType formType) + { + string result = string.Empty; + string url = $"{Host}{GetFormHTML}"; + + string soapEnvelope = $@" + + + + + {formType.SystemName} + {formType.FormType} + + + +"; + + Console.ForegroundColor = ConsoleColor.DarkYellow; + Console.WriteLine($"Request URL: {url}"); + Console.WriteLine($"Request soap: {soapEnvelope}"); + + byte[] data = Encoding.UTF8.GetBytes(soapEnvelope); + + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.Method = "POST"; + request.ContentType = "application/soap+xml; charset=utf-8"; + request.ContentLength = data.Length; + + using (Stream stream = request.GetRequestStream()) + { + stream.Write(data, 0, data.Length); + } + + using (WebResponse response = request.GetResponse()) + using (StreamReader reader = new StreamReader(response.GetResponseStream())) + { + result = reader.ReadToEnd(); + + //decode + XDocument doc = XDocument.Parse(result); + + XNamespace ns = "http://kefico.co.kr/"; + + string htmlEncoded = + doc.Descendants(ns + "GetFormHTMLResult").First().Value; + + // HTML Decode + + result = WebUtility.HtmlDecode(htmlEncoded); + result = WebUtility.HtmlDecode(htmlEncoded); + + Console.ForegroundColor = ConsoleColor.DarkGreen; + Console.WriteLine(""); + Console.WriteLine("Response"); + Console.WriteLine(result); + } + + return result; + } + + public string SendMailDetail(Address from, List
to, List
cc, List
bcc, string subject, string body, MailType type) + { + string result = string.Empty; + string url = $"{Host}{SendMailDetailHTML}"; + + string soapEnvelope = $@" + + + + + {from.AddressMail} + {from.AddressName} + + {string.Join("",to.Select(x=> $@" +
+ {x.AddressMail} + {x.AddressName} +
"))} +
+ {string.Join("",cc.Select(x => $@" +
+ {x.AddressMail} + {x.AddressName} +
"))} +
+ {string.Join("", bcc.Select(x => $@" +
+ {x.AddressMail} + {x.AddressName} +
"))} +
+ {subject} + {body} + {type.ToString()} +
+
+
"; + + Console.ForegroundColor = ConsoleColor.DarkYellow; + Console.WriteLine(""); + Console.WriteLine($"Request URL: {url}"); + Console.WriteLine($"Request soap: {soapEnvelope}"); + + byte[] data = Encoding.UTF8.GetBytes(soapEnvelope); + + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.Method = "POST"; + request.ContentType = "application/soap+xml; charset=utf-8"; + request.ContentLength = data.Length; + + using (Stream stream = request.GetRequestStream()) + { + stream.Write(data, 0, data.Length); + } + + using (WebResponse response = request.GetResponse()) + using (StreamReader reader = new StreamReader(response.GetResponseStream())) + { + result = reader.ReadToEnd(); + + //decode + XDocument doc = XDocument.Parse(result); + + XNamespace ns = "http://kefico.co.kr/"; + + string htmlEncoded = + doc.Descendants(ns + "SendMailDetailResponse").First().Value; + + //decode + result = WebUtility.HtmlDecode(htmlEncoded); + result = WebUtility.HtmlDecode(result); + + Console.ForegroundColor = ConsoleColor.DarkGreen; + Console.WriteLine(""); + Console.WriteLine("Response"); + Console.WriteLine(result); + } + + return result; + } + } +} diff --git a/Projects/NetStandard/KeficoMailService/Properties/AssemblyInfo.cs b/Projects/NetStandard/KeficoMailService/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f0a1b20 --- /dev/null +++ b/Projects/NetStandard/KeficoMailService/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 +// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 +// 이러한 특성 값을 변경하세요. +[assembly: AssemblyTitle("KeficoMailService")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("KeficoMailService")] +[assembly: AssemblyCopyright("Copyright © 2026")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. +[assembly: ComVisible(false)] + +// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. +[assembly: Guid("63ff04ee-d1a5-4406-9267-1ee1e9fbb9e7")] + +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. +// +// 주 버전 +// 부 버전 +// 빌드 번호 +// 수정 버전 +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Projects/NetStandard/NetStandard.sln b/Projects/NetStandard/NetStandard.sln index 607f8e6..5f566c4 100644 --- a/Projects/NetStandard/NetStandard.sln +++ b/Projects/NetStandard/NetStandard.sln @@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CIAMaster", "CIAMaster\CIAM EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KmsProxy", "KmsProxy\KmsProxy.csproj", "{73824ACB-4FB9-4E11-9A86-E05471B3C979}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeficoMailService", "KeficoMailService\KeficoMailService.csproj", "{63FF04EE-D1A5-4406-9267-1EE1E9FBB9E7}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -33,6 +35,10 @@ Global {73824ACB-4FB9-4E11-9A86-E05471B3C979}.Debug|Any CPU.Build.0 = Debug|Any CPU {73824ACB-4FB9-4E11-9A86-E05471B3C979}.Release|Any CPU.ActiveCfg = Release|Any CPU {73824ACB-4FB9-4E11-9A86-E05471B3C979}.Release|Any CPU.Build.0 = Release|Any CPU + {63FF04EE-D1A5-4406-9267-1EE1E9FBB9E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {63FF04EE-D1A5-4406-9267-1EE1E9FBB9E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63FF04EE-D1A5-4406-9267-1EE1E9FBB9E7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {63FF04EE-D1A5-4406-9267-1EE1E9FBB9E7}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Projects/NetStandard/PlayGround.NetFramework/PlayGround.NetFramework.csproj b/Projects/NetStandard/PlayGround.NetFramework/PlayGround.NetFramework.csproj index 10dc7ea..393ed57 100644 --- a/Projects/NetStandard/PlayGround.NetFramework/PlayGround.NetFramework.csproj +++ b/Projects/NetStandard/PlayGround.NetFramework/PlayGround.NetFramework.csproj @@ -58,6 +58,10 @@ {0bdb3e8c-2f57-4780-8b6f-3ae3f426a6c3} CPMeta + + {63ff04ee-d1a5-4406-9267-1ee1e9fbb9e7} + KeficoMailService + {73824acb-4fb9-4e11-9a86-e05471b3c979} KmsProxy diff --git a/Projects/NetStandard/PlayGround.NetFramework/Program.cs b/Projects/NetStandard/PlayGround.NetFramework/Program.cs index 5accd97..3184846 100644 --- a/Projects/NetStandard/PlayGround.NetFramework/Program.cs +++ b/Projects/NetStandard/PlayGround.NetFramework/Program.cs @@ -1,6 +1,8 @@ using CPMeta.Models; +using KeficoMailService; using Newtonsoft.Json; using System; +using System.Collections.Generic; using System.Threading.Tasks; namespace PlayGround.NetFramework @@ -9,28 +11,52 @@ namespace PlayGround.NetFramework { static void Main(string[] args) { - //global set - string host = "192.168.0.42"; + //html Send + Manager manager = new Manager(); - //random value - string ProductId = "00010032-87a4-45ca-b627-b975d41e35df"; - // string Mac1 = Guid.NewGuid().ToString(); - // string Mac2 = Guid.NewGuid().ToString(); + Address from = new Address { AddressMail = "TraNotify@kefico.co.kr", AddressName = "" }; + List
to = new List
{ new Address { AddressMail = "systemx.kjh@systemx.co.kr", AddressName = "" } }; + List
cc = new List
{ new Address { AddressMail = "systemx.shm@systemx.co.kr", AddressName = "" } }; + List
bcc = new List
{ }; + + string subject = "TRA 테스트용 메일"; + string textSend = manager.SendMailDetail(from, to, cc, bcc, subject, "Tra Notify", MailType.Text); - //Get - Task.Run(async () => - { - var res2 = await CPMeta.CPMeta.HealthCheck(host); - // var res2 = await CPMeta.CPMeta.GetWbmsMetaByProductId(host, ProductId); + // string form = manager.GetFormHtml(new HtmlFormType { FormType="", SystemName="" }); - Console.ForegroundColor = ConsoleColor.DarkBlue; - Console.WriteLine($"Response: {res2} (Trace Guid:)"); - Console.ForegroundColor = ConsoleColor.White; + //form = form.Replace("@HEADTITLE@", "헤드타이틀"); + //form = form.Replace("@TITLE@", "타이틀"); + //form = form.Replace("@BODY@", "내용"); + //form = form.Replace("@URL@", "링크"); + // string htmlSend = manager.SendMailDetail(from, to, cc, bcc, subject, form, MailType.Html); - // var res3 = await CPMeta.CPMeta.GetWbmsMetaByMacAddress(host, Mac1); - // var res4 = await CPMeta.CPMeta.GetWbmsMetaByMacAddress(host, Mac2); - }).Wait(); + + //Text Send + + + // //global set + // string host = "192.168.0.42"; + + // //random value + // string ProductId = "00010032-87a4-45ca-b627-b975d41e35df"; + // // string Mac1 = Guid.NewGuid().ToString(); + //// string Mac2 = Guid.NewGuid().ToString(); + + // //Get + // Task.Run(async () => + // { + // var res2 = await CPMeta.CPMeta.HealthCheck(host); + + // // var res2 = await CPMeta.CPMeta.GetWbmsMetaByProductId(host, ProductId); + + // Console.ForegroundColor = ConsoleColor.DarkBlue; + // Console.WriteLine($"Response: {res2} (Trace Guid:)"); + // Console.ForegroundColor = ConsoleColor.White; + + // // var res3 = await CPMeta.CPMeta.GetWbmsMetaByMacAddress(host, Mac1); + // // var res4 = await CPMeta.CPMeta.GetWbmsMetaByMacAddress(host, Mac2); + // }).Wait(); return; diff --git a/Projects/SystemX.Core/SystemX.Core/Services/HttpService.cs b/Projects/SystemX.Core/SystemX.Core/Services/HttpService.cs index 7aa7cb0..589b1af 100644 --- a/Projects/SystemX.Core/SystemX.Core/Services/HttpService.cs +++ b/Projects/SystemX.Core/SystemX.Core/Services/HttpService.cs @@ -139,7 +139,7 @@ namespace SystemX.Core.Services return response; } - protected HttpClientHandler GetClientHandler() + protected virtual HttpClientHandler GetClientHandler() { HttpClientHandler clientHandler = new HttpClientHandler(); clientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) => @@ -150,7 +150,7 @@ namespace SystemX.Core.Services return clientHandler; } - protected short SetTimeout(short timeOutSeconds) + protected virtual short SetTimeout(short timeOutSeconds) { short timeoutMin = 5; short timeoutMax = 30; diff --git a/Projects/WebApi/WebApi.Project.ProxyKMS/Models/ProxyKMSConfig.cs b/Projects/WebApi/WebApi.Project.ProxyKMS/Models/ProxyKMSConfig.cs index 6bbe8ac..24bcf6d 100644 --- a/Projects/WebApi/WebApi.Project.ProxyKMS/Models/ProxyKMSConfig.cs +++ b/Projects/WebApi/WebApi.Project.ProxyKMS/Models/ProxyKMSConfig.cs @@ -12,6 +12,10 @@ namespace WebApi.Project.ProxyKMS.Models public string ApiName { get; set; } = string.Empty; public List Functions { get; set; } = new List(); + + public bool CertificateVerify { get; set; } = false; + public string CertPemPath { get; set; } = string.Empty; + public string CertKeyPath { get; set; } = string.Empty; } public class Function diff --git a/Projects/WebApi/WebApi.Project.ProxyKMS/Services/KmsService.cs b/Projects/WebApi/WebApi.Project.ProxyKMS/Services/KmsService.cs index 179fc11..e05e77c 100644 --- a/Projects/WebApi/WebApi.Project.ProxyKMS/Services/KmsService.cs +++ b/Projects/WebApi/WebApi.Project.ProxyKMS/Services/KmsService.cs @@ -1,5 +1,7 @@ using System; +using System.Net.Http; using System.Runtime.CompilerServices; +using System.Security.Cryptography.X509Certificates; using SystemX.Core.DB; using SystemX.Core.Services; using WebApi.Library.Enums; @@ -51,5 +53,95 @@ namespace WebApi.Project.ProxyKMS.Services return response; } + + + public override async Task PostJsonAsync(string url, REQUEST request, short timeOutSeconds = 5) where REQUEST : class where RESPONSE : class + { + RESPONSE response = null; + Guid guid = Guid.NewGuid(); + using (HttpClient httpClient = new HttpClient(GetClientHandler())) + { + try + { + short timeOutSec = SetTimeout(timeOutSeconds); + httpClient.Timeout = new TimeSpan(0, 0, timeOutSec); + httpClient.BaseAddress = new Uri(url ?? ""); + LogXnet.WriteLine($"[POST] Request({guid})::{url}{Environment.NewLine}{request?.ToJson()}", LogXLabel.HTTP); + DateTime requestTime = DateTime.Now; + response = await (await httpClient.PostAsJsonAsync(url, request)).Content.ReadFromJsonAsync(); + LogXnet.WriteLine($"[POST] Rseponse({guid}) ({(DateTime.Now - requestTime).TotalSeconds} sec)::{url}{Environment.NewLine}{response?.ToJson()}", LogXLabel.HTTP); + } + catch (Exception e) + { + LogXnet.WriteLine(e); + LogXnet.WriteLine(e?.InnerException?.InnerException?.Message, LogXLabel.Exception); + } + } + + return response; + } + + public virtual async Task PutJsonAsync(string url, REQUEST request, short timeOutSeconds = 5) where REQUEST : class where RESPONSE : class + { + RESPONSE? response = default(RESPONSE); + Guid guid = Guid.NewGuid(); + + using (HttpClient httpClient = new HttpClient(GetClientHandler())) + { + try + { + var timeOutSec = SetTimeout(timeOutSeconds); + httpClient.Timeout = new TimeSpan(0, 0, timeOutSec); + httpClient.BaseAddress = new Uri($"{url}"); + + LogXnet.WriteLine($"[PUT] Request({guid})::{url}{Environment.NewLine}{request?.ToJson()}", LogXLabel.HTTP); + + DateTime requestTime = DateTime.Now; + var res = await httpClient.PutAsJsonAsync(url, request); + response = await res.Content.ReadFromJsonAsync(); + + LogXnet.WriteLine($"[PUT] Rseponse({guid}) ({(DateTime.Now - requestTime).TotalSeconds} sec)::{url}{Environment.NewLine}{response?.ToJson()}", LogXLabel.HTTP); + } + catch (Exception e) + { + LogXnet.WriteLine(e); + LogXnet.WriteLine(e?.InnerException?.InnerException?.Message, LogXLabel.Exception); + } + } + + return response; + } + + protected override HttpClientHandler GetClientHandler() + { + HttpClientHandler clientHandler = new HttpClientHandler(); + + //인증서가 경로에 있으면 + if (File.Exists(KmsApi.CertPemPath) == true && File.Exists(KmsApi.CertKeyPath) == true) + { + Console.WriteLine($"Cert.Pem Path:{KmsApi.CertPemPath}", LogXLabel.Debug); + Console.WriteLine($"Cert.Key Path:{KmsApi.CertKeyPath}", LogXLabel.Debug); + var cert = X509Certificate2.CreateFromPemFile(KmsApi.CertPemPath, KmsApi.CertKeyPath); + cert = new X509Certificate2(cert.Export(X509ContentType.Pkcs12)); + clientHandler.ClientCertificates.Add(cert); + } + else + { + Console.WriteLine($"File not exist. Cert.Pem Path:{KmsApi.CertPemPath}", LogXLabel.Warning); + Console.WriteLine($"File not exist. Cert.Key Path:{KmsApi.CertKeyPath}", LogXLabel.Warning); + } + + //ssl 인증서 무시 + Console.WriteLine($"CertificateVerify:{KmsApi.CertificateVerify}", LogXLabel.Debug); + if (KmsApi.CertificateVerify == false) + { + clientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) => + { + return true; + }; + } + + return clientHandler; + } } }