TNB Library
TnbSmtpClient.h
[詳解]
1#pragma once
15#include "TnbPop3Client.h"
16
17
18
19//TNB Library
20namespace TNB
21{
22
23
24
61class CSmtpClient : public CAbstractMailClient
62{
63 DEFSUPER(CAbstractMailClient);
64public:
65
67 CSmtpClient(void) : _super(), m_pPop3(NULL), m_isEhloMode(true)
68 {
69 }
70
72 virtual ~CSmtpClient(void)
73 {
74 Disconnect();
75 }
76
82 void SetExtendedHelloMode(bool enable)
83 {
84 m_isEhloMode = enable;
85 }
86
94 {
95 return m_ascOpeningMessage;
96 }
97
105 void SetServerName(LPCTSTR lpszName, WORD wPort = 25)
106 {
107 _super::SetServerName(lpszName, wPort);
108 }
109
115 void SetDomain(LPCTSTR lpszDomain)
116 {
117 m_ascDomain = lpszDomain;
118 }
119
125 void SetPopBeforeMode(CPop3Client* pPop3, DWORD dwWait = 300)
126 {
127 m_pPop3 = pPop3;
128 m_dwPop3Wait = dwWait;
129 }
130
136 void SetFromMailAddr(LPCTSTR lpszFromMailAddr)
137 {
138 m_ascFromMailAddr = lpszFromMailAddr;
139 }
140
144 void InitToMailAddr(void)
145 {
146 m_vascToMailAddrs.RemoveAll();
147 }
148
154 void AddToAddr(LPCTSTR lpszToAddr)
155 {
156 m_vascToMailAddrs.Add(lpszToAddr);
157 }
158
166 bool Send(const CMailContent& mail)
167 {
168 //情報はそろっている?
169 if ( ! mail.IsCompletesForSend() )
170 {
171 SetErrorText("未設定項目有り");
172 return false;
173 }
174 //POP Before SMTP
175 if ( m_pPop3 != NULL )
176 {
177 if ( ! m_pPop3->Connect() )
178 {
179 SetErrorText(m_pPop3->GetErrorText());
180 return false;
181 }
182 m_pPop3->Disconnect();
183 ::Sleep(m_dwPop3Wait);
184 }
185 //本体取り出しておく
186 CAscii ascMain = mail.GetContentForSend();
187 //接続
188 if ( ! IsConnect() )
189 {
190 if ( ! Connect() )
191 {
192 return false;
193 }
194 }
195 //MAIL FROMコマンド発行
196 CAscii ascFromAddr = m_ascFromMailAddr;
197 if ( ascFromAddr.IsEmpty() )
198 {
199 ascFromAddr = mail.ReferFromMailAddr().GetAddress();
200 }
201 if ( ! Command(CAscii::Fmt("MAIL FROM:<%s>", ascFromAddr)) )
202 {
203 return false;
204 }
205 //RCPT TOコマンド発行
206 CAsciiVector vascToAddrs = m_vascToMailAddrs;
207 if ( vascToAddrs.IsEmpty() )
208 {
209 vascToAddrs = mail.GetAddrsForSend();
210 }
211 loop ( i, vascToAddrs.GetSize() )
212 {
213 if ( ! Command(CAscii::Fmt("RCPT TO:<%s>", vascToAddrs[i])) )
214 {
215 return false;
216 }
217 }
218 //DATAコマンド発行
219 if ( ! Command("DATA") )
220 {
221 return false;
222 }
223 //本体送信
224 return Command(ascMain);
225 }
226
227protected:
228
235 virtual bool IsValidResponse(const CAscii& a) const
236 {
237 if ( a.IsEmpty() )
238 {
239 return false;
240 }
241 return (a[0] == '2' || a[0] == '3');
242 }
243
251 virtual bool QuitCommand(CAscii& _res)
252 {
253 return Command(_res, "QUIT");
254 }
255
262 virtual bool OnConnect(void)
263 {
264 CAscii s;
265 if ( Read(s) && s.Find("220") == 0 )
266 {
267 m_ascOpeningMessage = s;
268 CAscii hel = m_isEhloMode ? "EHLO" : "HELO";
269 if ( Command(CAscii::Fmt("%s %s", hel, m_ascDomain)) )
270 {
271 //数行来るが空読みしておく
272 while ( true )
273 {
274 if ( ! Read(s) )
275 {
276 break;
277 }
278 }
279 return true;
280 }
281 }
282 return false;
283 }
284
285private:
286
287 CAscii m_ascOpeningMessage;
288 CAscii m_ascDomain;
289 CAscii m_ascFromMailAddr;
290 CAsciiVector m_vascToMailAddrs;
291 CPop3Client* m_pPop3;
292 DWORD m_dwPop3Wait;
293 bool m_isEhloMode;
294};
295
296
297
298}; // TNB
299
300
301
302#if 0
303
304クライアント HELO <satoh@some.where.com><CRLF>
305サーバ 250 OK
306クライアント MAIL FROM:<satoh@some.where.com><CRLF>
307サーバ 250 OK
308
309クライアント RCPT TO:<smith@another.com> <CRLF>
310サーバ 250 OK
311
312クライアント DATA <CRLF>
313サーバ 354 Start mail input; end with <CRLF>.<CRLF>
314クライアント こんにちは
315クライアント ところ、・・・ということで、
316クライアント 返事をおまちしております
317クライアント <CRLF>.<CRLF>
318サーバ 250 OK
319クライアント QUIT<CRLF>
320サーバ 250 OK
321
322 send.print("From: "+sender+CRLF);
323 send.print("To: " + receiver+CRLF);
324 send.print("Subject: " + title+CRLF);
325 send.print("Comment: Unauthenticated sender"+CRLF);
326 send.print("X-Mailer: Tiny SMTP Program"+CRLF);
327 send.print(CRLF);
328 send.print(message+CRLF);
329 send.print(".");
330 send.print(CRLF);
331 send.flush();
332#endif
333
334#if 0
335・一般的なメールエンコードは、Subject が BASE64、本文が JIS になって
336 いるように思う。
337 Outlook Express では、エンコードなしの S-JIS のままでも
338 Subject、本文が BASE64 でも問題なく読める。
339 インターネットへ送信するメールは、少なくとも BASE64 のエンコードは
340 した方が安全だろう。
341
342 ・メールヘッダのBASE64 Subject 形式は、次のとおりである。
343
344 =?コード形式?タイプ?タイトル?=
345 | | || || |_ ?= 終了コード
346 | | || ||_ エンコードタイトル文字列
347 | | || |_ ? 区切りコード
348 | | ||_ BASE64 は「B」
349 | | |_ ? 区切りコード
350 | |_ BASE64 は「iso-2022-jp」
351 |_ =? 開始コード
352
353 ・メール本文のBASE64 エンコード指定は、次のとおりである。
354
355 MIME-Version: 1.0
356 Content-Type: text/plain;
357 charset="iso-2022-jp"
358 Content-Transfer-Encoding: base64
359#endif
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
POP3(Post Office Protocol version 3)関係のヘッダ
CAscii GetAddress(void) const
[取得] アドレス取得
メール内容管理クラス
CAsciiVector GetAddrsForSend(void) const
[取得] 送信用アドレス一覧
bool IsCompletesForSend(void) const
[確認] 送信可能確認.
CAscii GetContentForSend(void) const
[取得] 送信用メール内容取得
const CMailAddress & ReferFromMailAddr(void) const
[参照] 送信メールアドレス参照
SMTP(Simple Mail Transfer Protocol)プロトコル処理クラス
Definition: TnbSmtpClient.h:62
void AddToAddr(LPCTSTR lpszToAddr)
[設定] 宛先名設定
void SetPopBeforeMode(CPop3Client *pPop3, DWORD dwWait=300)
[設定] POP Before SMTP 設定
virtual ~CSmtpClient(void)
デストラクタ
Definition: TnbSmtpClient.h:72
void SetDomain(LPCTSTR lpszDomain)
[設定] 送信名設定
virtual bool IsValidResponse(const CAscii &a) const
[確認] レスポンスチェック
CAscii GetOpeningMessage(void) const
[取得] 接続成功時の文字列.
Definition: TnbSmtpClient.h:93
void SetFromMailAddr(LPCTSTR lpszFromMailAddr)
[設定] 送信者アドレス設定
void InitToMailAddr(void)
[設定] 宛先名設定初期化
virtual bool OnConnect(void)
[設定] 接続時処理
CSmtpClient(void)
コンストラクタ
Definition: TnbSmtpClient.h:67
bool Send(const CMailContent &mail)
[送信] メール送信.
void SetExtendedHelloMode(bool enable)
[設定] ExtendedHelloMode設定
Definition: TnbSmtpClient.h:82
virtual bool QuitCommand(CAscii &_res)
[設定] 終了コマンド
void SetServerName(LPCTSTR lpszName, WORD wPort=25)
[設定] 通信設定.
bool IsEmpty(void) const
[確認] 空チェック
Definition: TnbStr.h:528
static CStrT Fmt(const char *lpszFormat,...)
[作成] 書式付き文字列作成
Definition: TnbStr.h:1206
INT_PTR Find(TYP t, INDEX iFromIndex=0) const
[確認] 検索.
Definition: TnbStr.h:540
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
virtual bool RemoveAll(void)
[削除] 空化
Definition: TnbVector.h:565
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
TNB Library
Definition: TnbDoxyTitle.txt:2
bool IsEmpty(void) const
[確認] 要素の有無確認.