PHPMailer giving me "noname" attachments - php

My problem is exactly like this one, I am getting the attachments without the extension, if I put the extension to the file manually, the file is still not recognized. What could cause this?
This is the attachment-adding part, rest is standard:
foreach($_FILES['uploads']['name'] as $key => $file){
$mail->attachment[] = array($_FILES['uploads']['tmp_name'][$key], $_FILES['uploads']['name'][$key]);
$mail->boundary = "_b" . md5(uniqid(time()));
}
EDIT:
In the beginning of every attachment I get this:
name="phpmailer.inc.php"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="phpmailer.inc.php"
is this normal?
EDIT:
Also, I copied the files to the server and I am adding them to the attachment from there, still, all the files are "noname" and with the correct size.

I think you can not use $_FILES['uploads']['tmp_name'][$key] file as an attachment as $_FILES['uploads']['tmp_name'] are temperory files.
First you need to upload that document/file to the server and than attached it to the mail. Than only it will work.

Related

Send pdf output as stringAttachment using PHPMailer

I am trying to attach a file using the PHPMailer's addStringAttachment method.
I generated the pdf from TCPDF using:
$b64_enc_doc = $pdf->Output($file_name, 'E');
Then inside of the script to send the email, I have
...
$mail->addStringAttachment($b64_enc_doc, $file_name)
However, the PDF attachment is corrupted when I try opening it.
I tried debugging the output of the PDF generated from TCPDF and it looks something similar to this:
Content-Type: application/pdf;
name="file.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="file.pdf"
JVBERi0xLjcKJeLjz9MKMjEgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCAxIDAgUiAvTGFz
dE1vZGlmaWVkIChEOjIwMjIwMTA0MTMwODQ2KzAwJzAwJykgL1Jlc291cmNlcyAyIDAgUiAvTWVk
aWFCb3ggWzAuMDAwMDAwIDAuMDAwMDAwIDU5NS4yNzYwMDAgODQxLjg5MDAwMF0gL0Nyb3BCb3gg
WzAuMDAwMDAwIDAuMDAwMDAwIDU5NS4yNzYwMDAgODQxLjg5MDAwMF0gL0JsZWVkQm94IFswLjAw
MDAwMCAwLjAwMDAwMCA1OTUuMjc2MDAwIDg0MS44OTAwMDBdIC9UcmltQm94IFswLjAwMDAwMCAw
LjAwMDAwMCA1OTUuMjc2MDAwIDg0MS44OTAwMDBdIC9BcnRCb3ggWzAuMDAwMDAwIDAuMDAwMDAw
IDU5NS4yNzYwMDAgODQxL...
Please I do not want to save the file to the server but send the file straight to the user's email. Please help.
Thanks!
You don't show the code you're using, but that string is a fragment of an email message, not a PDF binary PDF string as it should be.
Your code should be along the lines of (I don't remember tcpdf's syntax offhand):
//Render the PDF to a string in memory
$pdf = $tcpdf->output('S');
$mail->addStringAttachment($pdf, 'file.pdf');
PHPMailer will take care of the rest.

using PHP to remove the extension from a file and then downloading it

I recently had a asked a question very similar to this one, however after evaluating that I did not explain it in the best way I have come back once again explaining it in a greater manner.
So, I am creating a system that will gather data from a MySQL database and use a unique id to download a file, however depending on the value of a column within that database called type, this file could be anything from a png file to an xml file. What I am currently doing is trying to download these files WITHOUT any extension.
As an example to maybe make this easier to understand, a file named image.png would be converted to just image and then downloaded.
With this you could rename the file to image.png again on the local machine and view the image.
This may seem very inefficient to most reading this but for my current situation it's all that will work.
How could I remove a files extension and then download it? (in php)
Thank you in advance.
Just use headers to specify response type.
$filepath = '/wherever/the/file/is.png';
$filename = 'new-cool-name';
header('Content-Type: whatever/content-type-is');
header("Content-disposition: attachment;filename=$filename");
readfile($filepath);
This basically sends a response with specified content-type as an attachment and the body of the attachment contains the file contents. If you never sure what's the content type is, then just use application/octet-stream
Usually when you set out to push a file for downloading from a serverside script, you do so by utilizing http headers like https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition
The filename of the downloadable file is specified in that header
Okay so to remove an extention from a file you could do is
$withoutExtion = preg_replace('/\\.[^.\\s]{3,4}$/', '', $youfilename);
...followed by your file download code

PHP mail mime and Outlook 2010 Untitled attachments

