Отправка электронного письма с вложением через PHPMailer

Мне не удается заставить PHPMailer отправлять электронное письмо с вложенным изображением, которое отправляет пользователь. Я просто получаю сообщение «Ошибка почты» каждый раз, когда он пытается отправить. Я просто не понимаю, что происходит не так. В error_log нет ошибок, он просто каждый раз выходит из строя.

Ввод HTML, связанный с вложением изображения:

<input type="file" name="file" placeholder="Choose an image." id="imageupload" accept="image/jpeg" />

Код PHP:

<?php

// Make sure logged in
include('../php_scripts/login-required.php');
// Make sure posted
if (!$_POST) {
    header('location: ./404.php');
}
// Include PHPmailer
require 'site_includes/PHPMailer/class.phpmailer.php';

// Get variables
$offertype = $_POST['ot'];
if ($offertype == 1) {
    $offertype = 'Discount';
} elseif ($offertype == 2) {
    $offertype = 'Free';
} else {
    $offertype = 'Not set';
}
$offerdetail = $_POST['od'];
// Check for errors
if (!isset($offertype) || empty($offertype)) {
    $errors = 1;
    header('location: ./create-advert.php?errors=' . $errors . '&ot=' . $offertype . '&od=' . $offerdetail);
} elseif (!isset($offerdetail) || empty($offerdetail)) {
    $errors = 2;
    header('location: ./create-advert.php?errors=' . $errors . '&ot=' . $offertype . '&od=' . $offerdetail);
}

// Get variables from database
include('../php_scripts/db-connect.php');
include('../php_scripts/get-userinfo.php');

// Set mail variables
$reply      = $email;
$replyname  = $fullname;
$to         = '[email protected]';
$toname     = 'John Doe';
$from       = '[email protected]';
$subject    = 'New Advert Request';
$message    = 'Name: ' . $fullname . "\r\n" . "Company: " . $company . "\r\n" . "Phone: " . $phone . "\r\n" . "Email: " . $email . "\r\n\r\n" . $offertype . "\r\n" . "--------------------------------------------------" . "\r\n\r\n" . $offerdetail;

if (isset($_FILES['file'])) {

    // Get attachment and upload
    $tmp_name = $_FILES['file']['tmp_name'];
    $name = $_FILES['file']['name'];
    move_uploaded_file($tmp_name, "uploads/$name");

    // Send email with attachment
    $mail = new PHPMailer;

    $mail->From = $from;
    $mail->addAddress($to, $toname);
    $mail->addReplyTo($reply, $replyname);
    $mail->WordWrap = 50;
    $mail->addAttachment(
        '/uploads/' . $name,
        $name,
        'base64',
        'mime/type'
    );
    $mail->Subject = $subject;
    $mail->AltBody = $message;

    if (!$mail->send()) {
        echo 'Mail Error!';
        exit;
    } else {
        echo 'Message has been sent!';
    }
}

?>

Я также знаю, что должен создать массив для допустимых расширений файлов (в данном случае только .jpg или .jpeg), но я также не уверен, как и где их реализовать.

Кроме того, я изменил только символы $ на и $ в электронных письмах. Почему это всегда не удается отправить? Все, что я хочу сделать, это отправить обычное текстовое электронное письмо с вложением электронной почты или без него.


person glitchbox    schedule 03.02.2014    source источник


Ответы (1)


Похоже, вы пытаетесь отправить файл из корневого каталога /uploads:

$mail->addAttachment(
    '/uploads/' . $name,

Перед перемещением файла будет проще отправить электронное письмо, передав $tmp_name в качестве первого параметра addAttachment() методу. Или, при желании, убедитесь, что указали правильный путь к файлу после того, как вы переместили его в каталог загрузки. (Дикое предположение: "./uploads/$name" - точка означает текущий каталог).

Кроме того, вы можете попробовать проверить $mail->ErrorInfo, чтобы узнать о вашей ошибке.

person Val Petruchek    schedule 03.02.2014
comment
У меня создалось впечатление, что перед отправкой по электронной почте файл нужно было где-то разместить, например, в папке с загрузками. Я просто попытался передать $ tmp_name, как вы предложили, и письмо, наконец, прошло, но без вложения (после комментирования бита move_uploaded_file). - person glitchbox; 03.02.2014
comment
Файлы, загруженные пользователями, и файлы, отправленные в виде вложений электронной почты с помощью phpmailer, полностью независимы. PHPMailer необходимо знать, где находится файл - полный путь для его чтения и прикрепления. Итак, ваша задача - передать правильный путь к файлу методу AddAttachment. Если вы перемещали файл только для его отправки, полностью удалите этот код манипуляции с файлом и просто используйте $_FILES['file']['tmp_name'] в качестве параметра. - person Val Petruchek; 03.02.2014
comment
Спасибо! Это беспокоит меня в течение последнего дня. - person glitchbox; 03.02.2014