Отправить письмо с PHP-скриптом -> Как отобразить измененные гласные? - PullRequest
1 голос
/ 11 июня 2010

Я использую этот скрипт 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.

Ответы [ 2 ]

4 голосов
/ 11 июня 2010

Попробуйте кодировку utf-8 в своем заголовке для типа контента:

header("Content-type: text/plain; charset=utf-8");

Также используйте функцию htmlentities для содержимого электронной почты:

$email = htmlentities($email, ENT_QUOTES, 'uft-8');
0 голосов
/ 11 июня 2010

Теперь, если вы правильно сохранили данные, вы можете попробовать следующее:

$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 mail. Возможно, вы захотите взглянуть на SwiftMailer .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...