邮件函数

目录

添加笔记

用户贡献的笔记 8 个笔记

25
webmaster at weethet dot nl
16 年前
如前所述,对于 Windows 用户,有一个假的 sendmail 选项。关于如何执行此操作的更详细说明是

如果您正在使用运行 Windows 的测试服务器,并且使用某种 WAMP 组合(XXAMP、WAMP Server 等),那么您会注意到 PHP sendmail 命令 (mail()) 无法正常工作。Windows 根本没有提供 sendmail 语句...

但是,有一个简单的技巧可以使它工作;

1) 从 http://glob.com.au/sendmail/ 下载 (或使用附带的文件) sendmail.zip

2) 将其解压缩到 c: 驱动器上的某个文件夹中(最好使用简单的路径,例如 c:\wamp\sendmail -- 长文件名可能会导致问题)

3) 编辑您的 PHP.INI 文件(注意:WAMP 用户应从 WAMP 菜单访问他们的 php.ini 文件)。转到 [mail function] 部分,并将其修改为

[mail function]
; 仅限 Win32。
;SMTP =

; 仅限 Win32。
;sendmail_from =

; 仅限 Unix。您也可以提供参数(默认值:“sendmail -t -i”)。
sendmail_path = "C:\wamp\sendmail\sendmail.exe -t"

; 强制添加指定参数以作为额外参数传递
; 给 sendmail 二进制文件。这些参数将始终替换
; 即使在安全模式下,mail() 的第五个参数的值。
;mail.force_extra_paramaters =

.. 并保存更改。

4) 打开 sendmail.ini 并修改设置

[sendmail]

; 您必须将 mail.mydomain.com 更改为您的 SMTP 服务器,
; 或更改为 IIS 的“pickup”目录。(通常为 C:\Inetpub\mailroot\Pickup)
; 通过 IIS 的 pickup 目录传递的电子邮件会导致 sendmail
; 运行更快,但您不会收到错误消息返回到调用
; 应用程序。

smtp_server=mail.yourdomain.com

; SMTP 端口(通常为 25)

smtp_port=25

; 此服务器的默认域将从注册表中读取
; 这将在未提供电子邮件地址时追加到电子邮件地址
; 如果您要覆盖注册表中的值,请取消注释并修改

default_domain=yourdomain.com

; 将 SMTP 错误记录到 error.log(默认为与 sendmail.exe 相同的目录)
; 取消注释以启用日志记录
; error_logfile=sendmail_error.log

; 创建调试日志作为 debug.log(默认为与 sendmail.exe 相同的目录)
; 取消注释以启用调试
; debug_logfile=sendmail_debug.log

; 如果您的 SMTP 服务器需要身份验证,请修改以下两行

;auth_username=
;auth_password=

; 如果您的 SMTP 服务器在 SMTP 身份验证之前使用 POP3,请修改
; 以下三行

pop3_server=mail.yourdomain.com
[email protected]
pop3_password=mysecretpassword

; 强制发送者始终使用以下电子邮件地址,取消注释并
; 用有效的电子邮件地址填充。这只会影响“MAIL FROM”
; 命令,不会修改消息内容的“From: ”标题

[email protected]

; sendmail 将在 ehlo/helo 中使用您的主机名和您的 default_domain
; SMTP 问候语。如果需要,您可以手动设置 ehlo/helo 名称

hostname=

首次尝试时,建议使用可选的错误和调试日志记录,这样您就可以知道出现问题的原因(如果它不起作用)。
Force_sender 也是可选的,但建议您使用它以避免服务器端的混淆。
显然,mail.yourdomain.com、[email protected] 和 mysecretpassword 应该与您的 SMTP 服务器相关信息匹配。
现在重新启动 WAMP 服务(主要是 Apache,以便 PHP 重新读取其配置)。

