SMTPMail邮件

摘要:通过SMTP服务器发送自动电子邮件
版本:20231002
先决条件:PmWiki 2.2.107(用于Notify)、curl、,UTF-8型
状态:实验
维护人员:佩特科
许可证:GPLv2+
用户:(看法?/编辑)

通过SMTP服务器而不是内置的PHP函数“mail()”发送自动电子邮件。

这可能只适用于具有GNU/Linux操作系统的服务器。

描述

从托管计划直接发送的电子邮件邮件()函数有时会被标记为垃圾邮件,或被收件人的邮件服务器拒绝。如果您的wiki位于共享主机上,而其他客户端滥用了此功能并将主机的IP地址列入黑名单,则更有可能出现这种情况。

此功能连接到实际的SMTP服务器,使用用户名和密码进行身份验证,并像使用电子邮件软件或网络邮件一样发送电子邮件。

这是一个轻量级解决方案(比其他现有的仅支持PHP的库轻得多)。它依赖于cURL需要安装在服务器上并可由PHP进程调用的实用程序(在大多数Linux托管计划中可用)。

该配方适用于通知自PmWiki 2.2.107以来的特性,但它不需要任何特定的PmWikiversion版本才能工作,例如用于其他插件。

安装

  • 复制短信.php到您的pmwiki/cookbook目录。请确保您有最新版本。
  • 将以下代码添加到config.php:
include_once(“$FarmD/cookbook/smtpmail.php”);MailSMTP(阵列('服务器'=>'smtps://smtp.gmail.com:465',“userpass”=>“用户名:密码”,'来自'=>'wiki@example.com','密件抄送'=>'webmaster@example.com','curl'=>'curl',“选项”=>“--ssl-k--anyauth”,));$MailFunction=“MailSMTP”;

配置

要配置SMTP服务器和身份验证,请使用单个参数调用函数MailSMTP(设置数组),如下所述。不设置全局变量的原因是为了降低用户名和密码错误可用的风险,例如通过“diag”操作。

设置数组可以包含以下条目:

  • '服务器'=>'smtps://smtp.gmail.com网站:465',#这是邮件服务器的URI,从 smtp:smtps:(安全)协议,然后是服务器域或IP地址,然后是港口。示例服务器适用于GMail/GSuite,请查看公司电子邮件和/或互联网提供商的文档。
  • “userpass”=>“用户名:密码”,#连接到服务器时要使用的用户名(有时是电子邮件地址)和密码。
    请注意,对于Gmail,从2023年起,您可能需要创建一个唯一的“应用程序密码”,与实际密码分开。请参见本页在他们的文档中。
  • '来自'=>'wiki@example.com',#必需。“发件人:”字段的电子邮件地址,通常是帐户的电子邮件地址;有时您需要使用经过身份验证的邮箱的实际地址,否则服务器可能会拒绝或重写标头。
  • '密件抄送'=>'me@example.com',#在所有待发邮件中添加密件抄送:收件人,默认为空。
  • 'curl'=>'curl',#curl可执行文件的路径。
  • “选项”=>“--ssl-k--anyauth”,#传递给curl命令的其他选项。
  • “CountFunction”=>“myCounterCallback”,#使用收件人总数调用的函数,包括收件人:、抄送:和密件抄送:标头。

您可以根据页面、组或用户使用不同的设置数组调用MailSMTP。在发送邮件和后续通话时,会记住这些信息。

用法

要将其用于Notify功能,您需要PmWiki 2.2.107或更新版本$邮件功能=“MailSMTP”;在config.php中,不需要其他交互。

要从插件调用该函数,请使用与mail()PHP函数相同的参数:

$sent=邮件SMTP($to,$subject,$message,$headers);

或者,使用全局$邮件功能如果您不知道是否安装了SMTPMail:

SDV公司($邮件功能,'邮件');已发送$=$邮件功能($to、$subject、$message、$headers);

如果发送了消息,则函数应返回true,否则返回false。

如何调试

发送SMTP邮件可能很棘手,调试可能不太明显。有多种方法可以检查警告/错误。

您发送的消息包含以下行:

$sent=邮件SMTP($to,$subject,$message,$headers);

如果已发送$变量为false,发送失败。然后可以检查2个全局变量:

  • $SMTPMail['curloutput']应包含的响应卷曲命令,其中可能包含有关哪些操作无效的信息。
  • $SMTPMail[下载]可能包含其他有用信息。

如何发送带有附件的富文本HTML邮件

请注意UTF-8型需要在wiki上启用此功能。

该配方包含一个帮助函数,可以使用附件格式化多部分HTML消息。下面是一个如何使用它的示例。

