在PHP邮件中允许德语Umlauts吗?

4
我使用以下代码通过联系表单发送电子邮件:

<?php

    /* Geben Sie hier Ihre E-Mail Adresse zwischen den beiden " an: */

    $_emails[0] = "xyz@abc.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;
        }
    }

    ?>

但现在我遇到的问题是,像ä、ö、ü或ß这样的特定德语元音字母在我收到的邮件中显示不正确。我该如何解决?

==编辑==

以下是一个例子:

ö ö

üß Ã¼ÃŸ

ß ÃŸ


2
你的htmlentities调用中有一个拼写错误 - 这可能是问题的一部分,因为它很可能会回退到ISO-8859-1。 - Pekka
无论如何,您需要添加更多细节。目前字符是如何显示的?德语Umlauts完全在ISO-8859-1范围内,不应该引起问题。 - Pekka
@Pekka 谢谢,我添加了一个小例子。 - anon
UTF-8解码失败,可能是由于拼写错误。您需要修复它,或者按@shamittomar和@oezi建议切换到UTF-8。 - Pekka
@Pekka,是的,我已经修复了拼写错误,但这并没有改变任何东西。所以我会尝试shamittomar的解决方案。 - anon
3个回答

9
您需要在电子邮件中添加Content Type: UTF-8头,就像这样:
mail($recipient, $subject, $email,
    'MIME-Version: 1.0' . "\r\n" . 'Content-type: text/plain; charset=UTF-8' . "\r\n");

德语umlauts在ISO-8859-1范围内,因此即使没有也应该可以工作。尽管如此,这仍然是最好的方式,并且对于非西方字符集而言是安全的,所以+1。 - Pekka
@Pekka。好的,也许你是对的。但我也有一些德语应用程序,在所有这些应用程序中,我都不得不将所有内容更改为UTF-8,包括邮件、数据库和脚本,以允许这些字符。 - shamittomar
1
@shamit 如果输入是UTF-8,并且您将其utf8_decode()回到ISO-8859-1,它应该可以工作。但是UTF-8无疑是未来。 - Pekka
1
@Rolfcoptr,那么你的数据可能在早期阶段就已经损坏了。你能否取消htmlentities()调用?你的表单是否采用UTF-8编码? - Pekka
2
@Roflcoptr,请删除以下代码行 $email = htmlentities($email, ENT_QUOTES, 'uft-8');。同时请确保脚本以 UTF-8 without BOM 编码保存。 - shamittomar
显示剩余2条评论

1

尝试为您的邮件设置一个 utf-8 的头部,就像这样(只需将其作为第四个参数添加到 mail() 中):

$header = "MIME-Version: 1.0\r\nContent-type: text/plain; charset=UTF-8\r\n"; 

0

使用像swiftmailer这样的库可以大大简化整个过程。


我知道这是一个相当旧的帖子,但我通过谷歌搜索来到这里。我希望这个提示对其他访问者有所帮助。 - Hafenkranich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接