0

我正在使用管道编程将电子邮件发送到脚本。使用这个脚本,我可以成功地将整个电子邮件保存为我服务器上的 .txt 文件。剩下要做的唯一一件事就是弄清楚如何保存电子邮件附带的任何附件。(此电子邮件地址仅提供给一个受信任的来源,因此安全不是问题)

将整个电子邮件保存为 .txt 文件的工作代码:

$fd = fopen("php://stdin", "r");
$email = ""; // This will be the variable holding the data.
while (!feof($fd)) {
$email .= fread($fd, 1024);
}
fclose($fd);
/* Saves the data into a file */
$fdw = fopen("/home/lmshost22/public_html/pipemail.txt", "w+");
fwrite($fdw, $email);
fclose($fdw);

任何人都可以帮助我简单地提取附件(将始终是 .csv 文件)并将其保存在我的服务器上的代码吗?

以下是 .txt 文件为附件显示的代码:

------=_NextPart_000_0133_01CE0E98.061E7400
Content-Type: application/vnd.ms-excel;
    name="leads.csv"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
    filename="leads.csv"

ApplicationDetailId,DateCreated,VehicleInfoId,FirstName,MiddleName,LastNa=
me,Suffix,Street,City,State,ZipCode,Email,HomePhoneArea,HomePhonePrefix,H=
omePhoneSuffix,CellArea,CellPrefix,CellSuffix,WorkPhoneArea,WorkPhonePreF=
ix,WorkPhoneSuffix,AmountBorrow,IsVehiclePaidOff,IsVehicleSalvaged,OweAmo=
unt,TitleOwnership,IsInBankruptcy,IsInCreditCounseling,HearOfUs,VehicleIn=
foId,Year,Make,Model,Trim,Miles,Engine,DriveTrain,Transmission,Options,Bo=
ok,ClassCode,Door,FuelType,BodyStyle
4523,2/18/2013 2:56:33 PM,4524,James,,Pruitt,,7900 =
Carmelita,Atascadero,CA,93422,,702,=3D"353",=3D"9760",=3D"",=3D"",=3D"",=3D=
"",=3D"",=3D"",=3D"2500.0000",True,False,0.0000,No =
one,False,False,Google,4524,2001,=3D"Toyota",Tacoma =
Xtracab,PreRunner,200000,V6  3.4 =
Liter,2WD,Automatic,199443~199448~199471~199480~199508~4234190~,0.0000,1,=
0,Gas,Pickup

------=_NextPart_000_0133_01CE0E98.061E7400--
4

1 回答 1

1
  1. 附件暗示消息是 MIME/Multipart 并且有一个boundary标头集,它将分隔不同的消息部分。例如:

    Content-Type: multipart/mixed;
        boundary="b1_bb1b331cd6dafa1dc6a19e3b2e090b07"
    

    因此,您想首先通过以下方式找到它:

    preg_match('/boundary="(.*)"/', $message, $matches);
    
  2. 消息被--与边界连接,然后是特定于该部分的标题,一个空行,然后是数据。例如:

    --b1_bb1b331cd6dafa1dc6a19e3b2e090b07
    Content-Type: application/pdf; name="Invoice-37272.pdf"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename="Invoice-37272.pdf"
    
    // base64 data here //
    

    并且消息以 终止'--' . $boundary . '--',例如:--b1_bb1b331cd6dafa1dc6a19e3b2e090b07--

因此,您可以使用这两个信息将您的消息分解为其组成部分并查找/保存附件。

于 2013-02-19T18:20:05.023 回答