I'm using Pears mail mime to send out emails with attachments in php.
http://pear.php.net/package/Mail_Mime/redirected
It seems Outlook is renaming PDF's to "Untitled..." but it works correctly for gmail, hotmail etc.
Prior to this problem I had another problem where Outlook would not show the file as PDF and attach it as text file unless I specifically tell the mime addAttachment the file type
see the code here:
if (endsWith($file,".pdf")) {
$mime->addAttachment($file,'application/pdf',basename($file));
}
else {
$mime->addAttachment($file);
}
You can see above I've also tried setting the 3rd argument of addAttachment to set the filename, but that hasn't worked either.
Outlook does not rename other file types so it's a catch 22 either set no filetype and have Outlook send as txt file or set the filetype and Outlook renames the files to 'Untitled'
ok found out that Outlook doesn't seem to like long filenames, shortening the filename works.
Pear mime sends a long filename header broken up into parts like this:
Content-Transfer-Encoding: base64
Content-Type: application/pdf;
name*0*=US-ASCII''THIDSO5749_010.901%20-%2013.95505142_GARUDA%20RETARGETI;
name*1*=NG%20CPA%20CAMPAIGN_PT%20GARUDA%20INDONESIA%20%28PERSERO%29%20TBK;
name*2*=._NOV2013.pdf
Content-Disposition: attachment;
filename*0*=US-ASCII''THIDSO5749_010.901%20-%2013.95505142_GARUDA%20RETAR;
filename*1*=GETING%20CPA%20CAMPAIGN_PT%20GARUDA%20INDONESIA%20%28PERSERO;
filename*2*=%29%20TBK._NOV2013.pdf;
size=68426
Outlook can't handle this but it can handle the format:
Content-Type: application/pdf;name="a long filename.....pdf"
Unfortunately it seems Pear mime can't send this format without editing the core code of mime.php
So I'm just sending shorter filenames for now

X-Sendfile Error

I am trying to send files by using X-Sendfile directive in lighttpd.
My php code is;
header("Content-Type: application/force-download");
header( "Content-Disposition: attachment; filename=" . 's.php');
header("Content-Length: ". filesize("/home/web/domain/htdocs/download.php"));
header( "X-Sendfile: /home/web/domain/htdocs/download.php");
(I am sending download.php file just for testing purpose)
However, I get blank file no matter what I try. If I change the filename, I get;
2010-08-30 18:01:14: (mod_fastcgi.c.2587) send-file error: couldn't get stat_cache entry for: /home/web/domain/htdocs/downloa1d.php
So, it is working, but when I send the correct file it does not give any error in the logs and the browser downloads an empty file.
What could be wrong? What should I do?
It is likely that you don't have the right line in your lighttpd.conf file.
Add this in your fastcgi.server between the options with => arrows:
"allow-x-send-file" => "enable",
All but the last option end with commas.
I assume that you have your fastcgi already configured. If you are using a different framework for connecting PHP to your server, I can't help you.
If you have more than one PHP worker process, you must add that option to all of them.
I should add that .php files are small in size and outputting them with readfile() won't make a dent.
And, as I see it, you are using some non-critical headers wrongly. There is no such thing as force-download, it will just behave like an unknown file type. Use application/octet-stream. And your Content-Disposition is also shaky. Not only in that weird string enclosing. What the client should get is:
Content-Disposition: attachment; filename="My file ♥.txt"
The file name is surrounded by double quotes and it is NOT escaped; instead, it is either in UTF-8 or in the encoding of the calling page (this is a dirty grey area where every browser acts differently). You don't even have to include the file name to be on the safe side if you are satisfied with the downloading path. Then, it will look like this:
Content-Disposition: attachment
You can then use a pseudo-directory trick to supply a less buggy file name:
www.example.com/download.php/Custom%20Name.txt
This will work more reliably than that filename= parameter, but takes more planning in the link system. It may require you to do some redirecting.
OK this is an old post, but I'm going to reply anyway 'cause I was stuck on this too for way too long and I didn't find my solution anywhere so here I go:
Yeah I edited lighttpd.conf and added
fastcgi.server += ( ".php" => (( "allow-x-send-file" => "enable" )) )
and used
Header("X-LIGHTTPD-send-file: /path/filename");
in the PHP test page. But it didn't work. It took me a while to figure out I also had a PHP definition in
etc/lighttpd/conf-enabled/15-fastcgi-php.conf
After I added the option in there it worked :)

Process RECEIVED email attatchment with PHP

I have a php script that will an catch email passed to it and process it.
#!/usr/local/bin/php -q
<?php
while (!feof(STDIN)) {$s .= fgets(STDIN);}
// Now do some work on the email source in $s.
?>
This works fine. My question is how to save an attachment into the file system from the source. For example, if I isolate the section below, how do I need to process it before saving it into a gif file to create a valid gif?
I assume I need to change the encoding, or otherwise process it, but does anyone know exactly?
Thanks!
--------------090607000609050308090504
Content-Type: image/gif;
name="tfk.gif"
Content-Transfer-Encoding: base64
Content-ID: <part1.06050801.05020504#etc....>
Content-Disposition: attachment;
filename="tfk.gif"
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
--------------090607000609050308090504--
Mailparse
Try the PEAR_Mail_MimeDecode class from Pear. You can feed it the entire mail, and get back the various MIME chunks... and no need to install an extension.
For a PHP solution (no C extensions required), there's PEAR Mail_mimedecode.
After parsing the e-mail, you already have the attachment bytestream, no need to base64 decode yourself.

Categories