使用 PHP 脚本发送电子邮件 -> 如何显示变异元音?
Posted
技术标签:
【中文标题】使用 PHP 脚本发送电子邮件 -> 如何显示变异元音?【英文标题】:Send email with PHP script -> How to display mutated vowels? 【发布时间】:2011-03-02 09:29:16 【问题描述】:我使用这个 php 脚本来发送电子邮件。它运行良好,但德语变异元音(ö、ä、ü 等)显示不正确。任何提示如何改变它?
<?php
/* Geben Sie hier Ihre E-Mail Adresse zwischen den beiden " an: */
$_emails[0] = "mail@blablablabla.li";
// Wenn keine $_POST Daten übermittelt wurden, dann abbrechen
if(!isset($_POST) OR empty($_POST))
header("Content-type: text/plain");
echo "Es wurden keine Daten übermittelt!";
exit;
else
// Datum, Uhrzeit und Pfad zum eigenen Script feststellen
$date = date("d.m.Y");
$time = date("H:i");
$host = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
// Empfänger feststellen und auf Gültigkeit prüfen
if(isset($_POST['recipient']) AND isset($_emails[ $_POST['recipient'] ])
AND preg_match("/^.*@.*\..*$/", $_emails[ $_POST['recipient'] ]))
$recipient = $_emails[ $_POST['recipient'] ];
// Wurde kein (gültiger) Empfänger angegeben, es mit $_email[0] versuchen
elseif(isset($_emails[0]) AND preg_match("/^.*@.*\..*$/", $_emails[0]))
$recipient = $_emails[0];
// Ist auch diese Adresse ungültig, mit Fehlermeldung abbrechen
else
header("Content-type: text/plain");
echo "Fehler im Script - es wurde kein Empfänger oder eine ungültige E-Mail Adresse in \ angegeben.";
exit;
// Wenn Betreff übermittelt, diesen verwenden
if(isset($_POST['subject']))
$subject = $_POST['subject'];
// sonst einen Default Betreff verwenden
else
$subject = "Formular Daten von $_SERVER['HTTP_HOST']";
// E-Mai Kopf generieren
$email = "Formular Eintrag\n"
. "\n"
. "Am $date um $time Uhr hast das Script auf $host Formulardaten empfangen,\n"
. "welche nach Angabe des Browsers von $_SERVER['HTTP_REFERER'] stammen.\n"
. "\n"
. "Der Formular Inhalt wird nachfolgend wiedergegeben.\n"
. "\n";
// Alle $_POST Werte an den E-Mail Kopf anhängen
foreach($_POST as $key => $value)
if($key == "redirect" OR $key == "recipient" OR $key == "subject")
continue;
$email .= "Fomular Feld '$key':\n"
. "=============================\n"
. "$value\n"
. "\n";
// E-Mail Fuß anfügen
$email .= "=============================\n"
. "Ende der automatisch generierten E-Mail.";
// Versuchen E-Mail zu versenden
if(!mail($recipient, $subject, $email))
// Ist dies gescheitert, Fehlermeldung ausgeben
echo "Es ist ein Fehler beim Versenden der E-Mail aufgetreten,"
. " eventuell liegt ein Konfigurationsfehler am Server vor.\n\n";
exit;
// Wenn gewünscht, auf Bestätigungsseite weiterleiten
if(isset($_POST['redirect']) AND preg_match("=^(http|ftp)://.*\..*$=", $_POST['redirect']))
header("Location: ".$_POST['redirect']);
exit;
else
header("Content-type: text/html");
echo "Die E-Mail wurde erfolgreich versendet.";
echo '<br>';
echo '<a href="http://www.ovlu.li/cms/index.php?page=kontakt">Zurueck</a>';
exit;
?>
所以我按照第一个答案中的提示进行操作,现在代码如下所示:
<?php
/* Geben Sie hier Ihre E-Mail Adresse zwischen den beiden " an: */
$_emails[0] = "bla@bla.li";
// Wenn keine $_POST Daten übermittelt wurden, dann abbrechen
if(!isset($_POST) OR empty($_POST))
header("Content-type: text/plain; charset=utf-8");
echo "Es wurden keine Daten übermittelt!";
exit;
else
// Datum, Uhrzeit und Pfad zum eigenen Script feststellen
$date = date("d.m.Y");
$time = date("H:i");
$host = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
// Empfänger feststellen und auf Gültigkeit prüfen
if(isset($_POST['recipient']) AND isset($_emails[ $_POST['recipient'] ])
AND preg_match("/^.*@.*\..*$/", $_emails[ $_POST['recipient'] ]))
$recipient = $_emails[ $_POST['recipient'] ];
// Wurde kein (gültiger) Empfänger angegeben, es mit $_email[0] versuchen
elseif(isset($_emails[0]) AND preg_match("/^.*@.*\..*$/", $_emails[0]))
$recipient = $_emails[0];
// Ist auch diese Adresse ungültig, mit Fehlermeldung abbrechen
else
header("Content-type: text/plain");
echo "Fehler im Script - es wurde kein Empfänger oder eine ungültige E-Mail Adresse in \ angegeben.";
exit;
// Wenn Betreff übermittelt, diesen verwenden
if(isset($_POST['subject']))
$subject = $_POST['subject'];
// sonst einen Default Betreff verwenden
else
$subject = "Formular Daten von $_SERVER['HTTP_HOST']";
// E-Mai Kopf generieren
$email = "Formular Eintrag\n"
. "\n"
. "Am $date um $time Uhr hast das Script auf $host Formulardaten empfangen,\n"
. "welche nach Angabe des Browsers von $_SERVER['HTTP_REFERER'] stammen.\n"
. "\n"
. "Der Formular Inhalt wird nachfolgend wiedergegeben.\n"
. "\n";
// Alle $_POST Werte an den E-Mail Kopf anhängen
foreach($_POST as $key => $value)
if($key == "redirect" OR $key == "recipient" OR $key == "subject")
continue;
$email .= "Fomular Feld '$key':\n"
. "=============================\n"
. "$value\n"
. "\n";
// E-Mail Fuß anfügen
$email .= "=============================\n"
. "Ende der automatisch generierten E-Mail.";
$email = htmlentities($email, ENT_QUOTES, 'uft-8');
// Versuchen E-Mail zu versenden
if(!mail($recipient, $subject, $email))
// Ist dies gescheitert, Fehlermeldung ausgeben
echo "Es ist ein Fehler beim Versenden der E-Mail aufgetreten,"
. " eventuell liegt ein Konfigurationsfehler am Server vor.\n\n";
exit;
// Wenn gewünscht, auf Bestätigungsseite weiterleiten
if(isset($_POST['redirect']) AND preg_match("=^(http|ftp)://.*\..*$=", $_POST['redirect']))
header("Location: ".$_POST['redirect']);
exit;
// sonst eine Bestätigung ausgeben
else
header("Content-type: text/html");
echo "Die E-Mail wurde erfolgreich versendet.";
echo '<br>';
echo '<a href="http://foto.roser.li/admin/index.php?page=kontakt">Zurueck</a>';
exit;
?>
现在当我发送电子邮件时,会显示以下消息:
> Warning: htmlentities(): charset
> `uft-8' not supported, assuming
> iso-8859-1 in
> /home/www/web21/html/roser/foto/admin/mail.php
> on line 77 Die E-Mail wurde
> erfolgreich versendet.
【问题讨论】:
这是一个编码问题。必读基础:joelonsoftware.com/articles/Unicode.html 你看过我下面的回答了吗?一年前我有同样的问题,不同的是我创建了整个电子邮件,而你使用邮件功能,但它应该可以工作。电子邮件有它自己的结构和定义内容的方式。你正在做的是 HTTP 编码的东西。阅读 http://en.wikipedia.org/wiki/MIME 上的 RFC,了解更多信息。 嗨。 sry 还没有。徒步旅行了几天。今天或明天不做。谢谢你的回答。 【参考方案1】:尝试在标题中使用 utf-8
字符集作为内容类型:
header("Content-type: text/plain; charset=utf-8");
另外,为您的电子邮件内容使用 htmlentities
函数:
$email = htmlentities($email, ENT_QUOTES, 'uft-8');
【讨论】:
@Sebi:您已经在使用该行,只需将其替换为header("Content-type: text/plain; charset=utf-8");
。希望有效。
所以我通过替换标题对其进行了测试。这不起作用。现在我将测试使用您的 htmlentities,但我必须检查在哪里替换它...【参考方案2】:
现在,假设您已正确保存数据,您可以尝试以下方法。
$subject = "=?UTF-8?B?" . base64_encode($newsletter->subject) . "?=";
这里的想法是让原始电子邮件主题行看起来像这样:
Subject: =?UTF-8?B?base64_encoded_subject?=\r\n;
对于身体,
$email = 'Content-Type: text/plain; charset="ISO-8859-1"' . "\r\n\r\n";
$email .= $email;
这个想法是让电子邮件内容按照它的字符集进行。这对我有用。
要正确获取发布的数据,您需要使用内容/类型标头设置页面编码。
header("Content-type: text/plain; charset=utf-8");
希望它对你有用,我已经有一段时间没有使用 php 邮件功能了你可能想给SwiftMailer 看看。
【讨论】:
以上是关于使用 PHP 脚本发送电子邮件 -> 如何显示变异元音?的主要内容,如果未能解决你的问题,请参考以下文章
PHP 脚本如何向 Dojo 的 xhrGet 发送 JSON Ajax 响应?