#包含消息部分的数组:$parts=[];#第一部分,消息文本#嵌入前缀为“cid:”而不是“Attach:”的图片$parts[]=“标记:您好,您的消息以wiki标记形式编写,并将其转换为HTML。最美好的祝福,您的支持团队%width=120%cid:logo240.png\“Logo\”%%有问题吗?通过我们的[[Main/FAQ]],[[Main/帮助中心]],或[[mailto:support@example.com|联系我们]]。";#标记中引用的图片文件的相对路径:$parts[]=“cid:uploads/Main/logo240.png”;#对于cid:logo240.png以上#要附加到邮件的另一个文件的相对路径:$parts[“newsletworks.pdf”]=“file:uploads/Main/newsletwork.pdf”;#或者,提供附件作为数据:$parts[“report.csv”]=“内容:”$附件的原始内容;#添加要添加到富文本消息中的任何CSS样式:$SMTPMailStylesFmt['my_message']='.mystyle1{颜色:#888;}.mystyle2{颜色:#800;}{颜色:#f40;}';#创建多部分消息和所需的标头:list($message,$headers)=MultipartMailSMTP($parts,$pagename);#也可以添加一些自定义标题:$标题.="密件抄送:me@example.com回复:support@example.com";#发送消息:$result=MailSMTP($to、$subject、$message、$headers);#$result:成功时为true或1,失败时为false或0

关于标记的注意事项:

  • 电子邮件客户端只支持有限的HTML/CSS,不支持JavaScript。我建议至少在Gmail、Outlook、RoundCube和Thunderbird中检查您的邮件外观,并且只使用常用的HTML和CSS。
    • PmWiki页面包含来自许多CSS文件(核心、皮肤、本地)的许多样式,这些样式在消息中不自动可用。可以在数组中添加样式$SMTPMailStylesFmt打电话之前MultipartMailSMTP().
  • Wiki链接到页面和附加:如果您的Wiki上的HTML源具有包括网站主机名在内的完整链接,则指向文件的链接将在消息中起作用。否则,请使用链接中的完整URL。
  • 附件扩展需要在中定义$上传分机.
    • 一些电子邮件服务器将阻止具有某些附件类型(如可执行文件或脚本文件)的邮件,包括ZIP/TGZ存档中的邮件。
  • 附加:嵌入图片的链接可能无法加载,因为许多电子邮件客户端现在阻止了外部图片,用户可以看到一个链接或按钮来启用这些图片。消息中显示嵌入图片的更好方法是将文件添加为附件,并通过“cid:”前缀引用它,请参阅下一行。
  • 要嵌入附加到消息的图片,请使用自定义的“cid:”前缀,如“cid:filename.jpg”,然后添加包含“cid:path/To/filename.jpg.”的消息部分。
    • 一些电子邮件客户端不允许嵌入某些图像类型,特别是SVG可能根本不显示。

笔记

配方是实验性的,请监控邮箱的Sent文件夹并报告任何问题。

要启用从GMail/GSuite发送SMTP邮件,您可能需要允许“不安全”应用程序,并可能禁用该邮箱的二元身份验证。您可能希望对与主邮箱分离的特定邮箱执行此操作。

请注意,对于Gmail,从2023年起,您可能需要启用2FA并创建一个唯一的“应用程序密码”,与实际密码分开。请参见本页在他们的文档中。

实际的SMTP密码在配置文件中写得很清楚,您应该估计风险。

该配方尚未在许多环境中进行测试,理论上可能会有误报或漏报作为返回值(如“mail”)。监视您的Sent文件夹。

虽然Gmail将发送的邮件保存在sent文件夹中,但其他电子邮件服务器可能不会这样做。您可以使用“bcc:”标头将已发送邮件的副本发送到您可以监视的邮箱。

许多电子邮件提供商只允许每24小时或每小时发送有限数量的邮件,并且计算“收件人”、“抄送”和“密件抄送”中的所有收件人。如果MailSMTP功能工作一段时间后突然失败,这可能是原因。

更改日志/发行说明

  • 20231002使用未定义的$LinkPattern修复警告。添加$SMTPMail[“debug”]、$SMTPMmail[“curloutput”]。
  • 20230702避开一些参数,添加$SMTPMailStylesFmt。
  • 20230430添加$CountFunction,为嵌入图片添加$IMap[“cid”]。
  • 20230302改进一些标题的处理;保留html部分而不使用base64编码。
  • 20230225更新多部分标题以防止某些电子邮件客户端上的附件列表中的内联图像重复。
  • 20230224安装代码已更改,以提高灵活性。(旧配置应该仍然有效,但被视为已弃用。)添加了标头“Message-Id:”,建议使用该标头来减少标记为垃圾邮件的邮件的可能性。添加helper函数以创建包含纯文本、wiki标记、html、嵌入图片和附件的多部分消息。(待记录。)
  • 20200309修复不允许收件人地址带有撇号的错误。
  • 20180112添加函数SMTPMailOpt(),更改安装代码。
  • 20180107首次公开发布,准备测试。

另请参见

贡献者

编写和维护人佩特科.

评论

请参阅上的讨论SMTPMail-Talk(短信通话)

用户注释?:如果您使用、使用或查看此配方,您可以添加您的姓名这些统计数据显示在Cookbook列表中,将帮助新手浏览wiki。