web-dev-qa-db-ja.com

PHP Centosサーバーでメール機能が動作しない

私はcentos Serverを使用しており、ユーザーにメールを送信する必要があるため、1つのサーバーから実行中のコードをコピーしてここで使用しましたが、メールを送信していません。

コードは:

                $to = $email; //writing mail to the user
                $subject = "Hii";
                $message = "<table>
                <tr><td> Hello ".$email.",</td></tr>
                <tr><td> Some Text </td></tr>
                <tr><td> Some Text </td></tr>
                <tr><td> Some Text </td></tr>
                <tr><td> Some Text </td></tr>
                </table>" ;
                $from = "[email protected]";
                // To send HTML mail, the Content-type header must be set
                    $headers  = 'MIME-Version: 1.0' . "\r\n";
                    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
                // Additional headers
                $headers .= 'From: Team <[email protected]>' . "\r\n";

                if(mail($to,$subject,$message,$headers))
                {
                    echo "0";// mail sent Successfully.
                }
                else
                {
                    echo "1";
                }

常に1を出力します。他のプロジェクトでも同じコードが正常に実行されます。ここでも有効にするためにできることを教えてください。どんな助けも大歓迎です!

16
Astha

Sendmail *をインストールし、次のコマンドを実行した後:

[root@sendmail ~]# yum install sendmail*
[root@sendmail mail]# yum install dovecot
[root@sendmail mail]# cd /etc/mail/
[root@sendmail mail]# vi local-Host-names
# local-Host-names - include all aliases for your machine here.
example.com
[root@sendmail mail]# vi /etc/dovecot.conf
protocols = imap pop3 //uncomment
[root@sendmail mail]# m4 sendmail.mc > sendmail.cf
[root@sendmail mail]# make
[root@sendmail mail]# /etc/init.d/sendmail start
[root@sendmail mail]# /etc/init.d/saslauthd start
[root@sendmail mail]# /etc/init.d/dovecot start
[root@sendmail mail]# chkconfig sendmail on
[root@sendmail mail]# chkconfig dovecot on
[root@sendmail mail]# chkconfig saslauthd on

私はまだ同じ問題を抱えていました。 /var/log/maillogとエラーが発生しました:

My unqualified Host name (domain) unknown; sleeping for retry

さらに検索した後、/etc/hosts from:

127.0.0.1     localhost localhost.localdomain domain
ip.ip.ip.ip  domain localhost 

に:

 127.0.0.1   localhost.localdomain localhost domain
 ip.ip.ip.ip  localhost domain  

そして今、メール機能は正常に動作しています。

24
Astha

私はこれが回答されたことを知っていますが、同様の問題がありました。誰か他の人に....

/ var/log/maillogは、Postfixパーミッションの問題を示しました。

sendmail: fatal: chdir /var/spool/postfix: Permission denied

エラーの追跡私は、CentOS上のSELinuxポリシーであるソリューションを見つけました(バージョン6を使用しています)。

素早い回答: setsebool httpd_can_sendmail 1

-Pを使用して、変更を永続的にすることができます。パスワードリセットメールが必要なだけなので、私の場合は必要ありません。

クレジット: http://www.spidersoft.com.au/2011/posftix-permission-denied-problem/?ModPagespeed=noscript

編集:私はコメントしただろうが、私はまだ十分な評判を持っていません。

6
preOtep

同じ問題がありました。私は自宅に開発サーバーを持ち、外部サーバーハウスにprodサーバーを持ち、受信メールは他のサーバーに送られます。 PHP:s mail()は、サーバーハウスではうまく機能しますが、自宅では機能しません。

私は少しテストして、サーバーハウスと同じ方法で自宅で動作するようにしました。サーバーハウスとホームのメソッドの違いは、sendmailの構成です。サーバーハウスsendmailをインストールするだけで問題ありませんでしたが、自宅ではsendmail-cfもインストールし、それを使用して送信メールサーバーアドレスを追加する必要がありました。

Centos、Apache、およびPHPがホームサーバーにあり、PHP:s mail()関数を使用してメールを送信したいとします。

1)ホームサーバーのホスト名を次の2つの場所に設定します:/ etc/sysconfig/networkと/ proc/sys/kernel/hostnameこの方法:

#nano /etc/sysconfig/network
 NETWORKING = yes 
 HOSTNAME = mydns157.dlinkddns.com 
 
#nano/proc/sys/kernel/hostname 
 HOSTNAME = mydns157.dlinkddns.com 

2)sendmailとsendmail-cfをインストールします。

#yum install sendmail sendmail-cf 

3)次の行を/etc/mail/sendmail.mcに追加します。ISPの送信メールサーバーがあります。

 define( `SMART_Host '、` mail.myisp.com')dnl 

4)sendmail.cfを更新します。

#/etc/mail/make

5)sendmailとApacheを再起動します。

#service sendmail restart 
#service httpd restart 

6)ホスト名を更新するために起動します:

#再起動

それでおしまい。現在、次のように機能します。

#php -r'mail( "[email protected]"、 "Subject"、 "Body"、null、 "[email protected]"); '

