質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

パフォーマンス

コード効率の向上や計算に関する質問には、このタグを使ってください。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

2回答

725閲覧

phpでメール一斉配信時の処理速度について

yamaken114

総合スコア14

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

パフォーマンス

コード効率の向上や計算に関する質問には、このタグを使ってください。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

0クリップ

投稿2020/05/31 01:27

phpでメール配信のシステムを開発中です。
数千件の顧客に対してメールを配信を1~2分で行う必要があります。
pearMailやphpMailerで期待するパフォーマンスが得られなかったため、
fsockopenを使用して記述しています。

fputsで各種コマンドを発行しfgetsでレスポンスを得ます。
この時、fgetsでのレスポンスが遅くメール1件送信に1秒程度かかってしまいます。
1件毎にレスポンスを確認せず、100件送信した後に100件レスポンスを確認する方法にすると処理速度は向上しますが、
処理的にはあまり好ましくありません。
1件毎にレスポンスを確認し、より高速に処理する方法はないでしょうか?

※メールbody,header送信部分のfgetsで約0.4秒かかっています

php

1class Mailer { 2 3 function __construct($MAILSERVER) { 4 $this->MAILSERVER = $MAILSERVER; 5 } 6 7 function __destruct() { 8 $this->disconnect(); 9 } 10 11 //接続 12 function connect() { 13 14 $this->socket = @pfsockopen($this->MAILSERVER['host'],$this->MAILSERVER['port'],$errorno,$errormsg,20); 15 if (!$this->socket) { 16 return false; 17 } 18 if ($this->getResponseCode() != "220") { 19 return false; 20 } 21 22 @fputs($this->socket,"ehlo {$this->MAILSERVER['host']}\r\n"); 23 if ($this->getResponseCode() != "250") { 24 return false; 25 } 26 27 @fputs($this->socket,"STARTTLS\r\n"); 28 if ($this->getResponseCode() != "220") { 29 return false; 30 } 31 32 @stream_socket_enable_crypto($this->socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); 33 34 @fputs($this->socket,"auth login\r\n"); 35 if ($this->getResponseCode() != "334") { 36 return false; 37 } 38 39 @fputs($this->socket,base64_encode($this->MAILSERVER['username'])."\r\n"); 40 if ($this->getResponseCode() != "334") { 41 return false; 42 } 43 44 @fputs($this->socket,base64_encode($this->MAILSERVER['password'])."\r\n"); 45 if ($this->getResponseCode() != "235") { 46 return false; 47 } 48 49 return true; 50 51 } 52 53 //切断 54 function disconnect() { 55 fclose($this->socket); 56 } 57 58 //送信 59 function send($from,$to,$subject,$body) { 60 61 $wto = mb_encode_mimeheader($to); 62 $wsubject = mb_encode_mimeheader($subject); 63 $wbody = base64_encode($body); 64 $header = "from: {$from}\r\nto: {$wto}\r\nsubject: {$wsubject}\r\n"; 65 $header .= "Content-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding: Base64\r\n"; 66 67 //from 68 @fputs($this->socket,"mail from: <{$from}>\r\n"); 69 if ($this->getResponseCode() != "250") { 70 $this->disconnect(); 71 $result = false; 72 } 73 //to 74 @fputs($this->socket,"rcpt to: <{$wto}>\r\n"); 75 if ($this->getResponseCode() != "250") { 76 $this->disconnect(); 77 $result = false; 78 } 79 80 //data開始 81 @fputs($this->socket,"data\r\n"); 82 if ($this->getResponseCode() != "354") { 83 $this->disconnect(); 84 $result = false; 85 } 86 87 //bodyのレスポンス 88 @fputs($this->socket,"{$header}\r\n"); 89 @fputs($this->socket,"{$wbody}\r\n.\r\n"); 90 if ($this->getResponseCode() != "250") { 91 $this->disconnect(); 92 $result = false; 93 } 94 95 //切断 96 if ($this->MAILSERVER['persist'] == false) { 97 $this->disconnect(); 98 } 99 100 return true; 101 102 } 103}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/05/31 01:40

> 数千件の顧客に対してメールを配信を1~2分で行う必要があります。 普通は、自分で送信せずに、専門のメール配信サービスに委託するかと思います。
kei344

2020/06/02 12:12

まだ質問が「受付中」になっていますが、いったん「解決済」にされてはいかがでしょうか。
guest

回答2

0

phpでメール配信のシステムを開発中です。

数千件の顧客に対してメールを配信を1~2分で行う必要があります。

メール配信専用のサービスを借りることをおすすめします。

投稿2020/05/31 01:44

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

メール送信を並列で起動することで対応しました

投稿2020/06/02 10:10

yamaken114

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問