3

サイトの電子メールを送信する機能があります (phpmailer を使用)。基本的には、php が email.tpl ファイル内のすべてのプレースホルダーをフィードするコンテンツに置き換えることです。私にとっての問題は、コードを繰り返したくないため、関数を作成した理由です(以下)。

PHP関数がなければ、スクリプトで次のことを行います

// email template file
$email_template = "email.tpl";

// Get contact form template from file
$message = file_get_contents($email_template);

// Replace place holders in email template
$message = str_replace("[{USERNAME}]", $username, $message);
$message = str_replace("[{EMAIL}]", $email, $message);

残りの方法はわかりましたがstr_replace()、上記のようにstr_replace()、電子メール テンプレートのプレースホルダーを置き換える関数が複数あります。私が望むのはstr_replace()、関数 (以下) に を追加し、それを取得して[\]、指定した電子メール テンプレート内の のすべてのインスタンスを検索し、それを次のように指定するプレースホルダー値に置き換えることです。str_replace("[\]", 'replace_with', $email_body)

str_replace("[{\}]", 'replace_with', $email_body)問題は、複数のプレースホルダーとその置換値を関数に渡し、与えたすべてのプレースホルダーを処理して対応する値に置き換える方法がわからないことです。

関数を複数の場所で使用し、コードの重複を避けたいため、一部のスクリプトでは、関数に 5 つのプレースホルダーとその値を渡し、別のスクリプトでは 10 個のプレースホルダーとその値をメール テンプレートで使用する関数に渡す必要がある場合があります。

関数を使用するスクリプトで配列を使用し、関数for内でループを使用する必要があるかどうかはわかりません。おそらく、スクリプトから xx プレースホルダーと xx 値を取り込んで、プレースホルダーをループして、そこの値に置き換えます。

上記で参照した私の関数は次のとおりです。はるかに簡単に説明できるスクリプトにコメントしました。

// WILL NEED TO PASS PERHAPS AN ARRAY OF MY PLACEHOLDERS AND THERE VALUES FROM x SCRIPT
// INTO THE FUNCTION ?
function phpmailer($to_email, $email_subject, $email_body, $email_tpl) {

// include php mailer class
require_once("class.phpmailer.php");

// send to email (receipent)
global $to_email;
// add the body for mail
global $email_subject;
// email message body
global $email_body;
// email template
global $email_tpl;

// get email template
$message = file_get_contents($email_tpl);

// replace email template placeholders with content from x script
// FIND ALL INSTANCES OF [{}] IN EMAIL TEMPLATE THAT I FEED THE FUNCTION 
// WITH AND REPLACE IT WITH THERE CORRESPOING VALUES.
// NOT SURE IF I NEED A FOR LOOP HERE PERHAPS TO LOOP THROUGH ALL 
// PLACEHOLDERS I FEED THE FUNCTION WITH AND REPLACE WITH THERE CORRESPONDING VALUES
$email_body       = str_replace("[{\}]", 'replace', $email_body);

// create object of PHPMailer
$mail = new PHPMailer();

// inform class to use smtp
$mail->IsSMTP();
// enable smtp authentication
$mail->SMTPAuth   = SMTP_AUTH;
// host of the smtp server
$mail->Host       = SMTP_HOST;
// port of the smtp server
$mail->Port       = SMTP_PORT;
// smtp user name
$mail->Username   = SMTP_USER;
// smtp user password
$mail->Password   = SMTP_PASS;
// mail charset
$mail->CharSet    = MAIL_CHARSET;

// set from email address
$mail->SetFrom(FROM_EMAIL);
// to address
$mail->AddAddress($to_email);
// email subject
$mail->Subject = $email_subject;
// html message body
$mail->MsgHTML($email_body);
// plain text message body (no html)
$mail->AltBody(strip_tags($email_body));

// finally send the mail
if(!$mail->Send()) {
  echo "Mailer Error: " . $mail->ErrorInfo;
  } else {
  echo "Message sent Successfully!";
  }
}
4

3 に答える 3

16

シンプルです。strtrドキュメントを参照してください:

$vars = array(
    "[{USERNAME}]" => $username,
    "[{EMAIL}]" => $email,
);

$message = strtr($message, $vars);

必要なだけ (または少ない数の) 置換ペアを追加します。ただし、関数を呼び出す前にテンプレートを処理することをお勧めします。これにより、phpmailerテンプレート化とメール送信が分離されます。

class MessageTemplateFile
{
    /**
     * @var string
     */
    private $file;
    /**
     * @var string[] varname => string value
     */
    private $vars;

    public function __construct($file, array $vars = array())
    {
        $this->file = (string)$file;
        $this->setVars($vars);
    }

    public function setVars(array $vars)
    {
        $this->vars = $vars;
    }

    public function getTemplateText()
    {
        return file_get_contents($this->file);
    }

    public function __toString()
    {
        return strtr($this->getTemplateText(), $this->getReplacementPairs());
    }

    private function getReplacementPairs()
    {
        $pairs = array();
        foreach ($this->vars as $name => $value)
        {
            $key = sprintf('[{%s}]', strtoupper($name));
            $pairs[$key] = (string)$value;
        }
        return $pairs;
    }
}

その場合、使用法が大幅に簡素化され、文字列入力が必要な関数にテンプレート全体を渡すことができます。

$vars = compact('username', 'message');
$message = new MessageTemplateFile('email.tpl', $vars);
于 2012-04-11T12:40:43.083 に答える
0

メールテンプレートもphpファイルにしてみませんか?次に、次のようなことができます。

Hello <?=$name?>, my name is <?=$your_name?>, today is <?=$date?>

電子メール内で HTML を生成し、結果を電子メールとして送信します。

私にはあなたが難しい方法でそれを行っているように見えますか?

于 2012-04-11T12:44:39.537 に答える