87 m_ascAddress = ascAddress;
125 return CAscii::Fmt(
"%s <%s>", m_ascName, m_ascAddress);
137 INT_PTR f0 = s.
Find(
'<');
138 INT_PTR f1 = s.
Find(
'>', f0);
139 if ( f0 >= 0 && f1 > f0 )
141 m_ascName = s.
Left(f0);
143 m_ascAddress = s.
Mid(f0 + 1, (f1 - f0) - 1);
206 enum{ TO = 0, CC = 1, BCC = 2, KINDMAX = 3 };
222 const int TAGSIZE =
sizeof(
"=?ISO-2022-JP?B?") - 1;
227 INT_PTR f = asc.
Find(
"=?");
232 INT_PTR e = asc.
Find(
"?=", f);
239 ascRc += asc.
Left(f);
249 ascRc += asc.
Left(e + 2);
251 asc = asc.
Mid(e + 2);
319 CAscii m_MakeMultiPartString(
void)
const
341 if ( i >= _ascContent.
GetSize() )
348 const CAscii& asc = _ascContent[i];
351 _ascContent = _ascContent.
Mid(i + 1);
354 if ( asc[0] ==
' ' || asc[0] ==
'\t' )
362 vaHead[vaHead.
GetSize() - 1] += a;
369 else if ( asc.
Find(
':') >= 1 )
394 CAscii asc = m_FromBase64(va[i]);
398 INT_PTR e = asc.
Find(
'>', f);
401 TRACE2A(
"Found: MailAddr[%s] Name[%s]\n", asc.
Mid(f + 1, e - f - 1), asc.
Left(f).
TrimRight());
418 bool m_AnalyzHeadLine(
const CAscii& aCmd,
const CAscii& aParam)
430 else if ( aCmd.
IsEqual(
"reply-to") )
463 else if ( aCmd.
IsEqual(
"bcc") )
475 else if ( aCmd.
IsEqual(
"subject") )
477 CAscii a = m_FromBase64(aParam);
478 TRACE1A(
"Found: Subject[%s]\n", a);
482 else if ( aCmd.
IsEqual(
"x-mailer") )
484 TRACE1A(
"Found: X-Mailer[%s]\n", aParam);
501 INT_PTR f = aParam.
Find(
';');
507 INT_PTR e = aParam.
Find(
'=', f);
519 va.
Add(m_FromBase64(a));
520 TRACE3A(
"Analyz Param: %s; %s=\042%s\042\n", va[0], va[1], va[2]);
538 const CAscii& a = vaHead[i];
542 TRACE2A(
"Found: Cmd[%s] = [%s]\n", aCmd, aParam);
544 if ( ! m_AnalyzHeadLine(aCmd, aParam) )
546 _mapUnknownCmd[aCmd] = aParam;
550 if ( ! _mapUnknownCmd.
HasKey(
"content-type") )
554 CAsciiVector vaType = m_AnalyzParamLine(_mapUnknownCmd[
"content-type"]);
555 if ( vaType.
GetSize() == 3 && vaType[0].
Find(
"multipart") == 0 && vaType[1].
IsEqual(
"boundary") )
559 CAscii aBoundLast = aBound +
"--";
561 INDEX line = _vaContent.
Find(aBound) + 1;
562 bool boCanNext =
true;
565 INDEX f = _vaContent.
Find(aBound, line);
566 if ( f == INVALID_INDEX )
568 f = _vaContent.
Find(aBoundLast, line);
569 if ( f == INVALID_INDEX )
576 if ( ! m_SetContent(_vaContent.
Mid(line, f - line), mapTempCmd) )
584 if ( vaType.
GetSize() == 3 && vaType[0].
Find(
"text") == 0 && vaType[1].
IsEqual(
"charset") )
587 ASSERT(! vaType[2].IsEmpty());
588 ASSERT(! _mapUnknownCmd[
"content-transfer-encoding"].IsEmpty());
593 const CAscii& a = _vaContent[i];
615 if ( ! _mapUnknownCmd.
HasKey(
"content-disposition") )
619 CAsciiVector vaDisp = m_AnalyzParamLine(_mapUnknownCmd[
"content-disposition"]);
624 if ( vaDisp[0].IsEqual(
"attachment") && vaDisp[1].IsEqual(
"filename") )
626 ASSERT(_mapUnknownCmd[
"content-transfer-encoding"].IsEqualNoCase(
"base64"));
670 m_addrFrom.
SetName(ascFromName);
706 m_ascMailerName = ascMailerName;
732 return m_aaddrTo[TO].
Add(addr) != INVALID_INDEX;
762 return m_aaddrTo[CC].
Add(addr) != INVALID_INDEX;
791 return m_aaddrTo[BCC].
Add(addr) != INVALID_INDEX;
815 m_ascSubject = ascSubject;
838 m_vascContents.
Add(ascText);
851 m_mapFileDatas[ascFileName] = vb;
865 CStr fname = lpszFile;
867 if ( file.
Open(fname) )
880 fname = fname.
Mid(l + 1);
882 m_mapFileDatas[
CAscii(fname)] = vb;
897 return m_ascMailerName;
925 return m_aaddrTo[TO];
934 return m_aaddrTo[CC];
943 return m_aaddrTo[BCC];
961 return m_vascContents;
970 return m_mapFileDatas;
983 if ( m_aaddrTo[TO].IsEmpty() )
1004 loop ( j, m_aaddrTo[i].GetSize() )
1006 vaRc.
Add(m_aaddrTo[i][j].GetAddress());
1021 ascHead +=
CAscii::Fmt(
"From: %s\r\n", m_FmtAddr(m_addrFrom));
1022 for (
int i = TO; i <= CC; i++ )
1024 if ( ! m_aaddrTo[i].IsEmpty() )
1026 ascHead += (i == 0) ? (
"To: ") : (
"Cc: ");
1027 loop ( j, m_aaddrTo[i].GetSize() )
1031 ascHead +=
",\r\n ";
1033 ascHead +=
CAscii::Fmt(
"%s", m_FmtAddr(m_aaddrTo[i][j]));
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 )
1048 ascHead +=
"Content-Type: text/plain; charset=\042ISO-2022-JP\042\r\n";
1049 ascHead +=
"Content-Transfer-Encoding: 7bit\r\n";
1053 if ( ! m_vascContents.
IsEmpty() )
1055 ascMain = m_vascContents[0];
1056 ascMain.
Replace(
"\n.",
"\n..");
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";
1073 ascHead +=
"Content-Type: text/plain; charset=\042ISO-2022-JP\042\r\n";
1074 ascHead +=
"Content-Transfer-Encoding: 7bit\r\n";
1076 CAscii a = m_vascContents[i];
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";
1094 const size_t MAX = 76 * 3 / 4;
1095 while ( size > MAX )
1126 if ( ! m_SetContent(vaContent, m_mapUnknownCmd) )
1148 if ( ! m_SetContent(vaContent, m_mapUnknownCmd) )
1165 return m_mapUnknownCmd;
1176From: SetFromMailAddr
1177Reply-To: SetReplyMailAddr
1182X-Mailer: SetMailerName
1185Content-Transfer-Encoding:
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?=
1194Content-Type: text/plain; charset=
"ISO-2022-JP"
1195Content-Transfer-Encoding: 7bit
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?=
1204X-Mailer:
TNB Tiny Mailer
1205Content-Type: multipart/mixed;
1206 boundary=
"-----MultiPart_MjAwNi0xMC0yNyAxNDo0NjozMg==_"
1208-------MultiPart_MjAwNi0xMC0yNyAxNDo0NjozMg==_
1209Content-Type: text/plain; charset=
"ISO-2022-JP"
1210Content-Transfer-Encoding: 7bit
1213 $BNc$N7o!
"$I$&$G$9$+!) (B
1215-------MultiPart_MjAwNi0xMC0yNyAxNDo0NjozMg==_
1216Content-Type: application/octet-stream
1217Content-Disposition: attachment;
1218 filename="=?ISO-2022-JP?B?Q0NEGyRCJSslYSVpMytILxsoQl9XaW5kbw==?=.dat
"
1219Content-Transfer-Encoding: base64
1223-------MultiPart_MjAwNi0xMC0yNyAxNDo0NjozMg==_--
#define loop(VAR, CNT)
loop構文.
virtual CStrT< TYP > Encode(size_t size, LPCVOID P)
[変換] エンコード
CVectorT< BYTE > Decode(const TYP *lpszBase64)
[変換] デコード
CAscii DecodeForStr(const TYP *lpszBase64)
[変換] デコード
bool Open(LPCTSTR lpszName, bool boIsShare=true, bool boDummy=false)
[操作] オープン
static CJisStr ToJis(LPCSTR lpszAscii)
[変換] JISに変換
void SetOfJis(LPCSTR lpszJis)
[設定] 代入(JIS用)
CAscii ToAscii(void) const
[取得] ASCII文字列取得
LPCSTR ReferBuffer(void) const
[取得] JIS文字列参照取得
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
[参照] 宛先名参照
virtual const KEY & At(INDEX index) const
[取得] 要素の参照取得.
CConstKeysAdapter GetKeysAdapter(void) const
[取得] キーのみの参照アダプタ取得.
virtual size_t GetSize(void) const
[取得] 要素数取得
virtual bool RemoveAll(void)
[削除] すべてのキーと値を削除
bool HasKey(INK key) const
[確認] キー有無
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=' ')
[処理] 先頭から文字をトリム.
INT_PTR ReverseFind(TYP t) const
[確認] 検索(後ろから)
INT_PTR ReverseFindOneOf(const TYP *lpsz) const
[確認] 検索(後ろから)
bool IsEmpty(void) const
[確認] 空チェック
CStrT Left(size_t iSize) const
[作成] 範囲取得.
size_t GetLength(void) const
[取得] 文字列長
static CStrT Fmt(const char *lpszFormat,...)
[作成] 書式付き文字列作成
INT_PTR Find(TYP t, INDEX iFromIndex=0) const
[確認] 検索.
CStrT & TrimRight(TYP t=' ')
[処理] 末尾から文字をトリム.
bool IsEqual(const TYP *lpszSubject) const
[確認] 文字列比較
bool IsEqualNoCase(const TYP *lpszSubject) const
[確認] 文字列比較(大小区別無く比較)
CStrT & Trim(TYP t=' ')
[処理] 両端から文字をトリム.
CStrT FindCut(TYP c, CStrT *_pstrRest=NULL) const
[作成] 切り分け
int Replace(TYP tOld, TYP tNew)
[処理] 文字置換.
CStrT Mid(INDEX iOffset, size_t iSize=INVALID_SIZE) const
[作成] 範囲取得.
CStr Format(LPCTSTR lpszFormat=NULL) const
[作成] 文字列作成
static CSystemTime GetCurrent(void)
[取得] 現在の時間(LOCAL)
virtual size_t GetSize(void) const
[取得] サイズ取得
void Invalid(void)
[操作] 無効状態にする
virtual bool RemoveAll(void)
[削除] 空化
virtual const TYP * ReferBuffer(void) const
[取得] データアドレス取得
CVectorT< TYP > Mid(INDEX startIndex, size_t size=0) const
[作成] 切り出し
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
TNB::CStrT< char > CAscii
ASCII文字列クラス
CAscii LowerString(LPCSTR lpsz)
[変換] 小文字変換(ASCII/SJIS用)
bool IsAsciiOnly(LPCSTR lpsz)
[判断] ASCIIオンリー判断
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
[取得] 読み込み