使用某些字符时,不会发送电子邮件表格

时间:2012-06-13 13:33:12

标签: php actionscript-3

我已经在这几天和几天了,而且我已经拔出了很多头发,我现在头上还留着一根头发。那头发是我最后的骄傲。但严重的是,我已经找到了几十个答案,但 none 似乎适用于我的问题!

我有一个我制作的网站的电子邮件表格。站点和表单是在Flash(AS3)中制作的,处理电子邮件的脚本是外部php文件。电子邮件表单可以正常使用,除了,当我使用某些字符时

  • %未在电子邮件中显示,包括其后面的任何文字
  • &<>出现时,表单会说'发送.. ',但不会超出该点;我没有收到任何电子邮件。
  • 所有(或至少)其他字符如!@#$ ^ * _ + - = ~`都没问题。

我已经确定AS3和php代码都有

  • "MIME-Version: 1.0; Content-Type: text/html; charset=utf-8"包含在我的发送 if 检查php文件中;

  • AS3中的文字字段设置为htmlText,而不仅仅是text


我的脚本:

mail.php     

    if( $yourName == true ) {
        $sender = $fromEmail;
        $yourEmail = "myemail@example.com"; // Here i of course use my own email address
        $ipAddress = $_SERVER['REMOTE_ADDR']; // This gets the user's ip Address

        $emailMsg = "Van: $sender\r\n" . 
                    "Name: $yourName\r" .
                    "Subject: $yourSubject\n\n" .
                    "$yourMsg\n\n\n\n" .
                    "------------------------------\r" .
                    "Sent from IP-address $ipAddress\r" .
                    "X-Mailer: PHP/" . phpversion();
       # these are three (out of many) things I tried to work around the problem #          
        //$emailMsg = str_replace( '&', "&amp;", $emailMsg );
        //$emailMsg = htmlspecialchars($emailMsg, ENT_QUOTES);
        //$emailMsg = mysql_real_escape_string($emailMsg);

        $return = "From: $sender\r\n";

        if( mail($yourEmail, "$yourSubject", $emailMsg, $return, "MIME-Version: 1.0; Content-Type: text/html; charset=utf-8")) { 
            echo "sentStatus=yes";
        }
        else {
            echo "sentStatus=no";
        }
    }
?>

FormScript.as

package  {
    /*required imports*/

public class FormScript extends Sprite {
    /*here are the variable declarations*/

    public function FormScript() {
        sendbtn.buttonMode = true;
        sendbtn.addEventListener(MouseEvent.CLICK, submit);
        resetbtn.buttonMode = true;
        resetbtn.addEventListener(MouseEvent.CLICK, reset);
        urlRequest.method = URLRequestMethod.POST;

        /*here are are some positionings and addchilds*/

        function init():void {
             //Set all fields to empty
             yourName.htmlText = "";
             fromEmail.htmlText = "";
             yourSubject.htmlText = "";
             yourMsg.htmlText = "";
             valid.text = "";
        }

        function submit(e:MouseEvent):void {                

        //Check to see if any of the fields are empty
            if(yourName.htmlText == "" || fromEmail.htmlText == "" ||
                yourSubject.htmlText == "" ||yourMsg.htmlText == "" ) {
                valid.text = "All fields must be filled in";
            }//Check if you're using a valid email address

            else if(!checkEmail(fromEmail.htmlText)) {
                valid.text = "Please enter a valid e-mail address";
            } 

            else { 
                valid.text = "Sending..";

                var emailData:String = 
                "name=" + yourName.htmlText +
                "&from=" + fromEmail.htmlText +
                "&subject=" + yourSubject.htmlText +
                "&msg=" + yourMsg.htmlText;

                var urlVars:URLVariables = new URLVariables(emailData);
                urlVars.dataFormat = URLLoaderDataFormat.TEXT;
                urlRequest.data = urlVars; varLoad.load( urlRequest );
                varLoad.addEventListener(Event.COMPLETE, thankYou );
            }
        }
        function reset(e:MouseEvent):void {
            init(); //call the initial clear function
        }
        function checkEmail(s:String):Boolean {
            //yourMsg.text = escape("&");

            //This tests for correct email address
            var p:RegExp = /(\w|[_.\-])+@((\w|-)+\.)+\w{2,4}+/;
            var r:Object = p.exec(s);
            if( r == null ) {
                return false;
            }
            return true;
        }

        function thankYou(e:Event):void { 
            var loader:URLLoader = URLLoader(e.target); 
            var sent = new URLVariables(loader.data).sentStatus;
            //valid.text = sent;
            if( sent == "yes" ) {
                valid.text = "Thank you for your e-mail!"; timer = new Timer(500);
                timer.addEventListener(TimerEvent.TIMER, msgSent);
                timer.start();
            }
            else {
                valid.text = "Something went wrong, please try again";
            }
        }

        function msgSent(te:TimerEvent):void {
            if(timer.currentCount >= 10) {
                init();
                timer.removeEventListener(TimerEvent.TIMER, msgSent);
            }
        }
    }
}
}

关键字:&符号特殊字符小于大于大于的符号请不要编辑此内容,其他人可以找到此问题,因为您无法搜索“&amp;”等等。

3 个答案:

答案 0 :(得分:1)

在Flash中,需要对值进行编码,否则查询字符串可能会被破坏。

var emailData:String = 
            "name=" + encodeURI(yourName.htmlText) +
            "&from=" + encodeURI(fromEmail.htmlText) +
            "&subject=" + encodeURI(yourSubject.htmlText) +
            "&msg=" + encodeURI(yourMsg.htmlText);

答案 1 :(得分:1)

这里最明显的罪魁祸首是你正在创建emailData字符串。作为第一步,我建议将其重新格式化为以下内容:

var urlVars:URLVariables = new URLVariables();
urlVars.name = yourName.htmlText;
urlVars.from = fromEmail.htmlText;
urlVars.subject = yourSubject.htmlText;
urlVars.msg = yourMsg.htmlText;

我认为这会自动对这些值进行URI编码,但如果没有,请按照Mark Knol的建议使用encodeURI()。

答案 2 :(得分:0)

尝试使用

$emailMsg = utf8_decode($emailMsg);

我解码了我从Flash获得的所有字符串。

如果这没有帮助,请使用

$emailMsg = urldecode($emailMsg);

或两者:D