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

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

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

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

Q&A

解決済

1回答

7018閲覧

PHP qdmail を使った、メールの受信方法

smileheart

総合スコア17

PHP

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

0グッド

0クリップ

投稿2017/08/17 23:06

###前提・実現したいこと
私は、PHP初心者で、勉強を独学で始めたばかりで
右往左往しながらプログラムを書いています。

実現したい事は、
①PHPの、qdmailを使う
http://hal456.net/qdmail_rec/
②1件づつメールを受信して、受信後に、そのメールをメールサーバーから削除する

です。

全件取得するプログラムは出来たのですが、
上記の①②が実現出来ず、困っています。

よろしくお願いします。

###発生している問題・エラーメッセージ
1件取得するプログラムは出来たのですが、
上記の①②が実現出来ず、困っています。

###該当のソースコード

<?php include_once('qdmail_receiver.php'); $server = array( 'protocol'=>'pop3', 'host'=>'pop.mail.yahoo.co.jp', 'user'=>'kabuinfojp', 'pass'=>'1206', 'port'=> 110, ); $receiver = QdmailReceiver::start( 'pop' , $server); print $receiver->text(); ?>

###試したこと
色々なサイトを拝見し、試しましたが、上手く行きませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
PHP Version 5.6.24

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

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

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

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

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

tsuemura

2017/08/18 00:22

コードを見る限り、①は実現出来ているように見えるのですが、違うのでしょうか?
smileheart

2017/08/18 00:26

ご指摘の通りです。出来ています。②が出来ていない状態です。ご指摘ありがとうございます。
guest

回答1

0

ベストアンサー

「色々なサイトを見た」のであれば、恐らくご覧になられているかとは思いますが。

1件ずつメールを取得する

POP特有の処理(OOPタイプ)

受信後に、そのメールをメールサーバーから削除する

qdmail_receiverでエラーメールを取得、削除

PHP

1foreach( $target as $del_id ){ 2 $receiver->delete($del_id); 3} 4$receiver->done();

qdmail_receiverは便利なのでよく使いますが、
公式ドキュメントがいまいち情報不足だったり、開発終了していたりと保守上問題も多いです。
可能なら他のライブラリを利用することをおすすめします。
(と言いつつ、私自身勉強不足で、未だにqdmail使っていたりしますので、他のライブラリの紹介は控えさせて下さい)

----追記

PHP

1$receiver = QdmailReceiver::start( 'pop' , $server); 2 3$max = $receiver->count(); // メールの件数を取得 4 5for ($i; $i<$max; $i++) { 6 print $receiver->text(); 7 $pointer = $receiver->pointer(); // 現在のメールIDを取得 8 $receiver->delete($pointer); // 現在のメールを削除 9 $receiver->next(); // 次のメールへ 10} 11$receiver->done(); // メールの削除を確定

投稿2017/08/18 00:33

編集2017/08/18 02:43
tsuemura

総合スコア663

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

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

smileheart

2017/08/18 00:51

ありがとうございます。 $target  は、どこにも使っていないのに、効果があるのでしょうか? include_once('qdmail_receiver.php'); $server = array( 'protocol'=>'pop3', 'host'=>'pop.mail.yahoo.co.jp', 'user'=>'kabuinfojp', 'pass'=>'パスワード', 'port'=> 110, ); $receiver = QdmailReceiver::start( 'pop' , $server); print $receiver->text(); foreach( $target as $del_id ){ $receiver->delete($del_id); } $receiver->done(); この様にしましたが、消えませんでした。
smileheart

2017/08/18 00:58

$receiver = QdmailReceiver::start( 'pop' , $server); print $receiver->text(); $target = $receiver->pointer(); foreach( $target as $del_id ){ $receiver->delete($del_id); } $receiver->done(); 最初の1件は、消えましたが、再実行すると、次のメールが消えません。 どうしてでしょうか?
smileheart

2017/08/18 01:15

このサイトの使い方が不明で間違った操作をしてしまいました。 再質問をさせて頂きましたので、よろしくお願いします。
tsuemura

2017/08/18 01:37

間違えて解決済みにしてしまった件でしたら、多分このままで問題ないでしょう。 再質問の方に低評価付いてしまっていますし、一度削除された方が良いかと。。 ベストアンサー頂いた以上は責任持ってフォローします。 が、まず回答のリンクはお読みになられました? 私が引用した箇所はごくごく一部ですので、きちんとリンク先をお読みになってください。 その上で上手く行かないのであればお手伝いします。
smileheart

2017/08/18 01:48

ありがとうございます。 再質問は、削除出来ない模様です。。。 リンクも拝見しましたが、まだ、PHP初心者のせいか よく理解出来ません。 どの様にコードを書けばいいのか、教えて頂ければ助かります。 よろしくお願いします。
tsuemura

2017/08/18 02:49

回答にサンプルを追記しました。 なお、確かに「お読みになりましたか?」とは書きましたが、読むだけで分かるものではありません。手を動かして下さい。 リンク先のコードを、コピペでも良いので試してみましたか? 自分のコードと同じところ、違うところを見比べてみましたか? 厳しい言い方になりますが、脊髄反射的に「初心者だから分かりません」では上達しませんよ。 もう少し頑張って見て下さい。
smileheart

2017/08/18 02:50

ありがとうございます。 試して見ます。
smileheart

2017/08/18 03:02

<?php include_once('qdmail_receiver.php'); $server = array( 'protocol'=>'pop3', 'host'=>'pop.mail.yahoo.co.jp', 'user'=>'kabuinfojp', 'pass'=>'パスワード', 'port'=> 110, ); $receiver = QdmailReceiver::start( 'pop' , $server); print $receiver->text(); ?> これで、取得出来ていたはずなのですが、エラーもでず、画面が真っしろなままです。 どうしてでしょうか?
tsuemura

