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

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

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

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

Q&A

解決済

3回答

8662閲覧

PHPからのメールで文字化けする

yas_usa

総合スコア14

PHP

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

0グッド

2クリップ

投稿2018/05/08 00:32

phpで一斉メールを送ろうと思っています。
お名前コムの共有サーバーを使っています、下記テストで30人ほどに一斉送信を繰り返したところ
一度負荷がかかり過ぎという事で制限をされた際に、
それに気が付かずエラーかと思っていじっっていたらおかしくなりました・・・。

現状で送るとガラケーで本文が文字化けします。
(一度はここまではできていました)
また、ブルーメールというAndroidのアプリでは件名が文字化けします。
この問題の解決で、いろいろいじりすぎて何が何だかわからなくなってしまいました。
どなたかご教授頂けると幸いです。

<?php mb_language('ja'); mb_internal_encoding("UTF-8"); // 本文 $message = ' <html> <head> <title>お知らせ一覧</title> </head> <body> <p>各位<br> 事務局です、一斉送信にてメールをお送りしています。</p> <p>研修サイトのお知らせが更新されました。<br> 事務局からの大切なお知らせですので確認してください。</p> <p><a href="https://" title="お知らせ一覧">お知らせ一覧</a></p> </body> </html> '; $message = wordwrap($message, 70, "\r\n"); //headerを設定 $headers[] = 'MIME-Version: 1.0'; $headers[] = 'Content-Type: text/html; charset="ISO-2022-JP"'; // 追加のヘッダ $from = mb_encode_mimeheader("送信者名","iso-2022-jp")." <AAAAAAA@AAAAA.com>"; $headers[] .= "From: ".$from." \r\n"; // 表題 $subject = 'お知らせ更新'; $subject = mb_convert_encoding($subject,'utf-8',mb_detect_encoding($subject)); $subject = mb_encode_mimeheader($subject,'iso-2022-jp'); // 送信する mail($to, $subject, $message, implode("\r\n", $headers)); ?>

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

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

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

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

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

m.ts10806

2018/05/08 01:41

共有サーバーには1日の送信数など容量に制限があるので利用には注意してください。おおよそ一斉送信のような仕組みを組みたいときには向きません。
yas_usa

2018/05/09 21:44

ご回答ありがとうございます、やはり共有サーバーでは無理があるのでしょうか?
m.ts10806

2018/05/10 00:03

そうですね。やはり共有なので負荷がかかるような処理は制限がかかっていることが多いです。1日のメール送信制限やアップロードの制限など。同じサーバー内の別の人に迷惑がかかりますからね。その辺りは共有サーバーなので仕方ないです。その制限内でおさまるようにするか、専用サーバーをご検討ください。
yas_usa

2018/05/10 00:06

お名前コムは同時に30アドレス以上だと制限されて、解除は電話でお願いをして解除してもらえましたが、2回目は解除できませんとの事でした。予算の関係でこの共有サーバーにされているのでどうにもならないのですが、考えてみます。ありがとうございました!
kei344

2018/05/13 11:17

まだ質問が「受付中」になっていますが、「ベストアンサー」を選び「解決済」にされてはいかがでしょうか。
yas_usa

2018/05/13 11:24

ご指摘ありがとうございます。解決済みにさせていただきました。
guest

回答3

0

一斉送信は初心者にはハードルが高いです。
・ドメインの設定
・バウンスの処理
程度の知識がないと、すぐにドメインごとスパム扱いされてしまいます。

メール配信サービスはいくつもあるので、そちらを検討してはいかがでしょうか。

投稿2018/05/08 03:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yas_usa

2018/05/09 21:46

上記の物はお知らせを作成して、作成出来たら自動で送信というものになるのですが、ご回答いただいたメール配信サービスもそう言った用途には対応しているのでしょうか
退会済みユーザー

退会済みユーザー

2018/05/09 21:59

メール配信サービスが対応しているというより、要件に合致した配信サービスを選定する。とういのが正しいです。 メール配信サービスというくくりだけで考えると ・配信先リストに基づいて、メールする ・メール本文を作成できる という2機能が最小条件となるため、それ以外の付加サービスを比較することになります。 API を用意しているサービスも多いので、今記述のある要件を満たすサービスはいくつもあるかと。 記述のない要件も含めて検討してみるとイイです。 参考: メール配信/比較 でググった最初のリンク https://boxil.jp/mag/a67/
yas_usa

2018/05/09 22:03

ありがとうございます。 一斉送信する相手がかなり流動的なので毎回個別の変更が煩わしいという事での対応だったのですが、共有サーバーでは厳しいという点などを含めて検討させていただきます!
guest

0

ベストアンサー

