邮件时间-示例

Mail_Mime-示例–生成和发送Mime邮件

例子

<?php(电话)

包括'邮件.php';
包括
'邮件/mime.php';

$文本'电子邮件的文本版本';
$html(美元)'<html><body>html版本的电子邮件</body></html>';
$文件'/home/richard/example.php';
$crlf(美元)“\n”;
$hdrs(美元)=数组(
              
“发件人”=> 'you@yourdomain.com'
              
'主题'=> '测试mime消息'
              
);

$mime(美元)=新邮件时间(_M)(数组(“eol”=>$crlf(美元)));

$mime(美元)->setTXT阀体($文本);
$mime(美元)->setHTMLBody(设置HTML正文)($html(美元));
$mime(美元)->添加附件($文件'文本/纯文本');

$主体$mime美元->得到();
$hdrs(美元)$mime(美元)->标题($hdrs(美元));

$邮件=& 邮件::工厂('邮件');
$邮件->发送('邮局主管@localhost'$hdrs(美元)$主体);

?>
对邮件进行编码(P第页明显的) 邮件解码(_M)(内x个t)
上次更新时间:2019年2月16日星期六-下载文档
你认为这一页有什么不对吗?拜托提交错误报告.
查看此页面的位置:
  • 英语

用户注释:

注释人:magesh@armaven.com
你好,

在这两种情况下(有附件和无附件),邮件发送时都会包含发送日期和时间的详细信息。在outlook中收到的测试邮件中。它在邮件头中显示的不是“send:date&time”,而是“send:none”。

请帮我解决这个问题。

当做,
麦哲希
注释人:fredrik@krafftit.se
SMTP和UTF-8

这是对SMTP的添加。

虽然标题设置为UTF-8,但我在使用UTF-8时遇到了问题。

代替更改//include/pear/Mail/mime.php

“html_charset”=>“UTF-8”,
“text_charset”=>“UTF-8”,
“head_charset”=>“UTF-8”

我可以加上这些

$mimeparams['text_encoding']=“8bit”;
$mimeparams['text_charset']=“UTF-8”;
$mimeparams['html_charset']=“UTF-8”;
$mimeparams['head_charset']=“UTF-8”;

请参见下面的示例。



//需要Pear邮件包
require_once(“Mail.php”);
require_once(“Mail/mime.php”);

$text=“测试”;
$html_message=“<!DOCTYPE html PUBLIC“//W3C//DTD html 4.01过渡//EN”http://www.w3.org/TR/html4/loose.dtd">
<html>
<头部>
<meta http-equiv=“content-type”content=“text/html;charset=UTF-8”>
<标题></标题>
</头>
<body>
<p></p>(第页)
</body>
</html>';

$headers[“From”]=“……”;
$headers[“To”]=“…”;
$headers[“Subject”]=“…”;
$headers[“Content-Type”]='text/html;字符集=UTF-8';
$headers[“Content-Transfer-Encoding”]=“8bit”;


$mime=新邮件时间;
$mime->setTXTBody($text);
$mime->setHTMLBody($html_message);
$mimeparams=数组();


//在添加了以下行之后,它拒绝更改为UTF-8,即使标头设置为此。

$mimeparams['text_encoding']=“8bit”;
$mimeparams['text_charset']=“UTF-8”;
$mimeparams['html_charset']=“UTF-8”;
$mimeparams['head_charset']=“UTF-8”;

$mimeparams[“debug”]=“True”;

$body=$mime->get($mimeparams);
$headers=$mime->headers($headers);
$page_content=“立即发送邮件。”;


//SMTP服务器名称、端口、用户/密码
$smtpinfo[“host”]=“…”;
$smtpinfo[“端口”]=“26”;
$smtpinfo[“auth”]=真;
$smtpinfo[“用户名”]=“…”;
$smtpinfo[“密码”]=“…”;
$smtpinfo[“debug”]=“True”;


//使用mail::factory方法创建邮件对象
$mail=&mail::factory(“smtp”,$smtpinfo);

$mail->send($to,$headers,$body);
注释人:digit6@gmail.com
这里是新的PEAR用户,我想简单地提一下

梨安装Mime_mail

没有安装所需的所有内容。我还得跑

pear安装邮件

否则,<pear_dir>/Mail.php不存在,<pear _dir>-Mail/Mail.php.也不存在

这显然导致我的include命令失败。


我还想提一下,$mime->headers()完全破坏我的“From”变量的方式有问题。你看,我想在电子邮件地址中包含公司名称,这样我的发件人字符串如下所示:

'发件人'=>“\”公司名称\“<user@domain.com>",

headers()函数将运行,如果我从数组中输出“From”值,我将得到以下结果:

\“公司”名称[\n]<user@domain.com>

(或类似的东西)

首先,我不知道它在用引号做什么,也不知道它为什么会移动其中一个,而让另一个保持原样。

发生这种情况时,电子邮件未送达。它只是永远消失了。

在调用headers()之后,我必须执行这一行来修复它所破坏的内容:

$hdrs['From']=$From;

据我所知,当电子邮件地址前面的名称中有空格时,需要引号。为什么这个坏了?
注释人:Charlie Brown
失败为-is。更改此行:
$hdrs=$mime->txtHeaders($hdrs);
收件人:
$hdrs=$mime->标头($hdrs);

前者返回一个字符串,该字符串导致send()失败,因为它需要一个数组。
注释人:jepe@ck.dk
如果您更改为SMTP(和poss-sendmail)邮件方法,请记住
$hdrs=$mime->txtHeaders($hdrs);将破坏代码。

使用

$hdrs=$mime->标头($hdrs);相反

我花了一段时间才弄明白:)
注释人:paul@sp-tech.co.uk
当使用“mail”作为发送方法(如本例所示)时,mail::factory()的第二个参数将成为PHP mail()的第一个参数。

$mail=&mail::factory('mail','-fyou@yourdomain.com');

这将把电子邮件信封返回路径设置为you@yourdomain.com因此,被退回的电子邮件会被放到有用的地方。

如果未设置此选项,则返回路径可能类似于“没有人@your-server-name'.
注释人:Paul
要正确设置信封Reply-To标题(以便反弹的电子邮件到达预期的位置),请对示例进行以下更改:

<?php(电话)
包括('邮件.php');
包括(
'邮件/mime.php');
包括(
'邮件/Mail.php');     //添加了增强的发送功能

$文本'电子邮件的文本版本';
$html(美元)'<html><body>html版本的电子邮件</body></html>';
$文件======================================================================='/home/richard/example.php';
$crlf(美元)“\n”;
$hdrs(美元)=数组(
              
'来自'=> 'you@yourdomain.com'
              
'主题'=>'测试mime消息'
              
);

$mime(美元)=新邮件时间(_M)($crlf(美元));

$mime(美元)->setTXT阀体($文本);
$mime(美元)->setHTMLBody(设置HTML正文)($html(美元));
$mime美元->添加附件($文件'文本/纯文本');

//不要试图按相反的顺序调用这些行
$主体$mime(美元)->得到();
$hdrs(美元)$mime(美元)->标题($hdrs(美元));

