Gemaild zip bestand leeg bij aankomst
Peter
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?PHP
$fileatt_name="backup.zip";
$fileatt_type = "application/octet-stream";
$file = fopen($filedir,'rb');
$data = fread($file,filesize($filedir));
fclose($file);
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
$headers .= "\nMIME-Version: 1.0\n" .
"Content-Type: multipart/mixed;\n" .
" boundary=\"{$mime_boundary}\"";
$email_message .= "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type:text/html; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$email_message . "\n\n";
$data = chunk_split(base64_encode($data));
$email_message .= "--{$mime_boundary}\n" .
"Content-Type: {$fileatt_type};\n" .
" name=\"{$fileatt_name}\"\n" .
//"Content-Disposition: attachment;\n" .
//" filename=\"{$fileatt_name}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . "\n\n" .
"--{$mime_boundary}--\n";
$ok = @mail($email_to, $email_subject, $email_message, $headers);
if($ok) {
echo "<font face=verdana size=2>Verzonden!</font>";
} else {
die("Niet verzonden");
}
?>
$fileatt_name="backup.zip";
$fileatt_type = "application/octet-stream";
$file = fopen($filedir,'rb');
$data = fread($file,filesize($filedir));
fclose($file);
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
$headers .= "\nMIME-Version: 1.0\n" .
"Content-Type: multipart/mixed;\n" .
" boundary=\"{$mime_boundary}\"";
$email_message .= "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type:text/html; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$email_message . "\n\n";
$data = chunk_split(base64_encode($data));
$email_message .= "--{$mime_boundary}\n" .
"Content-Type: {$fileatt_type};\n" .
" name=\"{$fileatt_name}\"\n" .
//"Content-Disposition: attachment;\n" .
//" filename=\"{$fileatt_name}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . "\n\n" .
"--{$mime_boundary}--\n";
$ok = @mail($email_to, $email_subject, $email_message, $headers);
if($ok) {
echo "<font face=verdana size=2>Verzonden!</font>";
} else {
die("Niet verzonden");
}
?>
Als ik de code bekijk stuur je volgens mij alleen bestanden als attachment mee, zonder ze in te pakken en alleen met de .zip extensie erachter. Zo werkt dat niet.
Ik mis een beetje de betekenis van $filedir in de eerste 7 regels van je script.
Wat bevat nu het path naar het bestand (incl. bestandsnaam)?
Zelf vind ik het wel eenvoudig om PHPMailer te gebruiken en dan te kunnen volstaan met
$mail->addAttachment($file)
Toevoeging op 04/01/2017 10:27:37:
volgens mij bedoel je daar:
Code (php)
1
2
3
2
3
$file = fopen($filedir.$fileatt_name,'rb');
$data = fread($file,filesize($filedir.$fileatt_name));
fclose($file);
$data = fread($file,filesize($filedir.$fileatt_name));
fclose($file);
of mogelijk
En die zip-bestanden zijn handmatig gemaakt? In dat geval mag je mijn opmerking over 'de classes voor het maken van een zip-file' negeren.
$filedir is inderdaad het path. De zipt bestanden zijn inderdaad handmatig gemaakt. Als ik ze unzip zien ze er goed uit. Op het moment dat ik als bijlage verstuur ontvang ik zo ook alleen met 0 bytes.
fopen moet een filename als input hebben. Niet een directory
Toevoeging op 04/01/2017 12:12:43:
en mocht $filepath wel het path incl. de bestandsnaam bevatten:
Als de backup niet gemaakt is door Apache/PHP, dan kan die file zo maar staan op een plek die niet bereikbaar is (door de rechten) voor je PHP scipt.
is_readable() zou je dat kunnen vertellen.
EDIT: weet trouwens niet of je op die manier een hele directory kunt grijpen.
Je kunt ook trouwens eenvoudig controleren of het bestand goed is overgekomen door de rauwe source van de e-mail te bekijken. Vervolgens zou je dat base64 blok kunnen copypasten en via een testscriptje ter download aan kunnen bieden om te kijken of deze mogelijk corrupt is geraakt.
EDIT: als er witregels tussen de base64 regels zitten dat moet je mogelijk de "line ending sequence" (derde parameter chunk_split) expliciet instellen op "\n". Default is dit namelijk "\r\n" wat voor teveel regelovergangen kan zorgen op sommige platformen.
En om te voorkomen dat je een regelovergang teveel aan het einde hebt wil je het resultaat van chunk_split wellicht nog trimmen. En als je slim bent vang je dit soort dingen in een functie:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function get_attachment($filename) {
clearstatcache();
if (file_exists($filename)) {
$fp = fopen($filename, 'rb');
$contents = fread($fp, filesize($filename)); // @todo remember to fix zero-length files
// note that chunk_split also adds an "end" character sequence at the end of the string, hence rtrim
return rtrim(chunk_split(base64_encode($contents), 76, "\n")); // @todo 3rd parameter might depend on platform
} else {
return false;
}
}
?>
function get_attachment($filename) {
clearstatcache();
if (file_exists($filename)) {
$fp = fopen($filename, 'rb');
$contents = fread($fp, filesize($filename)); // @todo remember to fix zero-length files
// note that chunk_split also adds an "end" character sequence at the end of the string, hence rtrim
return rtrim(chunk_split(base64_encode($contents), 76, "\n")); // @todo 3rd parameter might depend on platform
} else {
return false;
}
}
?>
Je zou een tussenstap kunnen inbouwen waarin je de directory eerst ergens zipt, en dan als attachment toevoegt?
Gewijzigd op 04/01/2017 17:13:54 door Thomas van den Heuvel
Dat is namelijk wat in het oorspronkelijke script ook niet gebeurt.
Vast bedankt voor al jullie opmerkingen en hulp. Weer veel van geleerd. ;).
Peter
Content-Type: application/octet-stream; name=database.sql
Content-Transfer-Encoding: base64
Content-disposition: attachment
DQojQ3JlYXRlIHRhYmxlIGFjdGllZg0KDQpDUkVBVEUgVEFCTEUgYGFjdGllZmAgKAogIGBhY3Rp
ZWZfaWRgIGludCgxKSBOT1QgTlVMTCwKICBgYWN0aWVmX29tc2AgdmFyY2hhcigxNSkgTk9UIE5V
TEwKKSBFTkdJTkU9SW5ub0RCIERFRkFVTFQgQ0hBUlNFVD1sYXRpbjE7DQoNCiNEdW1wIGRhdGEN
Cg0KSU5TRVJUIElOVE8gYWN0aWVmIFNFVCBhY3RpZWZfaWQ9JzAnLGFjdGllZl9vbXM9J25pZXQg
YWN0aWVmJzsNCklOU0VSVCBJTlRPIGFjdGllZiBTRVQgYWN0aWVmX2lkPScxJyxhY3RpZWZfb21z
PSdhY3RpZWYnOw0KDQojQ3JlYXRlIHRhYmxlIGJhY2t1cA0KDQpDUkVBVEUgVEFCTEUgYGJhY2t1
cGAgKAogIGBiYWNrdXBfaWRgIGludCgxMSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsCiAgYGRh
dHVtX2xhc3RfYnVgIGRhdGUgTk9UIE5VTEwsCiAgYGRhdHVtX25leHRfYnVgIGRhdGUgTk9UIE5V
TEwsCiAgYGtsYW50X2lkYCBpbnQoMTEpIE5PVCBOVUxMLAogIGBidV9uYW1lYCB2YXJjaGFyKDYw
KSBOT1QgTlVMTCwKICBgYnVfcGFkYCB2YXJjaGFyKDYwKSBOT1QgTlVMTCwKICBgYnVfbWFpbF90
b2AgdmFyY2hhcig2MCkgTk9UIE5VTEwsCiAgYGRhdHVtYCB0aW1lc3RhbXAgTk9UIE5VTEwgREVG
QVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwKICBQUklNQVJZIEtFWSAoYGJhY2t1cF9pZGApCikgRU5H
SU5FPUlubm9EQiBBVVRPX0lOQ1JFTUVOVD0yIERFRkFVTFQgQ0hBUlNFVD1sYXRpbjE7DQoNCiNE
Quote:
EDIT: als er witregels tussen de base64 regels zitten dat moet je mogelijk de "line ending sequence" (derde parameter chunk_split) expliciet instellen op "\n". Default is dit namelijk "\r\n" wat voor teveel regelovergangen kan zorgen op sommige platformen.
Peter
Peter van Kroonenburg op 10/01/2017 21:00:23:
Dank voor alle info.
Peter
Peter
Wat betekent dat? Zijn de problemen opgelost? Wat was de oplossing? Of heb je gekozen voor een andere aanpak (bijvoorbeeld PHPMailer)?
Inderdaad overgeschakeld naar PHP mailer.
Let er wel op dat je de nieuwste versie gebruikt, dit vanwege een veiligheidslek in eerdere versies.
De zaak geupload naar HOSTNET.
Ik krijg daar nu onderstaande foutmelding;
Message could not be sent.Mailer Error: SMTP connect() https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
Op de betreffende site gezocht maar kom er niet uit ;(.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
require '../PHPMailer-master/PHPMailerAutoload.php';
$username="[email protected]";
$password='******';
$from="[email protected]";
$name="peter";
$email="[email protected]";
$subject="test";
$message="inhoud";
$to="[email protected]";
$att="../backupdata_zip/backup_6.zip";
$mail = new PHPMailer;
$mail->isSMTP();/*Set mailer to use SMTP*/
$mail->Host = 'smtp.gmail.com';/*Specify main and backup SMTP servers*/
$mail->Port = 587;
$mail->SMTPAuth = true;/*Enable SMTP authentication*/
$mail->Username = $username;/*SMTP username*/
$mail->Password = $password;/*SMTP password*/
$mail->SMTPSecure = 'tls';*//*Enable encryption, 'ssl' also accepted*/
$mail->From = $from;
$mail->FromName = $name;
$mail->addAddress($to, 'Recipients Name');/*Add a recipient*/
$mail->addReplyTo($email, $name);
/*$mail->addCC('[email protected]');*/
/*$mail->addBCC('[email protected]');*/
$mail->WordWrap = 70;/*DEFAULT = Set word wrap to 50 characters*/
$mail->addAttachment($att);/*Add attachments*/
$mail->isHTML(false);/*Set email format to HTML (default = true)*/
$mail->Subject = $subject;
$mail->Body = $message;
$mail->AltBody = $message;
if(!$mail->send()) {
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
//} else {
// header("Location: ../php/start.php");
}
?>
require '../PHPMailer-master/PHPMailerAutoload.php';
$username="[email protected]";
$password='******';
$from="[email protected]";
$name="peter";
$email="[email protected]";
$subject="test";
$message="inhoud";
$to="[email protected]";
$att="../backupdata_zip/backup_6.zip";
$mail = new PHPMailer;
$mail->isSMTP();/*Set mailer to use SMTP*/
$mail->Host = 'smtp.gmail.com';/*Specify main and backup SMTP servers*/
$mail->Port = 587;
$mail->SMTPAuth = true;/*Enable SMTP authentication*/
$mail->Username = $username;/*SMTP username*/
$mail->Password = $password;/*SMTP password*/
$mail->SMTPSecure = 'tls';*//*Enable encryption, 'ssl' also accepted*/
$mail->From = $from;
$mail->FromName = $name;
$mail->addAddress($to, 'Recipients Name');/*Add a recipient*/
$mail->addReplyTo($email, $name);
/*$mail->addCC('[email protected]');*/
/*$mail->addBCC('[email protected]');*/
$mail->WordWrap = 70;/*DEFAULT = Set word wrap to 50 characters*/
$mail->addAttachment($att);/*Add attachments*/
$mail->isHTML(false);/*Set email format to HTML (default = true)*/
$mail->Subject = $subject;
$mail->Body = $message;
$mail->AltBody = $message;
if(!$mail->send()) {
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
//} else {
// header("Location: ../php/start.php");
}
?>
- Ariën -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 14/01/2017 15:35:30 door - Ariën -
EDIT: het commentaar op regel 20 ziet er niet ok uit, er staat een asterisk na de puntkomma.
EDIT: wild guess: je host staat het gebruik van sockets niet toe.
Gewijzigd op 14/01/2017 15:42:34 door Thomas van den Heuvel
$mail->SMTPDebug = 1;
Debugger:
2017-01-14 14:55:20 SMTP ERROR: Failed to connect to server: Netwerk is onbereikbaar (101) 2017-01-14 14:55:20 SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting Message could not be sent.Mailer Error: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
Gewijzigd op 14/01/2017 18:28:23 door - Ariën -
https://www.hostnet.nl/helpdesk/webhosting/e-mail-versturen-vanaf-uw-website
Het emailadres heb ik aangepast met het adres dat ook daar bekend is. Ook heb ik -f voor het from adres geplaatst. Heeft helaas geen resultaat gehad.
Toevoeging op 14/01/2017 18:37:37:
Het script zoals dat daar staat werkt wel. Alleen het toevoegen van de bijlage?
Wel vreemd dat ze SMTP niet toestaan, ik zou het zelf appreciëren als ze dat wel deden.
Gewijzigd op 14/01/2017 19:07:55 door - Ariën -