现在您就可以正常使用了,可以使用 PHP mail() 语句,就像您是 Unix 用户一样...
13
jcwebb at dicoe dot com
18 年前
损坏的附件???
我花了几个小时才解决损坏的附件问题(所有类型的文件)- 答案是:$msg.=$file \r\n \r\n 之后需要一个空行 [真是难以置信但却是事实]。
这里有一些有用的代码,用于发送附件,并在用户电子邮件阅读器中显示 HTML 或文本。

我和许多不同的系统合作,所以...

<?php # 操作系统是 Windows、Mac 还是 Linux
if (strtoupper(substr(PHP_OS,0,3)=='WIN')) {
$eol="\r\n";
} elseif (
strtoupper(substr(PHP_OS,0,3)=='MAC')) {
$eol="\r";
} else {
$eol="\n";
}
?>

<?php
# 附件文件
$f_name="../../letters/".$letter; // 使用相对路径,否则会出现大问题。$letter 是我的附件文件。
$handle=fopen($f_name, 'rb');
$f_contents=fread($handle, filesize($f_name));
$f_contents=chunk_split(base64_encode($f_contents)); // 使用 base64_encode() 对数据进行编码,以便进行传输。
$f_type=filetype($f_name);
fclose($handle);
# 邮件地址
$emailaddress="[email protected]";
# 邮件主题
$emailsubject="这是一个带有 PDF 附件的邮件".date("Y/m/d H:i:s");
# 邮件正文
ob_start();
require(
"emailbody.php"); // 我做了一个简单而漂亮的页面来显示在邮件中
$body=ob_get_contents(); ob_end_clean();

# 常规头信息
$headers .= 'From: Jonny <[email protected]>'.$eol;
$headers .= 'Reply-To: Jonny <[email protected]>'.$eol;
$headers .= 'Return-Path: Jonny <[email protected]>'.$eol; // 这两行用于设置回复地址
$headers .= "Message-ID:<".$now." TheSystem@".$_SERVER['SERVER_NAME'].">".$eol;
$headers .= "X-Mailer: PHP v".phpversion().$eol; // 这两行有助于避免垃圾邮件过滤器
# 用于标记分割和多类型头的边界
$mime_boundary=md5(time());
$headers .= 'MIME-Version: 1.0'.$eol;
$headers .= "Content-Type: multipart/related; boundary=\"".$mime_boundary."\"".$eol;
$msg = "";

# 附件
$msg .= "--".$mime_boundary.$eol;
$msg .= "Content-Type: application/pdf; name=\"".$letter."\"".$eol; // 有时我需要发送 MS Word 文档,使用 'msword' 代替 'pdf'
$msg .= "Content-Transfer-Encoding: base64".$eol;
$msg .= "Content-Disposition: attachment; filename=\"".$letter."\"".$eol.$eol; // !! 这行需要两个换行符 !! 非常重要 !!
$msg .= $f_contents.$eol.$eol;
# 设置文本或 html
$msg .= "Content-Type: multipart/alternative".$eol;

# 文本版本
$msg .= "--".$mime_boundary.$eol;
$msg .= "Content-Type: text/plain; charset=iso-8859-1".$eol;
$msg .= "Content-Transfer-Encoding: 8bit".$eol;
$msg .= "这是一个多部分 MIME 格式的邮件。".$eol;
$msg .= "如果您正在阅读此邮件,请更新您的邮件阅读软件。".$eol;
$msg .= "+ + 来自天才 Jon 的纯文本邮件 + +".$eol.$eol;

# HTML 版本
$msg .= "--".$mime_boundary.$eol;
$msg .= "Content-Type: text/html; charset=iso-8859-1".$eol;
$msg .= "Content-Transfer-Encoding: 8bit".$eol;
$msg .= $body.$eol.$eol;

# 完成
$msg .= "--".$mime_boundary."--".$eol.$eol; // 以两个换行符结尾,以提高安全性。参见注入。