$邮件=& 邮件::工厂('邮件'“-f”you@yourdomain.com');   //为PHP mail()函数添加第五个参数
$邮件->发送('邮局主管@localhost'$hdrs(美元)$主体);
?>


我们包括“Mail/Mail.php”,它包含发送函数的更新版本(Mail.php中的函数已弃用)。这允许将PHP mail()函数的第五个参数作为参数包含到mail::factory中
注释人:e5kim0@hotmail.com
我遇到了一个问题。。。我让这个脚本在5月份的windows操作系统中完美运行。当我尝试将它部署到我的centos服务器时,当我尝试$mime=new Mail_time($crlf);我不知道如何使其工作。我已经安装了梨子包,但仍然无法工作!有什么主意吗??谢谢
注释人:e5kim0@hotmail.com
你好。这是我的问题。。。每当我在一个世纪内尝试使用此测试时,当他尝试“$mime=new Mail_time($crlf);”时,它都无法正常工作。。。。在windos运行的xampp中,它确实有效,但我不明白为什么他在centos中失败了??!!谁能帮我。。。。?
注释人:user@example.com
此示例还要求安装Pear包Mail,并正确设置php include_path。
注释人:robert.johnson@icap.com
看看NWDev下面的评论,“\r\n”永远不会扩展为cr-lf,应该用双引号括起来:“\r\n”
注释人:mk@digitalprodukte.de(电子邮件)
我在将文件附加到电子邮件时遇到问题:
<代码>
$mime=新邮件时间(“\n”);
$mime->setTXTBody($txtBody);
$mime->setHTMLBody($htmlBody);

if(is_array($attachments)){
foreach($附件作为$附件){
$mime->addAttachment($attachment[“file”],$attagement[“contentType”],$attachment[“name”],$1attachtion[“isFile”],美元attachtion[“encoding”]);
}
}

$mailBody=$mime->get($_build_params);
$mailHeaders=$mime->headers($mailHeader);

$mail=&mail::factory($this->后端,$this->backendParams);

$mail->send($this->recip,$mailHeaders,$mailBody);
</code>

在这个用例中,邮件已经发送,但几乎所有的Webmailer和电子邮件程序都没有显示附件。我分析了发送的电子邮件的源代码,发现不同的电子邮件部分使用了相同的边界(此处为“_d188467fafaf9f24df2e4585a2d76019”):
<代码>
收件人:[电子邮件地址]
主题:[主题]
MIME版本:1.0
发件人:[另一电子邮件地址]
内容类型:多部分/混合;
boundary=“=_d188467fafaf9f24df2e4585a2d76019”
日期:2009年9月17日星期四17:37:41+0200(CEST)

--_d188467fafaf9f24df2e4585a2d76019
内容类型:多部分/备选;
boundary=“=_d188467fafaf9f24df2e4585a2d76019”

--=_d188467fafaf9f24df2e4585a2d76019
内容传输编码:base64
内容类型:文本/纯文本;charset=“utf-8”

[目录]
--=_d188467fafaf9f24df2e4585a2d76019
内容传输编码:base64
内容类型:text/html;charset=“utf-8”

[目录]
--=_d188467fafaf9f24df2e4585a2d76019--

--=_d188467fafaf9f24df2e4585a2d76019
内容传输编码:base64
内容类型:application/pdf;
name=“file.pdf”;
内容处置:附件;
filename=“file.pdf”;

[目录]
--_d188467fafaf9f24df2e4585a2d76019--
</code>

因此,我写了一个简单(非最佳)的解决方法(只测试了一个附件,需要进一步测试,或者更好:如果这是一个错误,那么应该更正Mail_time):
<代码>
$mailBody=$mime->get($_build_params);
$mailHeaders=$mime->headers($mailHeader);

//解决方法,因为如果存在附件,则对多个电子邮件部分使用相同的边界
if(sizeof($this->attachments)>0){
preg_match(“/boundary=\”(.[^\“]*)\“/e”,$mailHeaders[“Content-Type”],$boundary);
$boundary=$bounder[1];
$bounderyNew=$bounderryNew;
$mailHeaders[“Content-Type”]=preg_replace('/bundary=“(.[^”]*)”/','边界=“'$boundaryNew。”“',$mailHeaders[”Content-Type“]);
$mailBody=preg_replace(“/^\-\-”.$boundary.“/s”,“--”.$binderyNew,$mailBody]);
$mailBody=preg_replace(“/”.$boundary.“--$/s”,$bounderyNew.“--”,$mailBody);
$mailBody=preg_replace(“/”.$boundary.“--(\s*)--”$边界。“/s”,$boundary。"--$1--" . $bounderyNew,$mailBody);
}

//解决方法,因为“\r”破坏了电子邮件(可能是Pear::Mail_Mime和Postfix的问题)
foreach($mailHeaders作为$key=>$header){
$mailHeaders[$key]=str_replace(“\r\n”,“\n”,$header);
}

$mail=&mail::工厂($this->backend,$this->backendParams);
</code>

这将更改顶级电子邮件部分的边界。
注释人:NWdev
设置$crlf参数时,不要这样设置值:

<代码>
define('CRLF','\r\n');
...
$mime=新邮件时间(CRLF);
...
</code>

在我的例子中,传递CRLF常量(相对于变量或实际的“\r\n”文本)会产生一封电子邮件,该电子邮件似乎有正确的终止行,但内容是纯文本(这是一封由多部分组成的HTML和文本电子邮件)。

因此,如果您要定义CRLF常量并节省大量的头疼,请使用此选项:

<代码>
define('CRLF','\r\n');
...
$crlf=crlf;
$mime=新邮件时间($crlf);
...
</code>

或者,当然只需直接传递值。。。

<代码>
$mime=新邮件时间('\r\n');
</code>
注释人:魏斯曼
@伙计。。。,send()方法属于Mail包,而不是Mailtime包。如果您查看Mail的文档,就会发现send()在出现错误时会返回一个PEAR_Error实例。因此,正确的错误检查如下:
$res=$mail->send(…);
if(PEAR::isError($res)){
//错误
}其他{
//成功
}

=> http://pear.php.net/manual/en/package.mail.mail.send.php
注释人:buddy@databoysoftware.com
我注意到哪里都找不到简单的错误处理。
如果我错了,请纠正我,但我认为这应该有效:
if($mailobject->send($recipients,$headers,$message))
{
它奏效了
}
其他的
{
它不起作用
}
注释人:咨询@arlyle.com
认为“\n”就足够了是一个常见的错误,但事实并非如此!这是因为SMTP标准规定所有行必须以“\r\n”结束,而不仅仅是“\n”或“\r”。如果只使用“\n”,某些SMTP守护程序会出现问题。

这就是为什么类的默认行为是使用“\r\n”,并且它确实不应该被覆盖。
注释人:Deger
我无法接触任何smtp方法示例,我花了一段时间学习如何使用这个包。我希望这条消息能让这个梨包装终端用户手册成熟一点,让它直接从树枝上吃起来。

SMTP示例:
请注意:
Auth_SSL是此处的依赖包。您可能会得到这样的信息:pear install--alldeps Mail_Mime-1.4.0.tgz

<?php(电话)
$您的html_消息
'<!DOCTYPE html PUBLIC“-//W3C//DTD html 4.01过渡//EN”“”http://www.w3.org/TR/html4/loose.dtd">
<html>
<头部>
<meta http-equiv=“content-type”content=“text/html;charset=UTF-8”>
<title>你好,世界</标题>
</头>
<body>
<p>你好,世界</p>(第页)
</body>
</html>'
;
//需要Pear邮件包
要求一次(_O)(“Mail.php”);
要求一次(_O)(
“邮件/mime.php”);
$个收件人'度<Deger@bogusdomain.conf>';
//其他标题
$个标题[“发件人”] = '度<Deger@bogusdomain.con>';
$个标题[“收件人”]    = '除气器<Deger@bogusdomain.con>'; 
$个标题[“主题”] = “即食梨”;
$crlf(美元)“\n”;
$mime(美元)=新邮件时间(_M)($crlf(美元));

$mime美元->setHTMLBody(设置HTML正文)($您的html_消息);
$消息$mime(美元)->得到();
$个标题$mime(美元)->标题($个标题);
$参数[“主机”]    = 'mail.bogusdomain.con';
$参数[“身份验证”]    = 真的; //注意:没有分隔符*

//注:DIGEST-MD5也没有分隔符。 
//如果你想使用PLAIN,
//您必须使用这样的分隔符:“PLAIN”
$参数[“身份验证”]    = DIGEST公司-MD5公司; 
$参数[“用户名”]    = '您的用户名';
$参数[“密码”]    = '您的密码';
$参数[“本地主机”]= “这可能是你的IP”;
//调试,以便我们看到当前发生的情况。
$参数[“调试”]    = “正确”; 
//使用mail::factory方法创建邮件对象
$邮件消息=& 邮件::工厂(“smtp”$参数);
$邮件消息->发送($个收件人$个标题$消息);
?>
注释人:jb@fusionquest.com
关于$mime->头($hdrs);。。。

我没有看到它的文档记录,但如果您想覆盖标题,则必须传递第二个参数。例如,您的脚本发送一封电子邮件。然后,您想向其他具有不同主题行的人发送另一封电子邮件。默认情况下,mime将使用之前发送的标题。如果要覆盖它们,则需要执行以下操作:
$mime->标头($hdrs,true);
注释人:josh@ionexinteractive.com
“\n”和“\n”之间有区别。PHP使用单引号将其解释为LITERAL字符串。双引号用于解释字符串。

因此,传递“\n”正好吐出\n。

传递“\n”将输出创建新行所需的实际回车/换行代码。

如果需要单行分隔符(如<br/>),只需传递一个“\n”即可。如果您想在内容之间留一个空白行(即<br/><br/>),请传递“\n\n”。对于三行、四行、五行,依此类推。

使用示例:
$message=“你好”;
$消息。=“\n\n”.'世界!';

require_once('Mail.php');
require_one('Mail/mime.php');

$crlf=“\n”//注意双引号。
$hdrs=数组(
“发件人”=>“某人”<no-reply@example.com>',
“主题”=>“某些主题”);
);

$mime=新邮件时间($crlf);
$mime->setTXTBody($message);

$body=$mime->get();
$hdrs=$mime->标头($hdrs);

$mail=&mail::factory('mail');
$mail->发送('foobar@example.com',$hdrs,$body);

这将向您发送一封如下所示的电子邮件:

你好

世界!
注释人:无人
回复:rolf.offermanns的评论@*

请注意,“\n”与“\n”不同。
注释人:rolf.offermanns@gmx.net
在Mail_time构造函数中为crlf参数传递“\n”对我来说不起作用,并且会生成无效的邮件。

省略参数(从而使用默认值)效果很好!