Как присоединять файл в прямом PHPMailer с унифицированным указателем ресурса?

Сегодня у меня есть проблема и это следующий, Я использую PHPMailer и стараюсь присоединять файл, который находится в следующем маршруте http://app.pimsaseguros.com/_files/_img/_holidays/040616-160454_img001.pdf и мой код - следующий:

$url = 'http://app.pimsaseguros.com/_files/_img/_holidays/040616-160454_img001.pdf';
$mail->addAttachment($url,'solicitud.pdf');

и если он посылает мне mail, но без присоединенного файла.

1
задан 07.04.2016, 22:25
2 ответа
function enviar_correo($destinatarios, $mail_asunto, $mail_contendio, $from, $from_name, $archivos_adjuntos_ruta,$archivos_adjuntos_temp){
$mail= new PHPMailer(); // defaults to using php "mail()"
$mail->CharSet = 'UTF-8';
$body= $mail_contendio;
$mail->IsSMTP(); // telling the protocol to use SMTP
$mail->Host = "tu.host.com"; // SMTP server
$mail->From = $from;
$mail->FromName = $from_name;
$mail->Subject = $mail_asunto;
$mail->MsgHTML($body);
$destinatarios=explode(",", $destinatarios);
if(!empty($destinatarios)){
foreach($destinatarios as $un_destinatario){
$mail->AddAddress($un_destinatario); //destinatarios
}
}else{
return false;
}
if(!empty($archivos_adjuntos_ruta)){
foreach($archivos_adjuntos_ruta as $archivo){
$mail->AddAttachment($archivo); // attachment
}
}
if(!empty($archivos_adjuntos_temp)){
foreach($archivos_adjuntos_temp as $nombrearchivo=>$contenidoArchivo){
$mail->AddStringAttachment($contenidoArchivo,$nombrearch ivo,'base64');
}
}
$mail->Timeout = 20;
if($mail->Send()) {
return array(true);
}else {
return array(false,"Mailer Error: ".$mail->ErrorInfo);
}
}
$archivos_adjuntos_ruta=array($path1,path2);
$archivos_adjuntos_temp=array(utf8_decode($strfile PDF)=>$strContenidoPdf,utf8_decode($strNomArch)=>$ strContenidoXml);
enviar_correo(...,array(),archivos_adjuntos_temp);//los archivos estan en variables temporales
enviar_correo(...,$archivos_adjuntos_ruta,array()) ;//los archivos estan en rutas en disco
enviar_correo(...,$archivos_adjuntos_ruta,archivos _adjuntos_temp);//ambas opciones al mismo tiempo
1
ответ дан 24.11.2019, 14:37

В коде класса PHPMailer (онлайн шрифт в GitHub), ты можешь видеть, что в определении addAttachment говорят, что у присоединенного файла должен быть маршрут в системе файлов, и что он возвращает false если не возможно открывать файл:

* Add an attachment from a path on the filesystem.
* Returns false if the file could not be found or read.

Это мотив, из-за которого тебя не добавляет присоединенный файл (ты перемещаешь унифицированный указатель ресурса) и не удается молчаливым способом. Действительно она не является молчаливой, просто ты не проверяешь, если он не удается или нет, ты был бы должен добавлять что-то, что подтверждало бы, если результат фальшивый или нет:

if (!$mail->addAttachment($url,'solicitud.pdf')) {
    // código si el archivo no se pudo abrir o leer
}

Если файл, который ты хочешь присоединить, находится на удаленном сервере или - унифицированный указатель ресурса, тогда вместо того, чтобы использовать addAttachment ты мог бы использовать addStringAttachment. В определении метода он определяется (мой перевод):

* Añade una cadena o un binario como adjunto (no en el sistema de archivos)
* Este método puede ser usado para adjuntar ascii o datos binarios
* como por ejemplo un registro BLOB de una base de datos.

Решение, чтобы присоединять файл, состояло бы в том, чтобы сочетать функцию file_get_contents (что читает файл как string) с addStringAttachment (я не протестировал код, смоги содержать неудачи и она была бы хорошей, что ты добавляешь какой-то тип утверждения для обеих функций):

$url = 'http://app.pimsaseguros.com/_files/_img/_holidays/040616-160454_img001.pdf';
$fichero = file_get_contents($url);
$mail->addStringAttachment($fichero, 'solicitud.pdf');
1
ответ дан 24.11.2019, 14:37