我设置了一个自动电子邮件系统,可以将html文件作为电子邮件发送。我使用
将该文件带入PHPMailer的电子邮件中$mail->msgHTML(file_get_contents('mailContent.html'), dirname(__FILE__));
在PHP源代码中,在添加mailContent.html之前,我有一个变量$name='John Appleseed'
(它是动态的,这只是一个例子)
在HTML文件中,我想知道是否有办法在$name
标记中使用此<p>
变量。
答案 0 :(得分:6)
您可以在mailContent.html
文件中添加mailContent.html
之类的特殊字符串,然后将此字符串替换为您想要的值:
在Hello %name%,
…
:
$name='John Appleseed';
$content = str_replace('%name%', $name, file_get_contents('mailContent.html'));
在您的PHP代码中:
$content
Hello %name%, …
的值为$mail->msgHTML($content, dirname(__FILE__));
,您可以发送:
$content = str_replace(
array('%name%', '%foo%'),
array($name, $foo),
file_get_contents('mailContent.html')
);
您还可以使用两个数组在str_replace()
的一次调用中替换多个字符串:
#python 3.5
from tkinter import *
#function to raise the frame on button click
def raiseFrame(frame):
frame.tkraise()
m = PanedWindow(height=500, width=1000, orient=VERTICAL)
m.pack(fill=BOTH, expand=1)
#to expand the column and row to fill the extra space
m.grid_columnconfigure(index=0, weight=1) #this code is not working as it should
m.grid_rowconfigure(index=0, weight=1) #this code is not working as it should
#top frame has two buttons which switches the bottom frames
topFrame = Frame(m, bg="blue")
m.add(topFrame)
button1 = Button(topFrame, text="Raise Frame 2", command=lambda: raiseFrame(frame2)) #raises frame 2 on clicking it
button1.pack(side=LEFT)
button2 = Button(topFrame, text="Raise Frame 1", command=lambda: raiseFrame(frame1)) #raises frame 1 on clicking it
button2.pack(side=LEFT)
#bottomframe acts as container for two other frames which i need to switch
bottomframe = Frame(m, bg="orange")
m.add(bottomframe)
frame1 = Frame(bottomframe, bg="yellow")
frame1.grid(row=0, column=0, sticky="news") ## sticky is not working ##
frame2 = Frame(bottomframe, bg="green")
frame2.grid(row=0, column=0, sticky="news") ## sticky is not working ##
label1 = Label(frame1, text="i should change")
label1.pack(padx=10, pady=10)
label2 = Label(frame2, text="i am changed !!")
label2.pack(padx=10, pady=10)
mainloop()
答案 1 :(得分:1)
extract
会将键转换为数组中键值的变量。希望有道理。它会将数组键转换为变量。
function getHTMLWithDynamicVars(array $arr, $file)
{
ob_start();
extract($arr);
include($file);
$realData = ob_get_contents();
ob_end_clean();
return $realData;
}
来电示例:
$htmlFile = getHTMLWithDynamicVars(['name' => $name], 'mailContent.html');
答案 2 :(得分:1)
您需要使用模板系统。通过在.php
文件中编写HTML,可以使用PHP本身完成模板化:
<html>
<body>
<p>
Hi <?= $name ?>,
</p>
<p>
This is an email message. <?= $someVariable ?>
</p>
</body>
</html>
使用<?= $variable ?>
或<?php echo $variable ?>
添加变量。如果变量来自用户输入,请确保使用htmlspecialchars()
正确转义HTML。
然后到程序中的模板,执行以下操作:
$name = 'John Appleseed';
$someVariable = 'Foo Bar';
ob_start();
include('template.php');
$message = ob_get_contents();
ob_end_clean();
$mail->msgHTML($message, dirname(__FILE__));
除了使用PHP进行简单的模板化之外,您还可以使用PHP的模板语言,例如Twig。
答案 3 :(得分:0)
在我的一个旧脚本中,我有一个函数可以解析文件中看起来像{{ variableName }}
的变量,并将它们替换为数组查找。
function parseVars($emailFile, $vars) {
$vSearch = preg_match_all('/{{.*?}}/', $emailFile, $vVariables);
for ($i=0; $i < $vSearch; $i++) {
$vVariables[0][$i] = str_replace(array('{{', '}}'), NULL, $vVariables[0][$i]);
}
if(count($vVariables[0]) == 0) {
throw new TemplateException("There are no variables to replace.");
}
$formattedFile = '';
foreach ($vVariables[0] as $value) {
$formattedFile = str_replace('{{'.$value.'}}', $vars[$value], $formattedFile);
}
return $formattedFile;
}
答案 4 :(得分:0)
您在发送邮件的同一文件中是否有$name
变量?然后你可以用占位符替换它;
将__NAME__
放在要显示名称的HTML文件中,然后使用str_ireplace('__NAME__', $name, file_get_contents('mailContent.html'))
将占位符替换为$name
变量。