2017/08/18 03:04

メールが無いんじゃないですか?
smileheart

2017/08/18 07:05

メールはたくさん、存在しています。 どうも、初めの削除コマンドで削除してから、表示できなくなりました。
tsuemura

2017/08/18 07:45

print $receiver->count(); とするとどうなりますか?
tsuemura

2017/08/18 07:47

HTMLメールの場合は $receiver->text(); では取得できないようですので $receiver->bodyAutoSelect(); を使ってみて下さい。
smileheart

2017/08/19 10:47

お返事ありがとうございます。 昨日、あれから外出してしまい、お返事できませんでした。 早速、試します。
smileheart

2017/08/19 10:52

$receiver = QdmailReceiver::start( 'pop' , $server); $receiver->bodyAutoSelect(); print $receiver->count(); これで、 128  と表示されました。 $receiver = QdmailReceiver::start( 'pop' , $server); $receiver->bodyAutoSelect(); print $receiver->text(); とすると、空白のままです。
tsuemura

2017/08/19 11:34

$receiver->bodyAutoSelect(); print $receiver->text(); ではなく print $receiver->bodyAutoSelect(); です。
smileheart

2017/08/19 13:04

ありがとうございます。 HTMLメールがそのまま取得できました!
smileheart

2017/08/19 13:10

$receiver = QdmailReceiver::start( 'pop' , $server); print $receiver->bodyAutoSelect(); $receiver->delete($pointer); これで、 メール取得し、当該メール削除までできました(^∇^) ありがとうございます。 あと、送信者や、題名の取得なども必要だったんですが、 挑戦して見ます(^∇^) ありがとうございました(^∇^)
tsuemura

2017/08/19 13:21

良かったです。送信者や題名の取得については公式ドキュメントに記載があるので、ぜひ挑戦してみてください。
smileheart

2017/08/19 13:57

$receiver = QdmailReceiver::start( 'pop' , $server); echo htmlspecialchars( print_r( $receiver->header( array('subject','name') , 'none' ) //①件名取得 ,true) ,ENT_NOQUOTES); echo "\r\n"; echo htmlspecialchars( print_r( $receiver->header( array('from',0,'name') , 'none' ) //②送信元のメールアドレス ,true) ,ENT_NOQUOTES); echo "\r\n"; echo htmlspecialchars( print_r( $receiver->header( 'from' , 'none' ) //③送信者 ,true) ,ENT_NOQUOTES); echo "\r\n"; print $receiver->bodyAutoSelect(); $receiver->delete($pointer); // 現在のメールを削除 上記の様に書いたのですが、 同じコマンドなどを書いていて、正しくないと思います。 また、送信者のメールアドレスなどが上手く取得できません。 今回の質問外のことで恐れ入りますが、 ご指導をいただけると嬉しい です。 よろしくお願いします。
tsuemura

2017/08/19 15:27

$receiver->header( array('from',0,'mail') , 'none' ) //②送信元のメールアドレス $receiver->header( array('from',0,'name') , 'none' ) //③送信者 です。 > 同じコマンドなどを書いていて、正しくないと思います。 とは、具体的にどの点でしょうか? 目的が達せられているのであれば良いのではないかと思いますが。
smileheart

2017/08/19 22:58

お返事ありがとうございます。 $receiver = QdmailReceiver::start( 'pop' , $server); echo htmlspecialchars( print_r( $receiver->header( array('subject','name') , 'none' )//①件名取得 ,true) ,ENT_NOQUOTES); echo "\r\n"; echo htmlspecialchars( print_r( $receiver->header( array('from',0,'name') , 'none' )//③送信者 ,true) ,ENT_NOQUOTES); echo "\r\n"; /* ここを有効にすると、HTTP ERROR 500が出てしまいます。 ← A echo htmlspecialchars( print_r( $receiver->header( array('from',0,'mail') , 'none' ) //②送信元のメールアドレス ,true) ,ENT_NOQUOTES); echo "\r\n"; */ print $receiver->bodyAutoSelect(); $receiver->delete($pointer); // 現在のメールを削除 上記の様に、Aの箇所を有効にすると、 HTTP ERROR 500が出てしまいます。どうしてでしょうか? また、書き方なのですが、 以下の様に、①②③とまとめて書く方法はないのかなと思って 質問させて頂きました。 $receiver = QdmailReceiver::start( 'pop' , $server); echo htmlspecialchars( print_r( $receiver->header( array('subject','name') , 'none' )//①件名取得 $receiver->header( array('from',0,'name') , 'none' )//③送信者 $receiver->header( array('from',0,'mail') , 'none' ) //②送信元のメールアドレス ,true) ,ENT_NOQUOTES); echo "\r\n"; print $receiver->bodyAutoSelect(); receiver->delete($pointer); // 現在のメールを削除 よろしくお願いします。
tsuemura

2017/08/20 01:37

//②送信元のメールアドレス の直前に全角スペースがあるためです。半角に直してください。 また、HTTP ERROR 500と出て、何のエラーかが表示されない場合は、ソースの最初の方に ini_set( 'display_errors', 1 ); と書き加えましょう。 まとめて書くには、共通の処理部分を関数にまとめるのが一般的です。 下記URLなどを参考に、ご自身で挑戦してみてください。 https://techacademy.jp/magazine/4925
smileheart

2017/08/20 06:57

ありがとうございます。 挑戦してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問