【问题标题】:Send email in php with attached file that is generated from database在 php 中发送带有从数据库生成的附件的电子邮件
【发布时间】:2012-06-08 04:21:14
【问题描述】:

我有一个简单的脚本,用于发送带有用户上传附件的电子邮件。如何修改脚本,以便它通过电子邮件发送在 php 中生成的文件(例如,在这种情况下,我想从数据库中提取联系信息,生成文件的 vCard 并将其附加到电子邮件。

ViewCompany.php

<?php
// this auto-magically inserts header.html here
require('header.html');  


include('mail.php');

if(isset($_POST['name'], $_FILES['file'])){

    $body = array(

        "From: {$_POST['name']}",

        "Details:",
        "Name: {$_FILES['file']['name']}",
        "Size: {$_FILES['file']['size']}",
        "Type: {$_FILES['file']['type']}"

    );


    mail_file('receiver@email.com','sender@email.com','subject', implode("\r\n", $body), $_FILES['file']);

}
?>

<?php
echo    "<form action='' method='post' enctype='multipart/form-data'>";
echo        "<p>";
echo            "<label for='name'>Name</label>";
echo            "<input type='text' name='name' id='name'>";
echo        "</p>";
//          $file = "getVcard.php?CompanyID=" . $CompanyID;

echo        "<p>";
echo            "<label for='file'>File</label>";
echo            "<input type='file' name='file' id='file'>";
echo        "</p>";

echo        "<p>";
echo            "<input type='submit' value='Email file'>";
echo        "</p>";
echo    "</form>";
?>

邮件.php

<?php

function mail_file($to, $from, $subject, $body, $file){

    $boundary = md5(rand());

    $headers = array(
        "MIME-Version: 1.0",
        "Content-Type: multipart/mixed; boundary=\"{$boundary}\"",
        "From: {$from}"
    );

    $message = array(
        "--{$boundary}",
        "Content-Type: text/plain",
        "Content-Transfer-Encoding: 7bit",
        "",
        chunk_split($body),
        "--{$boundary}",
        "Content-Type: {$file['type']}; name=\"{$file['name']}\"",
        "Content-Disposistion: attachment; fielname=\"{$file['name']}\"",
        "Content-Transfer-Encoding: base64",
        "",
        chunk_split(base64_encode(file_get_contents($file['tmp_name']))),
        "--{$boundary}--"
    );

    mail($to, $subject, implode("\r\n", $message), implode("\r\n", $headers));
}

?>

我试图改变

echo            "<label for='file'>File</label>";
echo            "<input type='file' name='file' id='file'>";

$file = "getVcard.php?CompanyID=" . $CompanyID;

生成电子名片,但是当我这样做时,电子邮件不会发送。

有什么建议吗?

谢谢,

CampSoup1988


这是我的 getVcard.php 文件:

<?php
include "connection.php";
$CompanyID = $_GET['CompanyID'];
$CompanyID=$_GET['CompanyID']; // Collecting data from query string
if(!is_numeric($CompanyID)){ // Checking data it is a number or not
    echo "Data Error"; 
exit;
}
$query = "SELECT * FROM company where CompanyID = $CompanyID";
$result = mysql_query($query) or die(mysql_error());
header('Content-Type: text/vcard');
header('Content-Disposition: attachment; filename=vcardexport.vcf');
        while($ResultsLists = mysql_fetch_array($result)){  
echo                "BEGIN:VCARD\n";
echo                "VERSION:4.0\n";
echo                "KIND:org\n";
echo                "FN:" . $ResultsLists['CompanyName'] . "\n";
echo                "ORG:" . $ResultsLists['CompanyName'] . "\n";
echo                "ADR;TYPE=work;LABEL=\"". $ResultsLists['CompanyAddress1'] . "\n" . $ResultsLists['CompanyAddress2'] . "\n". $ResultsLists['CompanyCity'] . "\, " . $ResultsLists['CompanyState'] . " " . $ResultsLists['CompanyZipcode'] . "\n" . $ResultsLists['CompanyCountry'] . "\":" .  $ResultsLists['CompanyAddress2'] . ";" . $ResultsLists['CompanyAddress1'] . ";" . $ResultsLists['CompanyCity'] . ";" . $ResultsLists['CompanyState'] . ";" . $ResultsLists['CompanyZipcode'] . ";" . $ResultsLists['CompanyCountry'] . "\n";
                if($ResultsLists['CompanyPhone'] != ""){
echo                    "TEL;TYPE=\"work,voice\";VALUE=uri:tel:" . $ResultsLists['CompanyPhone'] . "\n";
                }
                if($ResultsLists['CompanyEmail'] != ""){
echo                    "WORK.EMAIL:" . $ResultsLists['CompanyEmail'] . "\n";
                }
echo                "WORK.LANG;PREF=1:en\n";
                if($ResultsLists['CompanyNotes'] != ""){
echo                    "NOTE:" . $ResultsLists['CompanyNotes'] . "\n";
                }
                if($ResultsLists['CompanyWebsite'] != ""){
echo                    "URL:" . $ResultsLists['CompanyWebsite'] . "\n";
                }
echo                "END:VCARD";
?>

更新:是否可以将 vcf 文件保存到临时位置,然后自动将临时文件附加到电子邮件(在将临时文件附加到电子邮件之前重命名)

【问题讨论】:

    标签: php email email-attachments vcf-vcard


    【解决方案1】:

    最简单的解决方案是手动传递您的 vcard 数据:

    $file = array(
                  'type' => 'text/plain',
                  'name' => 'vcard.txt',
                  'tmp_name' => 'http://yourdomain/getVcard.php?CompanyID=' . $CompanyID
            );
    

    但这是一个非常肮脏的解决方案。从长远来看,最好使用像phpmailer 这样的类。

    【讨论】:

    • 我无法让您的建议生效,我没有收到任何错误,但电子邮件没有发送。我尝试查看 phpmailer,但不确定如何设置它。我正在使用 XAMPP 和随附的 Mercury Mail,并将 Mercury Mail 设置为通过 gmail SMTP 发送电子邮件
    • 嗯,这段代码应该可以工作。邮件发送了吗?请记住在您的邮件函数中定义 $file 否则它将使用其他值。 // 可以直接在phpmailer中定义smtp数据。但我知道目前这是否太难了。无论如何,您应该熟悉它或类似的课程。
    • 我没有收到任何电子邮件。我将编辑我的原始消息以发布生成 vCard 的成本。我尝试将类型更改为 text/vcard 并将文件更改为 vcard.vcf,但这也不起作用。我承认在 php 方面我还是个初学者,我之前从未尝试过发送电子邮件,并且使用了一个教程来设置 Mercury 以及一个电子邮件脚本的教程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 2020-11-20
    • 2014-02-28
    • 1970-01-01
    相关资源
    最近更新 更多