TNB Library
TnbMailContent.h
[詳解]
1#pragma once
11#include "TnbStrVector.h"
12#include "TnbStrOperator.h"
13#include "TnbJisStr.h"
14#include "TnbBase64Str.h"
15#include "TnbTime.h"
16#include "TnbFile.h"
17#include "TnbMap.h"
18#include "TnbStrEx.h"
19
20
21
22//TNB Library
23namespace TNB
24{
25
26
27
42{
43 CAscii m_ascAddress;
44 CAscii m_ascName;
45public:
46
49 {
50 }
51
57 CMailAddress(CAscii ascAddress, CAscii ascName = "") : m_ascAddress(ascAddress), m_ascName(ascName)
58 {
59 }
60
65 CAscii GetAddress(void) const
66 {
67 return m_ascAddress;
68 }
69
74 CAscii GetName(void) const
75 {
76 return m_ascName;
77 }
78
85 bool SetAddress(const CAscii& ascAddress)
86 {
87 m_ascAddress = ascAddress;
88 return IsValid();
89 }
90
95 void SetName(const CAscii& ascName)
96 {
97 m_ascName = ascName;
98 }
99
105 bool IsValid(void) const
106 {
107 if ( ! m_ascAddress.IsEmpty() && STRLIB::IsAsciiOnly(m_ascAddress) )
108 {
109 return true;
110 }
111 return false;
112 }
113
120 {
121 if ( m_ascName.IsEmpty() )
122 {
123 return m_ascAddress;
124 }
125 return CAscii::Fmt("%s <%s>", m_ascName, m_ascAddress);
126 }
127
134 bool SetSenderPath(LPCSTR path)
135 {
136 CAscii s = path;
137 INT_PTR f0 = s.Find('<');
138 INT_PTR f1 = s.Find('>', f0);
139 if ( f0 >= 0 && f1 > f0 )
140 {
141 m_ascName = s.Left(f0);
142 m_ascName.TrimRight(' ');
143 m_ascAddress = s.Mid(f0 + 1, (f1 - f0) - 1);
144 return true;
145 }
146 return false;
147 }
148};
149
150
151
202{
203 CAscii m_ascMailerName;
204 CMailAddress m_addrFrom;
205 CMailAddress m_addrReply;
206 enum{ TO = 0, CC = 1, BCC = 2, KINDMAX = 3 };
207 CVectorT<CMailAddress> m_aaddrTo[KINDMAX];
208 CAscii m_ascSubject;
209 CAsciiVector m_vascContents;
210 CMapT<CAscii,CByteVector> m_mapFileDatas;
211 CAsciisMap m_mapUnknownCmd;
212
219 CAscii m_FromBase64(const CAscii& ascSrc) const
220 {
221 CAscii ascRc;
222 const int TAGSIZE = sizeof("=?ISO-2022-JP?B?") - 1;
223 CBase64Str base64;
224 CAscii asc = ascSrc;
225 while ( ! asc.IsEmpty() )
226 {
227 INT_PTR f = asc.Find("=?");
228 if ( f < 0 )
229 {
230 break;
231 }
232 INT_PTR e = asc.Find("?=", f);
233 if ( e < 0 )
234 {
235 break;
236 }
237 if ( f > 0 )
238 {
239 ascRc += asc.Left(f);
240 }
241 if ( asc.Mid(f, TAGSIZE).IsEqualNoCase("=?ISO-2022-JP?B?") )
242 {
243 CJisStr jis;
244 jis.SetOfJis(base64.DecodeForStr(asc.Mid(f + TAGSIZE, e - f - TAGSIZE)));
245 ascRc += jis.ToAscii();
246 }
247 else
248 {
249 ascRc += asc.Left(e + 2);
250 }
251 asc = asc.Mid(e + 2);
252 }
253 ascRc += asc;
254 asc.Empty();
255 return ascRc;
256 }
257
272 CAscii m_ToBase64(const CAscii& ascSrc) const
273 {
274 CAscii ascRc;
275 if ( ! ascSrc.IsEmpty() )
276 {
277 CAscii asc = ascSrc;
278 while ( asc.GetLength() > 30 )
279 {
280 CAscii a = asc.Left(30);
281 if ( STRLIB::IsAsciiOnly(a) && a.Find(',') < 0 )
282 {
283 ascRc += CAscii::Fmt("%s\r\n ", a);
284 }
285 else
286 {
287 ascRc += CAscii::Fmt("=?ISO-2022-JP?B?%s?=\r\n ", CBase64Str().Encode(CJisStr::ToJis(a)));
288 }
289 asc = asc.Mid(a.GetLength());
290 }
291 if ( STRLIB::IsAsciiOnly(asc) && asc.Find(',') < 0 )
292 {
293 ascRc += asc;
294 }
295 else
296 {
297 ascRc += CAscii::Fmt("=?ISO-2022-JP?B?%s?=", CBase64Str().Encode(CJisStr::ToJis(asc)));
298 }
299 }
300 return ascRc;
301 }
302
309 CAscii m_FmtAddr(const CMailAddress& addr) const
310 {
311 return CAscii::Fmt("%s <%s>", m_ToBase64(addr.GetName().TrimRight()), addr.GetAddress());
312 }
313
319 CAscii m_MakeMultiPartString(void) const
320 {
322 return CAscii::Fmt("-----MultiPart_%s_", CBase64Str().Encode(CAscii(time.Format())));
323 }
324
325 //-- 以下データ解析用
326
327 /*
328 * ヘッダ分離.
329 * 1)空行があるまでをヘッダと認識.
330 * 2)空文字で始める行を上の行の続きとする.
331 * 3)ascContent からヘッダ部を削除。
332 * @param[in,out] _ascContent コンテンツ
333 * @return ヘッダ
334 */
335 CAsciiVector m_SeparateHead(CAsciiVector& _ascContent)
336 {
337 CAsciiVector vaHead;
338 size_t i = 0;
339 while ( true )
340 {
341 if ( i >= _ascContent.GetSize() )
342 {
343 // 最後まで行った。
344 ASSERT(false);//全部ヘッダ?ちとおかしい
345 _ascContent.RemoveAll();
346 break;
347 }
348 const CAscii& asc = _ascContent[i];
349 if ( asc.IsEmpty() )
350 {
351 _ascContent = _ascContent.Mid(i + 1);
352 break;
353 }
354 if ( asc[0] == ' ' || asc[0] == '\t' )
355 {
356 //= 頭空行、前のコマンドに連結
357 if ( ! vaHead.IsEmpty() )
358 {
359 CAscii a = asc;
360// a.TrimLeft(' ').TrimLeft('\t');
361 a.TrimLeft(" \t");
362 vaHead[vaHead.GetSize() - 1] += a;
363 }
364 else
365 {
366 ASSERT(false); // 無視するしか・・・
367 }
368 }
369 else if ( asc.Find(':') >= 1 )
370 {
371 //= パラメータあり
372 vaHead.Add(asc);
373 }
374 else
375 {
376 //= それ以外.. 無視するしか...
377 ASSERT(false);
378 }
379 i++;
380 }
381 return vaHead;
382 }
383
388 CVectorT<CMailAddress> m_AnalyzAddrLine(const CAscii& aParam)
389 {
392 loop ( i, va.GetSize() )
393 {
394 CAscii asc = m_FromBase64(va[i]);
395 INT_PTR f = asc.ReverseFind('<');
396 if ( f >= 0 )
397 {
398 INT_PTR e = asc.Find('>', f);
399 if ( e >= 0 )
400 {
401 TRACE2A("Found: MailAddr[%s] Name[%s]\n", asc.Mid(f + 1, e - f - 1), asc.Left(f).TrimRight());
402 vAddr.Add(CMailAddress(asc.Mid(f + 1, e - f - 1), asc.Left(f).TrimRight()));
403 continue;
404 }
405 }
406 vAddr.Add(CMailAddress("", asc));
407 }
408 return vAddr;
409 }
410
418 bool m_AnalyzHeadLine(const CAscii& aCmd, const CAscii& aParam)
419 {
420 bool boRc = false;
421 if ( aCmd.IsEqual("from") )
422 {
423 CVectorT<CMailAddress> vAddr = m_AnalyzAddrLine(aParam);
424 if ( vAddr.GetSize() >= 1 )
425 {
426 ASSERT(vAddr.GetSize() == 1);
427 boRc = SetFromMailAddr(vAddr[0]);
428 }
429 }
430 else if ( aCmd.IsEqual("reply-to") )
431 {
432 CVectorT<CMailAddress> vAddr = m_AnalyzAddrLine(aParam);
433 if ( vAddr.GetSize() >= 1 )
434 {
435 ASSERT(vAddr.GetSize() == 1);
436 boRc = SetReplyMailAddr(vAddr[0].GetAddress());
437 }
438 }
439 else if ( aCmd.IsEqual("to") )
440 {
441 CVectorT<CMailAddress> vAddr = m_AnalyzAddrLine(aParam);
442 if ( vAddr.GetSize() >= 1 )
443 {
444 boRc = true;
445 loop ( i, vAddr.GetSize() )
446 {
447 boRc &= AddToMailAddr(vAddr[i]);
448 }
449 }
450 }
451 else if ( aCmd.IsEqual("cc") )
452 {
453 CVectorT<CMailAddress> vAddr = m_AnalyzAddrLine(aParam);
454 if ( vAddr.GetSize() >= 1 )
455 {
456 boRc = true;
457 loop ( i, vAddr.GetSize() )
458 {
459 boRc &= AddCcMailAddr(vAddr[i]);
460 }
461 }
462 }
463 else if ( aCmd.IsEqual("bcc") )
464 {
465 CVectorT<CMailAddress> vAddr = m_AnalyzAddrLine(aParam);
466 if ( vAddr.GetSize() >= 1 )
467 {
468 boRc = true;
469 loop ( i, vAddr.GetSize() )
470 {
471 boRc &= AddBccMailAddr(vAddr[i]);
472 }
473 }
474 }
475 else if ( aCmd.IsEqual("subject") )
476 {
477 CAscii a = m_FromBase64(aParam);
478 TRACE1A("Found: Subject[%s]\n", a);
479 SetSubject(a);
480 boRc = true;
481 }
482 else if ( aCmd.IsEqual("x-mailer") )
483 {
484 TRACE1A("Found: X-Mailer[%s]\n", aParam);
485 SetMailerName(aParam);
486 boRc = true;
487 }
488 return boRc;
489 }
490
498 CAsciiVector m_AnalyzParamLine(const CAscii& aParam)
499 {
500 CAsciiVector va;
501 INT_PTR f = aParam.Find(';');
502 if ( f < 0 )
503 {
504 va.Invalid();
505 return va;
506 }
507 INT_PTR e = aParam.Find('=', f);
508 if ( e < 0 )
509 {
510 va.Invalid();
511 return va;
512 }
513 va.Add(LowerString(aParam.Left(f)));
514 va.Add(LowerString(aParam.Mid(f + 1, e - f - 1).TrimLeft()));
515 CAscii a = aParam.Mid(e + 1);
516// a.TrimLeft().TrimLeft('\042');
517// a.TrimRight().TrimRight('\042');
518 a.Trim(" \042");
519 va.Add(m_FromBase64(a));
520 TRACE3A("Analyz Param: %s; %s=\042%s\042\n", va[0], va[1], va[2]);
521 return va;
522 }
523
531 bool m_SetContent(CAsciiVector& _vaContent, CAsciisMap& _mapUnknownCmd)
532 {
533 //= ヘッダを分離
534 CAsciiVector vaHead = m_SeparateHead(_vaContent);
535 //= ヘッダを解析
536 loop ( i, vaHead.GetSize() )
537 {
538 const CAscii& a = vaHead[i];
539 CAscii aParam;
540 CAscii aCmd = LowerString(a.FindCut(':', &aParam));
541 aParam.TrimLeft();
542 TRACE2A("Found: Cmd[%s] = [%s]\n", aCmd, aParam);
543 //
544 if ( ! m_AnalyzHeadLine(aCmd, aParam) )
545 {
546 _mapUnknownCmd[aCmd] = aParam;
547 }
548 }
549 //
550 if ( ! _mapUnknownCmd.HasKey("content-type") )
551 {
552 return false;
553 }
554 CAsciiVector vaType = m_AnalyzParamLine(_mapUnknownCmd["content-type"]);
555 if ( vaType.GetSize() == 3 && vaType[0].Find("multipart") == 0 && vaType[1].IsEqual("boundary") )
556 {
557 //== マルチパートだ!
558 CAscii aBound = CAscii::Fmt("--%s", vaType[2]);
559 CAscii aBoundLast = aBound + "--";
560 CAsciisMap mapTempCmd;
561 INDEX line = _vaContent.Find(aBound) + 1;
562 bool boCanNext = true;
563 while ( boCanNext )
564 {
565 INDEX f = _vaContent.Find(aBound, line);
566 if ( f == INVALID_INDEX )
567 {
568 f = _vaContent.Find(aBoundLast, line);
569 if ( f == INVALID_INDEX )
570 {
571 return false;
572 }
573 boCanNext = false;
574 }
575 mapTempCmd.RemoveAll();
576 if ( ! m_SetContent(_vaContent.Mid(line, f - line), mapTempCmd) ) //再帰呼び出し
577 {
578 return false;
579 }
580 line = f + 1;
581 }
582 return true;
583 }
584 if ( vaType.GetSize() == 3 && vaType[0].Find("text") == 0 && vaType[1].IsEqual("charset") )
585 {
586 //== テキストパートだ!
587 ASSERT(! vaType[2].IsEmpty());
588 ASSERT(! _mapUnknownCmd["content-transfer-encoding"].IsEmpty());
589 CAscii aRc;
590 CJisStr jis;
591 loop ( i, _vaContent.GetSize() )
592 {
593 const CAscii& a = _vaContent[i];
594 if ( a.IsEqual(".") )
595 {
596 break;
597 }
598 if ( i != 0 )
599 {
600 aRc += "\r\n";
601 }
602 if ( a.IsEqual("..") )
603 {
604 aRc += ".";
605 }
606 else
607 {
608 jis.SetOfJis(a);
609 aRc += jis.ToAscii();
610 }
611 }
612 AddSendTextData(aRc);
613 return true;
614 }
615 if ( ! _mapUnknownCmd.HasKey("content-disposition") )
616 {
617 return false;
618 }
619 CAsciiVector vaDisp = m_AnalyzParamLine(_mapUnknownCmd["content-disposition"]);
620 if ( vaDisp.GetSize() != 3 )
621 {
622 return false;
623 }
624 if ( vaDisp[0].IsEqual("attachment") && vaDisp[1].IsEqual("filename") )
625 {
626 ASSERT(_mapUnknownCmd["content-transfer-encoding"].IsEqualNoCase("base64"));
627 CAscii a;
628 loop ( i, _vaContent.GetSize() )
629 {
630 a += _vaContent[i];
631 }
632 CBase64Str base64;
633 AddSendBinaryData(vaDisp[2], base64.Decode(a));
634 return true;
635 }
636 return false;
637 }
638
639public:
640
642 CMailContent(void) : m_ascMailerName("TNB Tiny Mailer")
643 {
644 }
645
648
653 void Init(void)
654 {
655 CMailContent s;
656 *this = s;
657 }
658
667 bool SetFromMailAddr(const CAscii& ascFromAddr, const CAscii& ascFromName = "")
668 {
669 m_addrFrom.SetAddress(ascFromAddr);
670 m_addrFrom.SetName(ascFromName);
671 return m_addrFrom.IsValid();
672 }
673
682 {
683 m_addrFrom = addr;
684 return m_addrFrom.IsValid();
685 }
686
694 bool SetReplyMailAddr(const CAscii& ascReply = "")
695 {
696 return m_addrReply.SetAddress(ascReply);
697 }
698
704 void SetMailerName(const CAscii& ascMailerName)
705 {
706 m_ascMailerName = ascMailerName;
707 }
708
713 void InitToMailAddr(void)
714 {
715 m_aaddrTo[TO].RemoveAll();
716 m_aaddrTo[CC].RemoveAll();
717 m_aaddrTo[BCC].RemoveAll();
718 }
719
728 bool AddToMailAddr(const CMailAddress& addr)
729 {
730 if ( addr.IsValid() )
731 {
732 return m_aaddrTo[TO].Add(addr) != INVALID_INDEX;
733 }
734 return false;
735 }
736
746 bool AddToMailAddr(const CAscii& ascToAddr, const CAscii& ascToName = "")
747 {
748 return AddToMailAddr(CMailAddress(ascToAddr, ascToName));
749 }
750
758 bool AddCcMailAddr(const CMailAddress& addr)
759 {
760 if ( addr.IsValid() )
761 {
762 return m_aaddrTo[CC].Add(addr) != INVALID_INDEX;
763 }
764 return false;
765 }
766
775 bool AddCcMailAddr(const CAscii& ascCcAddr, const CAscii& ascCcName = "")
776 {
777 return AddCcMailAddr(CMailAddress(ascCcAddr, ascCcName));
778 }
779
787 bool AddBccMailAddr(const CMailAddress& addr)
788 {
789 if ( addr.IsValid() )
790 {
791 return m_aaddrTo[BCC].Add(addr) != INVALID_INDEX;
792 }
793 return false;
794 }
795
804 bool AddBccMailAddr(const CAscii& ascBccAddr, const CAscii& ascBccName = "")
805 {
806 return AddBccMailAddr(CMailAddress(ascBccAddr, ascBccName));
807 }
808
813 void SetSubject(const CAscii& ascSubject)
814 {
815 m_ascSubject = ascSubject;
816 }
817
822 void InitSendData(void)
823 {
824 m_vascContents.RemoveAll();
825 m_mapFileDatas.RemoveAll();
826 }
827
836 void AddSendTextData(const CAscii& ascText)
837 {
838 m_vascContents.Add(ascText);
839 }
840
847 void AddSendBinaryData(const CAscii& ascFileName, const CByteVector& vb)
848 {
849 if ( ! ascFileName.IsEmpty() )
850 {
851 m_mapFileDatas[ascFileName] = vb;
852 }
853 }
854
863 bool AddSendFileData(LPCTSTR lpszFile)
864 {
865 CStr fname = lpszFile;
866 CFileReader file;
867 if ( file.Open(fname) )
868 {
869 CByteVector vb = file.ReadInto();
870 if ( ! vb.IsEmpty() )
871 {
872// INT_PTR l = fname.ReverseFind('\\');
873// if ( l < 0 )
874// {
875// l = fname.ReverseFind('/');
876// }
877 INT_PTR l = fname.ReverseFindOneOf(_T("\\/"));
878 if ( l >= 0 )
879 {
880 fname = fname.Mid(l + 1);
881 }
882 m_mapFileDatas[CAscii(fname)] = vb;
883 return true;
884 }
885 }
886 return false;
887 }
888
889 //--------------------------------------------
890
895 const CAscii& ReferMailerName(void) const
896 {
897 return m_ascMailerName;
898 }
899
904 const CAscii& ReferSubject(void) const
905 {
906 return m_ascSubject;
907 }
908
915 {
916 return m_addrFrom;
917 }
918
924 {
925 return m_aaddrTo[TO];
926 }
927
933 {
934 return m_aaddrTo[CC];
935 }
936
942 {
943 return m_aaddrTo[BCC];
944 }
945
951 {
952 return m_addrReply.GetAddress();
953 }
954
959 const CAsciiVector& ReferTextDatas(void) const
960 {
961 return m_vascContents;
962 }
963
969 {
970 return m_mapFileDatas;
971 }
972
973 //--------------------------------------------
974
981 bool IsCompletesForSend(void) const
982 {
983 if ( m_aaddrTo[TO].IsEmpty() )
984 {
985 return false;
986 }
987 if ( ! m_addrFrom.IsValid() )
988 {
989 return false;
990 }
991 return true;
992 }
993
1000 {
1001 CAsciiVector vaRc;
1002 loop ( i, KINDMAX )
1003 {
1004 loop ( j, m_aaddrTo[i].GetSize() )
1005 {
1006 vaRc.Add(m_aaddrTo[i][j].GetAddress());
1007 }
1008 }
1009 return vaRc;
1010 }
1011
1018 {
1019 //== ヘッダ作成 (BCCは含まない
1020 CAscii ascHead;
1021 ascHead += CAscii::Fmt("From: %s\r\n", m_FmtAddr(m_addrFrom));
1022 for ( int i = TO; i <= CC; i++ )
1023 {
1024 if ( ! m_aaddrTo[i].IsEmpty() )
1025 {
1026 ascHead += (i == 0) ? ("To: ") : ("Cc: ");
1027 loop ( j, m_aaddrTo[i].GetSize() )
1028 {
1029 if ( j > 0 )
1030 {
1031 ascHead += ",\r\n ";
1032 }
1033 ascHead += CAscii::Fmt("%s", m_FmtAddr(m_aaddrTo[i][j]));
1034 }
1035 ascHead += "\r\n";
1036 }
1037 }
1038 if ( ! m_addrReply.GetAddress().IsEmpty() )
1039 {
1040 ascHead += CAscii::Fmt("Reply-To: %s\r\n", m_addrReply.GetAddress());
1041 }
1042 ascHead += CAscii::Fmt("Subject: %s\r\n", m_ToBase64(m_ascSubject));
1043 ascHead += "MIME-Version: 1.0\r\n";
1044 ascHead += CAscii::Fmt("X-Mailer: %s\r\n", m_ascMailerName);
1045 if ( m_vascContents.GetSize() <= 1 && m_mapFileDatas.GetSize() == 0 )
1046 {
1047 //== テキスト一個だけ!
1048 ascHead += "Content-Type: text/plain; charset=\042ISO-2022-JP\042\r\n";
1049 ascHead += "Content-Transfer-Encoding: 7bit\r\n";
1050 ascHead += "\r\n";
1051 //本文作成
1052 CAscii ascMain;
1053 if ( ! m_vascContents.IsEmpty() )
1054 {
1055 ascMain = m_vascContents[0];
1056 ascMain.Replace("\n.", "\n..");
1057 }
1058 ascMain += "\r\n.";
1059 //ヘッダ + 本文(JISに変換して連結)
1060 CAscii ascRc = ascHead + CJisStr::ToJis(ascMain).ReferBuffer();
1061 return ascRc;
1062 }
1063 //== マルチパートだ
1064 CAscii ascPart = m_MakeMultiPartString();
1065 ascHead += "Content-Type: multipart/mixed;\r\n";
1066 ascHead += CAscii::Fmt(" boundary=\042%s\042\r\n", ascPart);
1067 ascHead += "Content-Transfer-Encoding: 7bit\r\n";
1068 ascHead += "\r\n";
1069 //- Text部
1070 loop ( i, m_vascContents.GetSize() )
1071 {
1072 ascHead += CAscii::Fmt("--%s\r\n", ascPart);
1073 ascHead += "Content-Type: text/plain; charset=\042ISO-2022-JP\042\r\n";
1074 ascHead += "Content-Transfer-Encoding: 7bit\r\n";
1075 ascHead += "\r\n";
1076 CAscii a = m_vascContents[i];
1077 a.Replace("\n.", "\n..");
1078 a += "\r\n";
1079 ascHead += CJisStr::ToJis(a);
1080 }
1081 //- Binary部
1082 loop ( i, m_mapFileDatas.GetSize() )
1083 {
1085 ascHead += CAscii::Fmt("--%s\r\n", ascPart);
1086 ascHead += "Content-Type: application/octet-stream\r\n";
1087 ascHead += "Content-Disposition: attachment;\r\n";
1088 ascHead += CAscii::Fmt(" filename=\042%s\042\r\n", m_ToBase64(vk.At(i)));
1089 ascHead += "Content-Transfer-Encoding: base64\r\n";
1090 ascHead += "\r\n";
1091 const CByteVector& vb = m_mapFileDatas[vk.At(i)];
1092 size_t size = vb.GetSize();
1093 const BYTE* B = vb.ReferBuffer();
1094 const size_t MAX = 76 * 3 / 4; //変換後が76文字になるように
1095 while ( size > MAX )
1096 {
1097 ascHead += CBase64Str().Encode(MAX, B);
1098 ascHead += "\r\n";
1099 B += MAX;
1100 size -= MAX;
1101 }
1102 ascHead += CBase64Str().Encode(size, B);
1103 ascHead += "\r\n";
1104 }
1105 //- 終端
1106 ascHead += CAscii::Fmt("--%s--\r\n.", ascPart);
1107 return ascHead;
1108 }
1109
1110 //--------------------------------------------
1111
1122 bool SetContentFromReceive(LPCSTR lpszContent)
1123 {
1124 Init();
1125 CAsciiVector vaContent = TNB::CAsciiOperator::SeparateLine(lpszContent);
1126 if ( ! m_SetContent(vaContent, m_mapUnknownCmd) )
1127 {
1128 Init();
1129 return false;
1130 }
1131 return true;
1132 }
1133
1144 bool SetContentFromReceive(const CAsciiVector& vascContent)
1145 {
1146 Init();
1147 CAsciiVector vaContent = vascContent;
1148 if ( ! m_SetContent(vaContent, m_mapUnknownCmd) )
1149 {
1150 Init();
1151 return false;
1152 }
1153 return true;
1154 }
1155
1164 {
1165 return m_mapUnknownCmd;
1166 }
1167};
1168
1169
1170
1171}; // TNB
1172
1173
1174
1175#if 0
1176From: SetFromMailAddr
1177Reply-To: SetReplyMailAddr
1178To: AddToMailAddr
1179Cc: AddCcMailAddr
1180Bcc: AddBccMailAddr
1181Subject: SetSubject
1182X-Mailer: SetMailerName
1183Content-Type:
1184Content-Disposition:
1185Content-Transfer-Encoding:
1186#endif
1187
1188#if 0
1189From: =?ISO-2022-JP?B?GyRCJFwkORsoQg==?= <boss@tnb.co.jp>
1190To: =?ISO-2022-JP?B?GyRCJCokZCRWJHMbKEI=?= <oyabun@tnb.co.jp>
1191Cc: =?ISO-2022-JP?B?GyRCJV4lOSU/ITwbKEI=?= <master@tnb.co.jp>
1192Subject: =?ISO-2022-JP?B?GyRCTmMkTjdvGyhC?=
1193MIME-Version: 1.0
1194Content-Type: text/plain; charset="ISO-2022-JP"
1195Content-Transfer-Encoding: 7bit
1196#endif
1197
1198#if 0
1199From: =?ISO-2022-JP?B?GyRCJFwkORsoQg==?= <boss@tnb.co.jp>
1200To: =?ISO-2022-JP?B?GyRCJCokZCRWJHMbKEI=?= <oyabun@tnb.co.jp>
1201Cc: =?ISO-2022-JP?B?GyRCJV4lOSU/ITwbKEI=?= <master@tnb.co.jp>
1202Subject: =?ISO-2022-JP?B?GyRCTmMkTjdvGyhC?=
1203MIME-Version: 1.0
1204X-Mailer: TNB Tiny Mailer
1205Content-Type: multipart/mixed;
1206 boundary="-----MultiPart_MjAwNi0xMC0yNyAxNDo0NjozMg==_"
1207
1208-------MultiPart_MjAwNi0xMC0yNyAxNDo0NjozMg==_
1209Content-Type: text/plain; charset="ISO-2022-JP"
1210Content-Transfer-Encoding: 7bit
1211
1212 $B$3$s$K$A$o (B
1213 $BNc$N7o!"$I$&$G$9$+!) (B
1214
1215-------MultiPart_MjAwNi0xMC0yNyAxNDo0NjozMg==_
1216Content-Type: application/octet-stream
1217Content-Disposition: attachment;
1218 filename="=?ISO-2022-JP?B?Q0NEGyRCJSslYSVpMytILxsoQl9XaW5kbw==?=.dat"
1219Content-Transfer-Encoding: base64
1220
1221MTIzNDU=
1222
1223-------MultiPart_MjAwNi0xMC0yNyAxNDo0NjozMg==_--
1224.
1225#endif
BASE64型管理関係のヘッダ
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
ファイル関係のヘッダ
JIS型文字列管理関係のヘッダ
マップ型情報管理関係のヘッダ
文字列処理関係のヘッダ
文字列操作関係のヘッダ
文字列情報配列管理関係のヘッダ
時間管理関係のヘッダ
virtual CStrT< TYP > Encode(size_t size, LPCVOID P)
[変換] エンコード
Definition: TnbBase64Str.h:197
CVectorT< BYTE > Decode(const TYP *lpszBase64)
[変換] デコード
Definition: TnbBase64Str.h:107
CAscii DecodeForStr(const TYP *lpszBase64)
[変換] デコード
Definition: TnbBase64Str.h:169
MIME BASE64型文字列変換
Definition: TnbBase64Str.h:274
ファイル読み込みクラス
Definition: TnbFile.h:338
bool Open(LPCTSTR lpszName, bool boIsShare=true, bool boDummy=false)
[操作] オープン
Definition: TnbFile.h:364
JIS型文字列管理
Definition: TnbJisStr.h:43
static CJisStr ToJis(LPCSTR lpszAscii)
[変換] JISに変換
Definition: TnbJisStr.h:678
void SetOfJis(LPCSTR lpszJis)
[設定] 代入(JIS用)
Definition: TnbJisStr.h:524
CAscii ToAscii(void) const
[取得] ASCII文字列取得
Definition: TnbJisStr.h:612
LPCSTR ReferBuffer(void) const
[取得] JIS文字列参照取得
Definition: TnbJisStr.h:633
メールアドレス管理クラス
bool SetAddress(const CAscii &ascAddress)
[設定] アドレス設定
void SetName(const CAscii &ascName)
[設定] 名前設定
bool SetSenderPath(LPCSTR path)
[取得] 宛先表記
bool IsValid(void) const
[確認] 正常情報確認
CMailAddress(void)
コンストラクタ
CAscii GetSenderPath(void) const
[取得] 宛先表記.
CMailAddress(CAscii ascAddress, CAscii ascName="")
コンストラクタ
CAscii GetAddress(void) const
[取得] アドレス取得
CAscii GetName(void) const
[取得] 名前取得
メール内容管理クラス
void AddSendBinaryData(const CAscii &ascFileName, const CByteVector &vb)
[設定] 送信データ追加
bool AddToMailAddr(const CAscii &ascToAddr, const CAscii &ascToName="")
[設定] 宛先名設定
CAsciiVector GetAddrsForSend(void) const
[取得] 送信用アドレス一覧
bool SetReplyMailAddr(const CAscii &ascReply="")
[設定] リプライ名設定.
const CAscii & ReferMailerName(void) const
[参照] メーラー名参照
CMailContent(void)
コンストラクタ
void SetSubject(const CAscii &ascSubject)
[設定] 件名設定
const CVectorT< CMailAddress > & ReferCcMailAddr(void) const
[参照] 宛先名参照(CC)
bool AddBccMailAddr(const CAscii &ascBccAddr, const CAscii &ascBccName="")
[設定] 宛先名設定(BCC)
bool IsCompletesForSend(void) const
[確認] 送信可能確認.
CAscii GetContentForSend(void) const
[取得] 送信用メール内容取得
const CAsciisMap & ReferUnknownCommandFromReceive(void) const
[取得] 受信データ解析結果 SetContentFromReceive() で解析中、本クラスの知らないコマンド&パラメータを抽出してあります。 それを参照することが出来ます。
const CVectorT< CMailAddress > & ReferBccMailAddr(void) const
[参照] 宛先名参照(BCC)
const CMailAddress & ReferFromMailAddr(void) const
[参照] 送信メールアドレス参照
CAscii ReferReplyMailAddr(void) const
[参照] リプライ名参照.
void AddSendTextData(const CAscii &ascText)
[設定] 送信テキスト追加
bool AddToMailAddr(const CMailAddress &addr)
[設定] 宛先名設定
bool SetFromMailAddr(const CMailAddress &addr)
[設定] 送信名設定
void Init(void)
[設定] 設定初期化.
void InitSendData(void)
[設定] 送信内容初期化
bool SetContentFromReceive(const CAsciiVector &vascContent)
[解析] 受信データ解析.
bool AddSendFileData(LPCTSTR lpszFile)
[設定] 送信データ追加
void InitToMailAddr(void)
[設定] 宛先名設定初期化
const CMapT< CAscii, CByteVector > & ReferBinaryDatas(void) const
[参照] バイナリコンテンツ参照
bool AddBccMailAddr(const CMailAddress &addr)
[設定] 宛先名設定(BCC)
~CMailContent(void)
デストラクタ
bool SetContentFromReceive(LPCSTR lpszContent)
[解析] 受信データ解析.
void SetMailerName(const CAscii &ascMailerName)
[設定] メーラー名設定
bool SetFromMailAddr(const CAscii &ascFromAddr, const CAscii &ascFromName="")
[設定] 送信名設定
bool AddCcMailAddr(const CMailAddress &addr)
[設定] 宛先名設定(CC)
const CAscii & ReferSubject(void) const
[参照] 件名参照
bool AddCcMailAddr(const CAscii &ascCcAddr, const CAscii &ascCcName="")
[設定] 宛先名設定(CC)
const CAsciiVector & ReferTextDatas(void) const
[参照] テキストコンテンツ参照
const CVectorT< CMailAddress > & ReferToMailAddr(void) const
[参照] 宛先名参照
マップ型情報のキーのみ参照アダプタクラス
Definition: TnbMap.h:94
virtual const KEY & At(INDEX index) const
[取得] 要素の参照取得.
Definition: TnbMap.h:136
マップ型情報管理テンプレート
Definition: TnbMap.h:66
CConstKeysAdapter GetKeysAdapter(void) const
[取得] キーのみの参照アダプタ取得.
Definition: TnbMap.h:649
virtual size_t GetSize(void) const
[取得] 要素数取得
Definition: TnbMap.h:327
virtual bool RemoveAll(void)
[削除] すべてのキーと値を削除
Definition: TnbMap.h:434
bool HasKey(INK key) const
[確認] キー有無
Definition: TnbMap.h:589
static CVectorT< CStrT< TYP > > SeparatePeriod(const TYP *lpsz, const TYP *lpszMark, bool isCheckDc=true)
[取得] トークン区切取得
static CVectorT< CStrT< TYP > > SeparateLine(const TYP *lpsz)
[取得] 改行毎分離
CStrT & TrimLeft(TYP t=' ')
[処理] 先頭から文字をトリム.
Definition: TnbStr.h:968
INT_PTR ReverseFind(TYP t) const
[確認] 検索(後ろから)
Definition: TnbStr.h:575
INT_PTR ReverseFindOneOf(const TYP *lpsz) const
[確認] 検索(後ろから)
Definition: TnbStr.h:621
bool IsEmpty(void) const
[確認] 空チェック
Definition: TnbStr.h:528
CStrT Left(size_t iSize) const
[作成] 範囲取得.
Definition: TnbStr.h:801
size_t GetLength(void) const
[取得] 文字列長
Definition: TnbStr.h:518
static CStrT Fmt(const char *lpszFormat,...)
[作成] 書式付き文字列作成
Definition: TnbStr.h:1206
INT_PTR Find(TYP t, INDEX iFromIndex=0) const
[確認] 検索.
Definition: TnbStr.h:540
CStrT & TrimRight(TYP t=' ')
[処理] 末尾から文字をトリム.
Definition: TnbStr.h:990
bool IsEqual(const TYP *lpszSubject) const
[確認] 文字列比較
Definition: TnbStr.h:669
bool IsEqualNoCase(const TYP *lpszSubject) const
[確認] 文字列比較(大小区別無く比較)
Definition: TnbStr.h:708
CStrT & Trim(TYP t=' ')
[処理] 両端から文字をトリム.
Definition: TnbStr.h:1012
CStrT FindCut(TYP c, CStrT *_pstrRest=NULL) const
[作成] 切り分け
Definition: TnbStr.h:1122
void Empty(void)
[削除] 空化
Definition: TnbStr.h:197
int Replace(TYP tOld, TYP tNew)
[処理] 文字置換.
Definition: TnbStr.h:1038
CStrT Mid(INDEX iOffset, size_t iSize=INVALID_SIZE) const
[作成] 範囲取得.
Definition: TnbStr.h:766
システムタイム管理クラス
Definition: TnbTime.h:294
CStr Format(LPCTSTR lpszFormat=NULL) const
[作成] 文字列作成
Definition: TnbTime.h:668
static CSystemTime GetCurrent(void)
[取得] 現在の時間(LOCAL)
Definition: TnbTime.h:761
配列型情報管理テンプレート
Definition: TnbVector.h:75
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
void Invalid(void)
[操作] 無効状態にする
Definition: TnbVector.h:604
virtual bool RemoveAll(void)
[削除] 空化
Definition: TnbVector.h:565
virtual const TYP * ReferBuffer(void) const
[取得] データアドレス取得
Definition: TnbVector.h:664
CVectorT< TYP > Mid(INDEX startIndex, size_t size=0) const
[作成] 切り出し
Definition: TnbVector.h:705
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
TNB::CStrT< char > CAscii
ASCII文字列クラス
Definition: TnbStr.h:1758
CAscii LowerString(LPCSTR lpsz)
[変換] 小文字変換(ASCII/SJIS用)
Definition: TnbStrEx.h:221
bool IsAsciiOnly(LPCSTR lpsz)
[判断] ASCIIオンリー判断
Definition: TnbStrLib.h:471
TNB Library
Definition: TnbDoxyTitle.txt:2
bool IsEmpty(void) const
[確認] 要素の有無確認.
INDEX Find(const IChecker &checker, INDEX startIndex=0, bool boIsReverse=false) const
[検索] 条件一致要素の検索.
virtual bool IsEqual(const IConstCollectionT< TYP > &c) const
[確認] 比較.
CByteVector ReadInto(size_t size=0) const
[取得] 読み込み
Definition: TnbReader.h:150