使用 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 响应?

php.ini,sendmail 配置使用 php 脚本发送电子邮件

如何使用 PHP 邮件从地址更改信封?

如何在 php 中从 localhost 发送电子邮件?

如何在 Windows 7 中运行 PHP 邮件脚本?

从 PHP 脚本发送电子邮件的最佳做法是啥?