성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[tree soap] 아차! f는 기억이 나는데, m은 ㅜㅜ 감사합니다!!! ^...
[정성태] 'm'은 decimal 타입의 숫자에 붙는 접미사입니다. ...
[정성태] https://lxr.sourceforge.io/ http...
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>아웃룩 사용자를 위한 중국어 스팸 필터 Add-in</h1> <p> 최근 들어 중국어 스팸 메일이 부쩍 늘었습니다. 아웃룩의 "Junk Email Options" / "International" / "Blocked Encoding List..." 기능을 이용해 중국어 문자(Chinese Simplified, Chinese Traditional)를 블록시켰지만 통하지 않았습니다. 검색해 보니, 해당 기능은 유니코드 인코딩된 메일에 대해서는 유효하지 않다고! ^^;<br /> <br /> 도메인명 기준으로 스팸 처리하는 것도 슬슬 귀찮아집니다. 왜냐하면, 심지어 .org에서도 스팸이 오는 등 꽤나 다양한 도메인에서 오기 때문입니다. 그런데, 의외인 것은 검색을 해도 아웃룩에 대해 중국어 스팸 필터 확장이 없다는 것입니다. (물론, 있을지도 모릅니다.) 그래서 그냥 만들어 버렸습니다. ^^;<br /> <br /> 방법은 대강 다음의 문서에 있으니,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Walkthrough: Creating Your First VSTO Add-In for Outlook ; <a target='tab' href='https://learn.microsoft.com/en-us/visualstudio/vsto/walkthrough-creating-your-first-vsto-add-in-for-outlook'>https://learn.microsoft.com/en-us/visualstudio/vsto/walkthrough-creating-your-first-vsto-add-in-for-outlook</a> </pre> <br /> 비주얼 스튜디오에서 "Visual C#" / "Office/SharePoint" / "VSTO Add-ins"의 "Outlook 2013 and 2016 VSTO Add-in" 프로젝트를 선택해 메일이 왔을 때의 이벤트 처리를 추가하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > How to: Programmatically Perform Actions When an E-Mail Message Is Received ; <a target='tab' href='https://learn.microsoft.com/en-us/visualstudio/vsto/how-to-programmatically-perform-actions-when-an-e-mail-message-is-received'>https://learn.microsoft.com/en-us/visualstudio/vsto/how-to-programmatically-perform-actions-when-an-e-mail-message-is-received</a> </pre> <br /> 메일의 제목에 2개 이상의 중국어 문자가 포함된 경우 스팸 메일로 간주하고 '정크 메일' 함으로 보내게 했습니다. 다음은 그에 대한 소스 코드입니다.<br /> <br /> <pre style='height: 400px; margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using Outlook = Microsoft.Office.Interop.Outlook; namespace CharacterRangeFilter { public partial class ThisAddIn { Outlook.NameSpace outlookNameSpace; Outlook.MAPIFolder inbox; Outlook.Items items; private void ThisAddIn_Startup(object sender, System.EventArgs e) { outlookNameSpace = this.Application.GetNamespace("MAPI"); inbox = outlookNameSpace.GetDefaultFolder( Microsoft.Office.Interop.Outlook. OlDefaultFolders.olFolderInbox); items = inbox.Items; items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(items_ItemAdd); } void items_ItemAdd(object Item) { Outlook.MailItem mail = (Outlook.MailItem)Item; if (Item != null) { if (mail.MessageClass == "IPM.Note") { if (HasChineseCharacters2More(mail) == true) { mail.Move(outlookNameSpace.GetDefaultFolder( Microsoft.Office.Interop.Outlook. OlDefaultFolders.olFolderJunk)); } } } } private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { } bool HasChineseCharacters2More(Outlook.MailItem mail) { if (string.IsNullOrEmpty(mail.Subject) == true) { return false; } string title = mail.Subject; int count = 0; // https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%EB%B8%94%EB%A1%9D foreach (char ch in title) { switch (ch) { case char i when i >= 0x2e80 && i <= 0x2eff: // CJK Radicals Supplement count++; break; case char i when i >= 0x2f00 && i <= 0x2fdf: // Kangxi Radicals count++; break; case char i when i >= 0x3000 && i <= 0x303f: // CJK Symbols and Punctuation count++; break; case char i when i >= 0x3400 && i <= 0x4dbf: // CJK Unified Ideographs Extension A count++; break; case char i when i >= 0x4e00 && i <= 0x9fff: // CJK Unified Ideographs count++; break; // for now, except for 2 SIP area /* 2 SIP U+20000..U+2A6DF CJK Unified Ideographs Extension B 2 SIP U+2A700..U+2B73F CJK Unified Ideographs Extension C 2 SIP U+2B740..U+2B81F CJK Unified Ideographs Extension D 2 SIP U+2B820..U+2CEAF CJK Unified Ideographs Extension E 2 SIP U+2CEB0..U+2EBEF CJK Unified Ideographs Extension F 2 SIP U+2F800..U+2FA1F CJK Compatibility Ideographs Supplement */ } } return count > 1; } #region VSTO generated code private void InternalStartup() { this.Startup += new System.EventHandler(ThisAddIn_Startup); this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); } #endregion } } </pre> <br /> 규칙이 매우 간단한데, 일단 저 혼자 쓸 것이므로 이 정도면 충분하기에 정한 기준입니다. 위의 소스 코드는 현재 github에도 올렸으니, 사용자 정의 조건을 설정하는 창을 만들어 pull request를 보내주시면 언제든 ^^ 반영해드리겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > stjeong/CharacterRangeFilter ; <a target='tab' href='https://github.com/stjeong/CharacterRangeFilter'>https://github.com/stjeong/CharacterRangeFilter</a> </pre> <br /> 컴파일된 바이너리는 클릭원스를 이용했습니다. (VSTO add-in을 ClickOnce로 배포할 수 있다는 것은 처음 알았군요. ^^)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Deploying an Office Solution by Using ClickOnce ; <a target='tab' href='https://learn.microsoft.com/en-us/visualstudio/vsto/deploying-an-office-solution-by-using-clickonce'>https://learn.microsoft.com/en-us/visualstudio/vsto/deploying-an-office-solution-by-using-clickonce</a> </pre> <br /> 위의 문서에 보면 VSTOInstaller를 이용한 방법도 나오는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > %commonprogramfiles%\microsoft shared\VSTO\10.0\VSTOInstaller.exe </pre> <br /> 이번에는 그냥 ClickOnce로 했습니다. 하는 김에 Office Store에도 넣으려고 했는데 ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Make your solutions available in Microsoft AppSource and within Office ; <a target='tab' href='https://learn.microsoft.com/en-us/office/dev/store/submit-to-appsource-via-partner-center'>https://learn.microsoft.com/en-us/office/dev/store/submit-to-appsource-via-partner-center</a> </pre> <br /> 아쉽게도 지금 개발자 인증에 문제가 있어서 포기했습니다. (혹시, 다음번 기회가 되면 경험 삼아 올려봐야겠습니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 그냥 설치만 하고 싶으신 분들은, 다음의 절차를 따라야 합니다.<br /> <br /> <span style='text-decoration: line-through'> 우선 인증서가 문제인데요, 제가 개인적인 목적으로 만든 것이라 정식 인증서 발급까지 받지는 못했습니다. 따라서, 테스트 인증서를 여러분들의 로컬 PC에 설치해야 하는데, 이를 위해 다음의 인증서를 다운로드하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <a target='tab' href='http://sysnet.blob.core.windows.net/temp/stjeong.cer'>http://sysnet.blob.core.windows.net/temp/stjeong.cer</a> </pre> <br /> 관리자 권한의 cmd.exe 명령행 프롬프트를 띄운 후 다음과 같은 명령어로 등록해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp><span style='color: blue; font-weight: bold'>certmgr.exe -add stjeong.cer -c -s -r localMachine Root</span> CertMgr Succeeded C:\temp><span style='color: blue; font-weight: bold'>certmgr.exe -add stjeong.cer -c -s -r localMachine TrustedPublisher</span> CertMgr Succeeded </pre> </span> <br /> [업데이트: 2018-10-04] <a target='tab' href='https://www.sysnet.pe.kr/2/0/11719'>위의 과정을 처리</a>해 주는 CertMgr2.exe를 만들었으니 <a href='http://sysnet.blob.core.windows.net/temp/office/CertMgr2.zip'>http://sysnet.blob.core.windows.net/temp/office/CertMgr2.zip</a> 파일을 다운로드 해 압축을 푼 후 실행만 하면 됩니다.<br /> <br /> 그다음, 아래의 경로를 방문해 setup.exe를 실행해 주면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <a target='tab' href='http://sysnet.blob.core.windows.net/temp/office/setup.exe'>http://sysnet.blob.core.windows.net/temp/office/setup.exe</a> </pre> <br /> 정상적으로 설치된 경우, 아웃룩의 "Options" / "Add-ins" 영역에 다음과 같이 "CharacterRangeFilter" 확장이 보일 것입니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='china_spam_filter_for_outlook_1.png' src='/SysWebRes/bbs/china_spam_filter_for_outlook_1.png' /><br /> <br /> 참고로, 테스트는 Windows 10 + .NET Framework 4.5.2 + 아웃룩 2016에서 한 것입니다. 그 외의 환경에서는 안 될 수도 있습니다<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
8503
(왼쪽의 숫자를 입력해야 합니다.)