-fをスキップできます。

#php -r'mail( "[email protected]"、 "Subject"、 "Body"); '

この場合、送信者の名前は自動的にuser @ hostnameになります。 [email protected]


ホスト名のメモ

ホスト名の選択は重要です。 Centos6のデフォルトは_localhost.localdomain_ですが、mail()を呼び出すときに独自の送信者アドレス(たとえば_'[email protected]'_)をスキップすると、mail()は動作しません。実際のアドレスを送信者アドレスとして使用して常にmail()を呼び出すことが確かな場合、ホスト名は何でもかまいませんが、送信者アドレスのないmail()の既存の呼び出しがある場合(私はサーバーのホスト名はこれらの場合にsender-address-domainとして使用されるため、ホスト名として実際のドメインが必要です。ドメインには少なくともDNS Aレコードが必要であるという意味で本当です(何らかの理由で、ISPは送信者アドレスにNSレコードを必要とせず、Aレコードのみを必要としますが、ISPでテストおよびチェックします)。電子メール以外のドメインを送信者アドレスとして使用することのマイナス面は、返信と配信通知がちょっとした天国に行くことですが、コードで送信者アドレスをドロップすると、通常、何かをテストしてデバッグし、返信する必要がないことを意味します機能。ドメインは、たとえばダイナミックDNSサーバーから取得するもの。 _mydns157.dlinkddns.com_。ホームルーターを指すことができます(ただし、そうする必要はありません)。次のような配列を返すdns_get_record("mydns157.dlinkddns.com")を使用して、PHPでDNSレコードを取得できます。

 [ホスト] => mydns157.dlinkddns.com 
 [タイプ] => A 
 [ip] => 92.152.214.137 
 [クラス] => IN 
 [ttl] => 7 

上記のDNSレコードのtypeNSである場合、ドメインは電子メールドメインとして機能し、自身のサーバーのホスト名には問題ありませんが、効果は少し異なります。ホスト名として既存のメールドメインを設定した場合(例: _myexistingemaildomain.com_、およびメッセージを_[email protected]_に送信します。たとえば、デバッグの目的で、sendmailは、このサーバー上のユーザーmeのメールフォルダーにメッセージを配信する必要があると考えます。 meユーザーが存在しない場合、送信は失敗し、ユーザーが存在する場合、メッセージは_/var/mail/me_に送られます。これはあなたが望むものですが、(私のように)あなたはすべてのメッセージがサーバーフォルダの代わりに外部に配信されることを望むかもしれません。

ホスト名(DNSレコード内)は、送信者アドレスが不足している場合にmail()を機能させるためにサーバーの実際の外部IPを指す必要はありませんが、害はありません。主なことは、ホスト名に有効なAレコードがあり、ドメインが自分のものであることです。ドメインが自分のものでない場合、セキュリティホールが生じる可能性があります。ホスト名として既存の電子メールドメインを設定した場合(例: _Microsoft.com_(何らかの理由で)、mail()の呼び出し時に独自の送信者アドレスを追加せずにメッセージを送信する(例_'[email protected]'_)、送信者アドレスは自動的に_[email protected]_になります。ルートとしてログインしている場合、送信者アドレスは_[email protected]_になります。失敗した配信の返信と通知は_[email protected]_に送られますが、これは意図しない場合があります。

6
Timo Kähkönen

これを簡単に行うには、SwiftMailerを使用することをお勧めします。

require_once('../lib/swiftMailer/lib/Swift_required.php');
function sendEmail(){
  //Sendmail
  $transport = Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs');

  //Create the Mailer using your created Transport
  $mailer = Swift_Mailer::newInstance($transport);

  $body="Dear $fname,\n\nYour job application was successful. \n\nYours,\n\nEamorr\n\n\n\n\n\n\n";


  //Create a message
  $message = Swift_Message::newInstance('Subject goes here')
    ->setFrom(array($email => "[email protected]"))
    ->setTo(array($email => "$fname $lname"))
    ->setBody($body);

  //Send the message
  $result = $mailer->send($message);
}
2
Eamorr

これはあなたを助けるかもしれません

ini_set('sendmail_from', '[email protected]'); 
2
Sonal Khunt

私はちょうどこの問題を抱えていました、二つのこと。

私のメールはスパムになりそうだったので、間違いなくチェックしてください。おそらく、サーバーに適切なPTRおよびSPFレコードがなかったためです。

しかし、これでsendmailをテストする方がずっと簡単だとわかりました。

sendmail -s '[email protected]'
Subject:Testing!
hey there, how ya doin?
CTRL+D
2
Phil LaNasa

/ var/log/maillogのメールログを常に確認して、問題の原因を確認してください。ポストフィックスを適切に構成した後、同様の問題が一度発生しました。 fatal: setrlimit: Permission deniedというエラーが発生しました。回避策は、getsebool httpd_can_sendmailコマンドによって、httpdがメールを送信できるかどうかを確認することです。 httpdがメールを送信できる場合はオフにし、setsebool -P httpd_can_sendmail 1コマンドで有効にします。お役に立てれば。

0
Ratul Doley