実際に動かしてみた。
元のソースだと本文がUTF-8なのに
ヘッダーでISO-2022-JP指定してあるから文字化けしてる。

それと、特定のメーラーで件名が文字化けしないように、
対策を追加してある。

php

1<?php 2 3mb_language('ja'); 4mb_internal_encoding("UTF-8"); 5 6// 本文 7$message = ' 8<html> 9<head> 10<title>お知らせ一覧</title> 11</head> 12<body> 13<p>各位<br> 14事務局です、一斉送信にてメールをお送りしています。</p> 15<p>研修サイトのお知らせが更新されました。<br> 16事務局からの大切なお知らせですので確認してください。</p> 17<p><a href="https://" title="お知らせ一覧">お知らせ一覧</a></p> 18</body> 19</html> 20'; 21 22$message = wordwrap($message, 70, "\r\n"); 23$message = mb_convert_encoding($message, "JIS"); 24 25//headerを設定 26$headers[] = 'MIME-Version: 1.0'; 27$headers[] = 'Content-Type: text/html; charset="ISO-2022-JP"'; 28 29// 追加のヘッダ 30$from = mb_encode_mimeheader("送信者名","iso-2022-jp")." <info@example.com>"; 31$headers[] .= "From: ".$from." \r\n"; 32 33// 表題 34$subject = 'お知らせ更新'; 35$subject = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($subject,"JIS","UTF-8"))."?="; 36 37// 送信する 38mail($to, $subject, $message, implode("\r\n", $headers)); 39 40 41?>

あと、メール送信するサーバーの仕様として、メール送信頻度を監視している可能性と、
DKIMやSPFを考慮した送信の仕組みかどうか、という要素もあるので、
それらは別途調べた上で改めて質問に起こすと良いでしょう。

投稿2018/05/08 00:46

編集2018/05/08 04:17
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yas_usa

2018/05/08 01:14

ご回答ありがとうございます。 PHPを始めてまだ時間が浅く知識が足りないので、かなりいろいろ調べての投稿でした。 このサイトは見てましたが、うまくいきませんでした。
退会済みユーザー

退会済みユーザー

2018/05/08 01:33 編集

《うまくいきませんでした》具体的にどうぞ。 ほか、参考にしたサイトや情報も質問内に追記してほしいものです。
yas_usa

2018/05/08 04:34

どこが参考になったのか見つからなくなってしまったものですみません。
退会済みユーザー

退会済みユーザー

2018/05/08 04:38

まるっと書き換えた回答に示したコードで、自分の観測範囲内では文字化けは起きていない模様。 (WindowsのMozilla Thunderbird, iPhone標準メール, AndroidのK-@ mail)
yas_usa

2018/05/09 21:49

hotmail等でも試してみましたが文字化けをするのはガラケー(いじる前は正常に表示されていました)とアンドロイドのblue mailというアプリで送信者名が文字化けしていました。 m6uさんの仰られる通りさらに調べてみます。
guest

0

いろいろ試行錯誤した結果、下記でガラケーとスマホアプリで文字化けもせず出力する事が出来ました。

アドバイスをいただけました皆様ありがとうございました。

また、お名前comはメール送信が1プロセスで30件までとひどかったので、エックスサーバーに移行することにしました。
一時間1500件、一日15000件までOKだそうです。

mb_language('ja'); mb_internal_encoding("UTF-8"); $formname = '送信者名'; $sql = "SELECT * FROM test ORDER BY id"; $result = mysqli_query($con, $sql) or die("データ出力エラー"); $i=1; $headers[] = 'To: メアド'; mail($to, $subject, $message, implode("\r\n", $headers)); //取り出したデータを表示する while($row = mysqli_fetch_array($result,MYSQL_ASSOC)){ // 送信する //headerを設定 $headers = NULL; $headers[] = 'MIME-Version: 1.0'; $headers[] = 'Content-Type: text/html; charset="utf-8"'; // 追加のヘッダ $headers[] = 'From: '.mb_convert_encoding($formname,'utf-8',mb_detect_encoding($formname,"auto")).' <メアド>'; // 表題 $subject = 'お知らせ名'; $subject = mb_convert_encoding($subject,'utf-8',mb_detect_encoding($subject,"auto")); $subject = mb_encode_mimeheader($subject,'iso-2022-jp'); // 本文 $message = file_get_contents('message.php'); $message = mb_convert_encoding($message,'utf-8',mb_detect_encoding($message,"auto")); $headers[] = "To: ".$row['account']; mail($to, $subject, $message, implode("\r\n", $headers)); echo $i."通目送信 ".$row['account']." "; sleep(1.0); $i++;

投稿2018/05/13 10:30

yas_usa

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問