# 发送邮件
ini_set(sendmail_from,'[email protected]'); // INI 行用于强制使用发件人地址!
mail($emailaddress, $emailsubject, $msg, $headers);
ini_restore(sendmail_from);
?>


我希望这能有所帮助。
Jon Webb [马德里&伦敦]

[编辑 thiago 注意:代码已修复,修复来自 o.straesser AT gmx DOT de]
-1
anselm at netuxo dot co dot uk
17 年前
如果您不想或无法为您的服务器配置 sendmail,esmtp 是一个不错的替代方案——它是一个配置最少的 smtp 邮件发送器,可以用作 sendmail 的替代品:http://esmtp.sourceforge.net/
-1
aweather88 at gmail dot com
18 年前
我花了几个小时搜索网页,试图弄清楚为什么每次我在服务器上使用 mail() 函数时都会收到 "WARNING: mail(): SMTP server response: 501 5.5.4 Invalid Address " 错误。我知道根据其他非 IIS 6.0 配置,一切都已正确设置了 SMTP。

事实证明,IIS 6.0 SMTP 服务不喜欢邮件头中 "From" 字段的格式。例如
<?PHP
// 这行代码不能正确发送邮件消息
$headers .= "From: \"".$fromname."\" <".$fromaddress.">\n";
?>
但是这个可以工作
<?PHP
// 这行代码可以正确发送邮件消息
$headers .= "From: \"".$fromaddress."\"\n";
?>

解决方法在 Microsoft 文章 ID 291828 中(http://support.microsoft.com/?id=291828)。尽管“错误”的解决方法是针对 Exchange 2003 上的 IIS 6.0 与 UNIX 服务器通信的情况,但这确实解决了问题。只需跳到 Exchange 2003 的最后一节,并按照说明使用 IIS 6 资源工具包中提供的 MetaBase Explorer 修改 IIS 6 MetaBase。
-3
lawcd at ntlworld dot com
18 年前
对于那些使用 exim 的人来说,如果它没有使用 -i 选项发送邮件,并且您无法轻松更改此选项,您可能需要查看 imap_mail() 函数,该函数的工作方式几乎相同,并且不使用 exim,大多数网站主机都提供此函数。如果您使用的是自己的服务器,则需要使用 imap 库等编译 php。

参见 https://php.net/manual/en/function.imap-mail.php
-3
josh at sdfahrenheit dot com
20 年前
对于遇到附件文件乱码问题的任何人,请确保您的 php.ini 中的 magic_quotes_runtime 设置为 Off——它会在您的附件数据中添加奇怪的转义字符,从而导致附件乱码。

这让我非常头疼。
-15
martin dot felis at gmx dot de
18 年前
如果您使用的是 chroot 环境,并且不想在其中使用完整的邮件发送器,mini-sendmail(可以在 http://www.acme.com/software/mini_sendmail/ 找到)非常有用。它只是一个小型二进制文件,通过端口 25 将邮件发送到本地 MTA。

Martin
-32
derernst at gmx dot ch
18 年前
针对电子邮件注入尝试的表单输入检查方法建议。

任何预期来自单行文本字段的输入,如果包含换行符,都可以直接拒绝。第二个函数尝试通过仅在换行符之前匹配可疑字符串来最大限度地减少对非恶意输入的匹配。(无论如何,如果这被认为是安全的,它当然也适用于单行输入。)

<?php

/**
* 检查单行输入:
* 如果文本包含换行符,则返回 false
*/
function has_no_newlines($text)
{
return
preg_match("/(%0A|%0D|\\n+|\\r+)/i", $text) == 0;
}

/**
* 检查多行输入:
* 如果文本包含换行符后跟
* 电子邮件头特定字符串,则返回 false
*/
function has_no_emailheaders($text)
{
return
preg_match("/(%0A|%0D|\\n+|\\r+)(content-type:|to:|cc:|bcc:)/i", $text) == 0;
}

?>
To Top