ã¡ã¼ã«ãé«éã«é ä¿¡ããæ¹æ³
ã¡ã¼ã«ãé«éã«é
ä¿¡ããæ¹æ³ã«ã¤ãã¦èª¿ã¹ã¦ã¿ã¾ããã
ä»åãMAILER DAEMONã¯postfixã§ããµã³ãã«ããã°ã©ã ã¯PHPã§è¨è¿°ãã¦ãã¾ãã
â ãµã³ãã«ããã°ã©ã
以ä¸ã«ä»åã®å®é¨ã§ä½¿ç¨ããé
ä¿¡ãã¹ãã®çºã®ãµã³ãã«ããã°ã©ã ã示ãã¾ãã
1000ééä¿¡ãã¦çµäºããã ãã®åç´ãªããã°ã©ã ã§ãã
mailsend.php
ã¾ãã¡ã¼ã«éä¿¡é¨åã§ãã
<?php require_once "Mail.php"; $params = array( 'host' => '127.0.0.1', 'port' => '25', 'auth' => false, 'username' => '', 'password' => '', 'persist' => TRUE, // TRUEã«ããã¨é ä¿¡æ¯ã«æ¥ç¶ãåããªãã ); $from = '[email protected]'; $recipients = '[email protected]'; $headers['From'] = $from; $headers['Return-Path'] = $from; $headers['To'] = $recipients; $headers['Subject'] = 'Test'; $body = "Test\n"; $objMail = Mail::factory('mail', '-f'.$from); // $objMail = Mail::factory('smtp', $params); for($i = 0; $i < 1000; $i++) { $objMail->send($recipients, $headers, $body); }
mailmgr.php
次ã«ä¸è¨ã®éä¿¡ããã°ã©ã ãè¤æ°èµ·åããçµäºããã¾ã§å¾
ã¤ããã°ã©ã ã§ãã
å
¨ã¦ã®åããã»ã¹ãçµäºããã¾ã§å¾
ã¡ã¾ãã®ã§ãå
¨éä¿¡ããã»ã¹ã®çµäºæéãåããã¾ãã
<?php $max_clients = 5; // ããã»ã¹æ° $client_pids = array(); for($i = 0; $i < $max_clients; $i++) { $pid = pcntl_fork(); if ($pid) { echo 'Start Process pid=' . $pid . PHP_EOL; $client_pids[] = $pid; } else { unset($client_pids); require_once './mailsend.php'; exit(); } } $client_pids = array_flip($client_pids); $status = NULL; $wait_options = WUNTRACED; for(;;) { $pid = pcntl_wait($status, $wait_options); if ($pid > 0) { echo 'Exit Process pid=' . $pid . PHP_EOL; unset($client_pids[$pid]); if (count($client_pids) == 0) break; } } exit();
â ãã¹ã
å®éã«é
ä¿¡ãã¹ããè¡ã£ã¦æãã£ãæéãè¨æ¸¬ãã¦ã¿ã¾ãã
mailã®å ´å
ã¾ãããã¯ã¨ã³ãã«phpã®mail颿°ã使ç¨ãã¦éä¿¡ãã¦ã¿ã¾ãã
mailsend.phpã®Mail::factoryã¡ã½ããã®ç¬¬1弿°ãæ¸ãæãã¦mailãæå®ãã¾ãã
$objMail = Mail::factory('mail', '-f'.$from);
// $objMail = Mail::factory('smtp', $params);
å®éã«å®è¡ããçµæã§ãã
$ $ time php mailmgr.php Start Process pid=31714 Start Process pid=31715 Start Process pid=31716 Start Process pid=31717 Start Process pid=31718 Exit Process pid=31717 Exit Process pid=31716 Exit Process pid=31714 Exit Process pid=31718 Exit Process pid=31715 real 0m19.868s user 0m31.553s sys 0m35.228s
çµäºã¾ã§19.868ç§æããã¾ããã
å®è¡ããç´å¾ã®mailqãè¦ã¦ã¿ã¾ãã
$ mailq F2350770878 219 Sun Sep 5 15:30:34 [email protected] [email protected] 87EBF7710F8 219 Sun Sep 5 15:30:34 [email protected] [email protected] ããããããããä¸ç¥ãããããããã 136FF7704FC 218 Sun Sep 5 15:30:54 [email protected] [email protected] 4C0427710BB 219 Sun Sep 5 15:30:54 [email protected] [email protected] 8D634770733 219 Sun Sep 5 15:30:54 [email protected] [email protected] -- 1156 Kbytes in 4026 Requests.
ãã¥ã¼ã«ã¡ã¼ã«ãæºã¾ã£ã¦ããäºã確èªã§ãã¾ãã
ãã°ã確èªãã¦ã¿ã¾ãã
# tail -f /var/log/maillog ããããããããä¸ç¥ãããããããã Sep 5 15:30:54 prmail postfix/pickup[21881]: A4108770070: uid=500 from=<[email protected]> Sep 5 15:30:54 prmail postfix/cleanup[31224]: A4108770070: message-id=<[email protected]> Sep 5 15:30:54 prmail postfix/qmgr[27225]: A4108770070: from=<[email protected]>, size=336, nrcpt=1 (queue active) Sep 5 15:30:54 prmail postfix/smtp[31435]: A4108770070: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=230, delays=230/0/0/0, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as B0ABE2EB8048) Sep 5 15:30:54 prmail postfix/qmgr[27225]: A4108770070: removed
ä¸è¨ãã°ã®ä¸ããï¼è¡ç®ã®postfix/smtpã®è¡ã®ãè¦ãã¨ãdelay=230ã¨ãªã£ã¦ããã230ç§æãã£ã¦ãããã¨ãåããã¾ãã
ããã°ã©ã å®è¡æéã®19.868ç§ã¨åããã¦ãç´250ç§æããã¾ããã
smtpã®å ´å
次ã«smtpã§éä¿¡ãã¦ã¿ã¾ãã
mailsend.phpã®Mail::factoryã¡ã½ããã®ç¬¬1弿°ãsmtpãæå®ãã¦è©¦ãã¦ã¿ã¾ãã
// $objMail = Mail::factory('mail', '-f'.$from);
$objMail = Mail::factory('smtp', $params);
å®éã«å®è¡ããçµæã§ãã
$ time php mailmgr.php Start Process pid=18648 Start Process pid=18649 Start Process pid=18650 Start Process pid=18651 Start Process pid=18652 Exit Process pid=18650 Exit Process pid=18649 Exit Process pid=18651 Exit Process pid=18648 Exit Process pid=18652 real 1m3.253s user 0m19.131s sys 0m2.166s
çµäºã¾ã§1å3.253ç§(3.253ç§)æããã¾ããã
ãã¥ã¼ã®ä¸èº«ã確èªãã¦ã¿ã¾ãã
$ mailq Mail queue is empty
空ã£ã½ã§ããã
# tail -f /var/log/maillog Sep 5 15:46:57 prmail postfix/smtpd[28294]: B030C77005F: client=xxxxxx[127.0.0.1] Sep 5 15:46:57 prmail postfix/cleanup[28701]: B030C77005F: message-id=<[email protected]> Sep 5 15:46:57 prmail postfix/qmgr[27225]: B030C77005F: from=<[email protected]>, size=403, nrcpt=1 (queue active) Sep 5 15:46:57 prmail postfix/smtp[28144]: B030C77005F: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=0.07, delays=0.06/0/0/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as BEB1A2EB8048) Sep 5 15:46:57 prmail postfix/qmgr[27225]: B030C77005F: removed
ä¸è¨ãã°ã®ä¸ããï¼è¡ç®ã®postfix/smtpã®è¡ã®ãè¦ãã¨ãdelay=0.07ã¨ãªã£ã¦ãããé
å»¶ãã»ã¼ç¡ããã¨ãåããã¾ãã
ããã°ã©ã å®è¡æéã®63.253ç§ã¨åããã¦ç´63ç§ãé
ä¿¡ã«æãã£ãæéã§ãã
â çµæ
ä¸è¨ã®å®é¨ã®çµæã以ä¸ã®éãã«ãªãã¾ããã
| backend | å®è¡æé |
|---|---|
| 249.868s | |
| smtp | 63.323s |
â ãªããï¼
ãªãããã®ãããªçµæã«ãªãã®ãè¦ã¦ã¿ããã¨æãã¾ãã
ããä¸åº¦ãã°ãè¯ãè¦ã¦ä¸ããã
ããã¯ã¨ã³ãã«mailãæå®ããå ´åã§ã¯ãpickupãcleanupãqmgrãsmtpã®é ã«å®è¡ããã¦ãã¾ãã
ããã¯ã¨ã³ãã«smtpãæå®ããå ´åã§ã¯ãsmtpdãcleanupãqmgrãsmtpã®é ã«å®è¡ããã¦ãã¾ãã
éããåããã«ããã®ã§ã以åæããInternal Postfix block diagramãå ã«è¦ã¦ã¿ããã¨æãã¾ãã
ããã¯ã¨ã³ããmailã®å ´å
以ä¸ã®å³ãããã¯ã¨ã³ãã«mailãæå®ããå ´åã®ããã¼ã§ãã
phpã®mail颿°ã使ç¨ããå ´åãunixç³»ã®OSã§ã¯sendmailã³ãã³ããå¦çãã¾ãã
éä¿¡ãããã¡ã¼ã«ã¯ãã¾ãsendmailã³ãã³ããéãã¦maildropãã¥ã¼ã«ç½®ããã¾ãã
ããããpickupããã»ã¹ã1é1éã¡ã¼ã«ãåãåºããcleanupã«æ¸¡ãã¾ãã
pickupã¯ãã¼ã«ã«ã¡ã¼ã«ã®é
éãæ
å½ãã¦ãã¾ããããã®ããã»ã¹ã¯ã·ã³ã°ã«ããã»ã¹ã§ãã
ãã«ãããã»ã¹ã«ã§ããªãã®ï¼ã¨æãããããã¾ããã
å®éã«master.cfãããã£ã¦è¤æ°èµ·åããã¦ã¿ã¾ããã
/etc/postfix/master.cfã®pickupã®è¡ã«ãããmaxprocã1ãã - ã«å¤æ´ãã¦ã¿ã¾ãã
# ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (100) # ========================================================================== ããããããããããä¸ç¥ãããããããããã #pickup fifo n - n 5 1 pickup pickup fifo n - n 5 - pickup #maxprocã1ããå¶éãªã(=100)ã«å¤æ´ â
夿´ãåæ ãããçºã«reloadãã¾ãã
# postfix reload postfix/postfix-script: refreshing the Postfix mail system
ããã¨ã
# tail -f /var/log/maillog Sep 5 20:16:19 prmail postfix/pickup[24040]: fatal: service pickup requires a process limit of 1 Sep 5 20:16:20 prmail postfix/master[27222]: warning: process /usr/libexec/postfix/pickup pid 24040 exit status 1 Sep 5 20:16:20 prmail postfix/master[27222]: warning: /usr/libexec/postfix/pickup: bad command startup -- throttling
ã¨maillogã«è¨é²ããã¦æãããpickupãèµ·åãã¾ããã
pickupã¯ã·ã³ã°ã«ããã»ã¹ã§ããèµ·åããäºãã§ãã¾ããã
mailã§ã¡ã¼ã«ãéä¿¡ããå ´åã¯ãpickupãããã«ããã¯ã«ãªãã¾ãã
ãã®å¾ãcleanupããqmgrã¸ãqmgrããsmtpã¸ã¨æ¸¡ã£ã¦ããã¾ãããã·ã³ã°ã«ã¾ãã¯ãã¥ã¢ã«ããã»ã¹ã§å¦çããã¾ãã
以ä¸ã«maillogããéä¿¡ãè¡ã£ãç´å¾ã®smtpãã¼ã¢ã³ã®ãã°ã ããæãåºãã¦ã¿ã¾ããã
[]ã§å²ã¾ããããã»ã¹IDãè¯ãè¦ã¦ä¸ããã
# grep 'Sep 5 15:30:54 prmail postfix/smtp\[' /var/log/maillog Sep 5 15:30:54 prmail postfix/smtp[31435]: 51C1D770072: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=237, delays=237/0/0/0, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 5E4DE2EB8048) Sep 5 15:30:54 prmail postfix/smtp[31435]: 5D980770070: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=237, delays=237/0/0/0, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 69EA82EB8048) Sep 5 15:30:54 prmail postfix/smtp[31435]: 692D7770072: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=230, delays=230/0/0/0.03, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 758EA2EB8048) Sep 5 15:30:54 prmail postfix/smtp[31435]: 74EC0770070: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=239, delays=239/0/0/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 8161D2EB8048) Sep 5 15:30:54 prmail postfix/smtp[31435]: 80AB0770072: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=233, delays=233/0/0/0.03, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 8D30C2EB8048) Sep 5 15:30:54 prmail postfix/smtp[31435]: 8C65E770070: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=229, delays=229/0/0/0, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 98C1A2EB8048) Sep 5 15:30:54 prmail postfix/smtp[31435]: 9810F770072: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=224, delays=224/0/0/0.03, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as A4B782EB8048) Sep 5 15:30:54 prmail postfix/smtp[31435]: A4108770070: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=230, delays=230/0/0/0, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as B0ABE2EB8048)
ããã»ã¹IDã31435ã®ã¿ããè¨é²ããã¦ããããä»ãµã¼ãã¼ã¸ã®é
ä¿¡ãã·ã³ã°ã«ããã»ã¹ã§å¦çããã¦ãããã¨ãåããã¾ãã
ããã¯ã¨ã³ããsmtpã®å ´å
以ä¸ã®å³ãããã¯ã¨ã³ãã«smtpãæå®ããå ´åã®ããã¼ã§ãã
éä¿¡ãããã¡ã¼ã«ã¯ãã¾ãsmtpdãåãåããcleanupã«æ¸¡ãã¾ãã
smtpdãcleanupãqmgrãsmtpã¯ããããããã«ãããã»ã¹ã§ãã®ã§ãä½ããªãå ´åã¯ãã®ã¾ã¾ãã«ãããã»ã¹ã§éããã¾ãã
è©°ã¾ããã¨ãèããããé¨åã¨ãã¦ã¯ãsmtpãå¤é¨ã®ã¡ã¼ã«ãµã¼ãã¼ã®å¶éãåãã¦deferã«æ¸¡ããdeferããqmgrã«éç¥ãã¦qmgrã¯deferredãã¥ã¼ã«å·®ãæ»ãã¾ãã
ã¾ãqmgrãincomingãã¥ã¼ããåãåããããªãå ´åãincomingãã¥ã¼ãè©°ã¾ãã¾ãã
ãããã®ãã¥ã¼ãè©°ã¾ãå ´åã¯ãããæå³ãé ä¿¡é度ã®ä¸éã¨ãè¨ãã¾ãã
å®éã«é
ä¿¡ãè¡ã£ãç´å¾ã®smtpãã¼ã¢ã³ã®ãã°ãè¦ã¦ã¿ã¾ãã
[]ã§å²ã¾ããããã»ã¹IDãè¯ãè¦ã¦ä¸ããã
# grep 'Sep 5 15:46:57 prmail postfix/smtp\[' /var/log/maillog Sep 5 15:46:57 prmail postfix/smtp[28745]: 8E7BE77005D: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=0.07, delays=0.06/0/0/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 9C9022EB8048) Sep 5 15:46:57 prmail postfix/smtp[28788]: 90FA9770060: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=0.08, delays=0.05/0/0/0.02, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 9F3472EB804B) Sep 5 15:46:57 prmail postfix/smtp[28763]: 91164770063: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=0.08, delays=0.05/0/0/0.02, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 9F2012EB8048) Sep 5 15:46:57 prmail postfix/smtp[28144]: 9D31B77005F: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=0.06, delays=0.05/0/0/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as A99452EB8048) Sep 5 15:46:57 prmail postfix/smtp[28745]: A0049770061: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=0.08, delays=0.06/0/0/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as AFF042EB8048) Sep 5 15:46:57 prmail postfix/smtp[28688]: 9FE5377005D: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=0.08, delays=0.07/0/0/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as B01732EB804B) Sep 5 15:46:57 prmail postfix/smtp[28788]: A9FB1770060: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=0.06, delays=0.05/0/0/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as B79E62EB8048) Sep 5 15:46:57 prmail postfix/smtp[28144]: B030C77005F: to=<[email protected]>, relay=foo.bar.com[XXX.XXX.XXX.XXX]:25, delay=0.07, delays=0.06/0/0/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as BEB1A2EB8048)
28745ã28763 ã28144ã28688ã28788ã®5ããã»ã¹ã§å¦çããã¦ãããã¨ãåããã¾ãã
â çµè«
大éã®ã¡ã¼ã«ãé«éã«é
ä¿¡ããå ´åã¯smtpã§éä¿¡ãã¾ãããã
phpã®å ´åã¯ãPEAR::Mailã使ç¨ããã¨ç°¡åã«éä¿¡ã§ãã¾ãããã¾ãªäººã¯ã½ã±ããã§éä¿¡ãã¦ä¸ããã
ã¡ãªã¿ã«æºå¸¯é»è©±åãã®å¤§éé
ä¿¡ã¯ãã£ãªã¢ãããã¯ã«ããå¶éãããããä¸è¨ã ãã§ã¯ä¸ååã§ãã
çåå¯ã«æãåºãã¨IPã®æ°¸ä¹
ãããã¯ãæãå¾ãã®ã§ããæ³¨æä¸ããã
æã£åãæ©ãæ¹æ³ã¨ãã¦ã¯この辺のソリューションã使ãã®ãè¯ããã¨æãã¾ãã
以ä¸ãä½ãã®ãå½¹ã«ç«ã¦ãã°å¹¸ãã§ãã


