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

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

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

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

Q&A

解決済

5回答

4329閲覧

【PHP】開始位置から次の改行までの文字列を切り出したい

next1ka2u

総合スコア8

PHP

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

0グッド

1クリップ

投稿2017/10/25 14:09

###メールデータの成型を行っています
メールの生データを利用してそれぞれの値を取り出す為のコードを書いています。
抜き出したいメールデータは以下になります。

  • Toアドレス(Delivered-To:)
  • Fromアドレス(From:)
  • Replyアドレス(Return-Path:)
  • 日付(Date:)
  • 件名(Subject:)
  • メーラー(X-Mailer:)
  • バウンダリ(boundary=)
  • 本文(text/plain , text/html)
  • Content-Type(Content-Type:)
  • charset(文字コード)

とまぁ、上げだしたらキリがないのですが今悩んでいるところが文字列の切り出しです。
開始位置から最初の改行(\r\n)までの文字列を切り出したいのですがどのようなコードを書いていいやら解らず、手が止まってしまっています。出来る限り、自分でなんとかしようと今まで質問サイトは使わないよう、心がけてきましたが先人たちのお力添えを頂かないと自分の力ではどうしようもなくなってきました。

php

1$maildata = file_get_contents("original_msg.txt"); // 生メールデータ for Gmail 2$toAdd = mb_strpos($maildata, 'Delivered-To: '); // 14文字 3$start_toAdd = $toAdd + 14; // 開始位置:'Delivered-To: 'の最後の空白の後から開始 4$end_toAdd = '\r\n'; // 最初に出てくるCRLF改行文字の手前まで切り出し 5 6/* 例えば$maildata変数の文字列の中で 7 * Delivered-To: hogehoge@gmail.com 8 * 上記の1行にある'hogehoge@gmail.com'を切り出す為のプロセスが解らない状態です。 9*/

上記で開始位置の指定、終了文字を指定しているのでこれらを使ってどうにかすると思うのですが思った通りに動くstr関係の関数がないのと、どの関数を組み合わせて見つかった文字列から最初の改行までを切り出せばいいのか解りません。

ご指導頂ければ幸いです。宜しくお願い致します。

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

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

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

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

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

guest

回答5

0

mailparse

メールデータをパースする専用のモジュールがあります。

投稿2017/10/25 14:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

next1ka2u

2017/10/25 14:34

ご回答有難う御座います。 モジュールのインストールが出来ないサーバでの実装を目指しております。 Mailparseの存在は以前より知っていましたがインストールできないため使えない状態です。
guest

0

使ったことないですけど、このあたりでイケる気がします。
php-mime-mail-parser

投稿2017/10/25 14:18

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

next1ka2u

2017/10/25 14:35

ご回答有難う御座います。 php-mime-mail-parserの存在は知っていましたが使い方がいまいち解らないのと composer等が使えないサーバでの実装を目指しています。
退会済みユーザー

退会済みユーザー

2017/10/25 14:56

では正規表現で。
退会済みユーザー

退会済みユーザー

2017/10/25 15:02

composer 使えなくても、インストール可能ですよ。 zipを展開するだけで使えるはずです。
退会済みユーザー

退会済みユーザー

2017/10/25 15:08

Requirements に mailparse があるんでダメっぽいです。
退会済みユーザー

退会済みユーザー

2017/10/25 15:09

最悪、pear の mailparse を使う手があるけど、あまりお勧めはできませんねー
next1ka2u

2017/10/25 15:23

有難う御座います。 メールデータと書いたので色々とライブラリ等を紹介いただけたかと思いますが 普通にテキストデータとしても使う予定があるので正規表現も検討してみます。 他に方法があるか引き続き模索してみたいと思います。
退会済みユーザー

退会済みユーザー

2017/10/26 02:12

私自身が構築するのであれば、メールの構文解析みたいな(仕様的に)面倒くさい車輪は再発明したくないので、ライブラリの使用できる環境へ引っ越します。メールの仕様って調べれば調べるほどカオスです。。。
next1ka2u

2017/10/26 07:40

今現在、ちょっと引っ越せる環境がまだ出来ていないので自力でなんとかしようとしています。仰る通り、環境を変えることが出来ればやれる幅が広がるのですが・・・。 小生の疑問にご回答戴き誠に有難う御座います。環境が変わればライブラリの使用も視野に入れてみます。
guest

0

文字列内から指定の開始文字から終了文字までの間の文字を取得するPHP

上記サイトを参考にさせて戴きました。

php

1$html_buf= file_get_contents("original_msg.txt"); 2$start_buf = 'Delivered-To: '; //一例としてToアドレスの取得 3$end_buf = "\r\n"; // $start_bufから最初に出てくるCRLF 4$toAdd = html_cut_syutoku($html_buf,$start_buf,$end_buf,0); // 参考サイトにある関数 5var_dump($toAdd); 6// 出力:string:'hogehoge@gmail.com'

複数行に跨るデータ(添付ファイルやインラインの画像など)の処理は出来ませんが一意なデータであるアドレスや日付などは上記の参考サイトの関数で取れるようになりました。

boundaryやbase64エンコードされているデータが厄介ではありますが精進致します。
またお世話になるかと思いますがその際は宜しくお願い致します。

投稿2017/10/26 10:07

next1ka2u

総合スコア8

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

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

0

ベストアンサー

phpならば、file_get_contentsを使わずに単純にfopenとfgetsを使えば一行ずつデータを取り出せます。

php

1$file = fopen("original_msg.txt", "r"); 2 3if($file){ 4 while ($line = fgets($file)) { 5 // 処理を記述 6 } 7} 8 9fclose($file); 10

投稿2017/10/26 00:57

編集2017/10/26 00:59
masayoshi0222

総合スコア162

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

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

next1ka2u

2017/10/26 07:44

ご回答有難う御座います。 もっと単純に考えれば良さそうですね。 頂いたやり方で試してみます。精進致します。
next1ka2u

2017/10/26 09:53

具体的なコードを書いて頂いたのでベストアンサーに選びました。 有難う御座います。
guest

0

"\r\n\t"を削除しておいて、"\r\n"explode したら行ごとの配列が出来るので、それを ":" で分割すれば採れそうな気がします。(ヘッダ部以外については考慮していません)

【インターネット・プロトコル詳説(3):MIME(Multipurpose Internet Mail Extensions)~前編 - @IT】
http://www.atmarkit.co.jp/ait/articles/0104/10/news002.html

【PHP: explode - Manual】
http://php.net/manual/ja/function.explode.php

【PHP: str_replace - Manual】
http://php.net/manual/ja/function.str-replace.php

投稿2017/10/25 15:33

kei344

総合スコア69398

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

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

next1ka2u

2017/10/26 07:43

ご回答有難う御座います。ご指導頂いたやり方で試してみます。 まだまだ未熟者ですがまたお見かけましたらご指導宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問