3

クライアントに自動メールを送信するために CakePHP を使用しています。うまく機能していますが、一部の受信者がメールを受信して​​いないようです。そこで、SMTP オプションを使用して電子メールを送信し、Media Temple の電子メール プロバイダーを介して電子メールをルーティングすることにしました。ただし、Media Temple アカウントからメールを送信しようとすると、「550- リレーは許可されていません」というエラーが表示されます。どうやら、Media Temple サーバーが単純にメールの送信を許可していないようです。私が使用しているユーザー名とパスワードが正しいことを確認し、macmail クライアントと iPhone メール クライアントから SMTP 経由でメールを送信できることを確認したため、これは奇妙です。Cakephp でまったく同じ構成の gmail アカウントを使用して SMTP 経由でメールを送信できるため、cakephp のメール設定が正しいことも確認しました。なぜ私が' このエラーが発生し、それを解決する方法は? ありがとう

電子メールの送信を処理するコードは次のとおりです。このクラスは、通常の EmailComponent と同じように、さまざまなコントローラー内から使用します。

    class CanadafindsEmailerComponent extends EmailComponent 
{ 
    ...
    function send($content = null, $template = null, $layout = null) {  
    if(!in_array(TECHY_MONITOR_EMAIL,$this->bcc) && is_array($this->bcc))
        $this->bcc[]=TECHY_MONITOR_EMAIL;
    else if (!in_array(TECHY_MONITOR_EMAIL,$this->bcc) && !is_array($this->bcc))
        $this->bcc=array(TECHY_MONITOR_EMAIL);
    if(DEVSITE){//commented-out code are settings for smtp with gmail, which works fine
        $this->delivery = 'smtp'; 
        $this->smtpOptions = array(
            'port'=>'465',//'465', 
            'timeout'=>'30',//'30',
            'auth' => true,
            'host' => 'ssl://mail.thenumber.biz',//'ssl://smtp.gmail.com',
            'username'=>USERNAME,//'USERNAME@gmail.com',
            'password'=>SMTP_PASSWORD//,
        );
        $this->to=$this->correctFormatOn($this->to);
        $this->bcc=$this->correctFormatOn($this->bcc);
        $this->cc=$this->correctFormatOn($this->cc);
        $this->replyTo=$this->correctFormatOn($this->replyTo);
        $this->from=$this->correctFormatOn($this->from);
    }
    return parent::send($content,$template,$layout);
   }
   function correctFormatOn(&$email){
    if(is_array($email)){
        $copiedEmail=array();
        foreach($email as $singleEmail){
            $copiedEmail[]=$this->correctFormatOnSingle($singleEmail);
        }
        $email=$copiedEmail;
    }else{
        $email=$this->correctFormatOnSingle($email);
    }
    return $email;

   }

   function correctFormatOnSingle(&$email){
    $subEmails=explode(",",$email);
    $fixedSubEmails=array();
    foreach($subEmails as $subEmail){
        $fixedSubEmails[]=preg_replace('/<?([^< ]+)@([^>,]+)[>,]?/i', '<$1@$2>', trim($subEmail));
    }
    $email=implode(",",$fixedSubEmails);
    return $email;
   }
}
4

2 に答える 2

0

このエラーを回避するために、 http://www.dreamincode.net/forums/topic/36108-send-emails-using-php-smtp-direct/に基づいて独自のPHP mail()スクリプトを作成することになりました。

于 2012-08-16T23:05:20.173 に答える
0

私が抱えていた主な問題は、クライアントがサーバーから電子メールを受信して​​いないことでした (そのため、サーバーのデフォルトの電子メール サーバーの代わりに、SMTP サーバーを使用してそれが修正されるかどうかを確認したかったのです)。しかし、他の変更を加えることで、これらのクライアントがサーバーから電子メールを受信できるようにすることができたので、SMTP と Media Temple 電子メール サーバーを使用する必要がなくなりました。(参考までに、クライアントの電子メール サーバーから、Diagnostic-Code: smtp; 550 Access denied - Invalid HELO name (See RFC2821 4.1.1.1)、しかしそれらはサーバーに直接送り返され、Linuxユーザーアカウント「www-data」に入りました。(tail と vim を使用して、/var/mail/www-data でそれらを読み取ります)。電子メールの送信を処理していた postfix が、電子メールの送信者のホスト名 (つまり、「HELO 名」) を canadafinds3 (ドメイン名 canadafinds.com ではなく、Rackspace でサーバーに付けた名前) としてマークしていることを発見しました。それで、/etc/postfix/main.cf でそれを変更し、postfix を再起動しました。それらの特定のクライアントからのバウンスバックはなくなり、全員が再び満足しています。)

于 2012-08-16T23:03:11.783 に答える