我正在使用带有curl方法的客户项目使用SendGrid。
一切正常,但发送给SendGrid的电子邮件中附带的(ir)文件已损坏。
这是我的代码:
$documentList = array(
"DOC1.php" => "http://www.customerdomain.com/my/path/where/my/attachment/file/is/myfile.pdf"
);
$params = array(
'api_user' => $user;
'api_key' => $pass,
'x-smtpapi' => json_encode($json_string),
'from' => $from,
'to' => $to,
'subject' => $subject,
'html' => $mailHtml,
'text' => $mailText
);
if(count($documentList)>0){
foreach($documentList as $fileName=>$documentPath){
$params['files['.$fileName.']'] = $documentPath;
}
}
$request = $url.'api/mail.send.json';
// Generate curl request
$session = curl_init($request);
// Tell curl to use HTTP POST
curl_setopt ($session, CURLOPT_POST, true);
// Tell curl that this is the body of the POST
curl_setopt ($session, CURLOPT_POSTFIELDS, $params);
// Tell curl not to return headers, but do return the response
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
// obtain response
$response = curl_exec($session);
curl_close($session);
当我的数组键上没有扩展名文件时,我有一个包含相关值的文本文件。
我想我并不是唯一一个遇到这个问题的人,如果你有任何想法可以解决这个问题,谢谢你的帮助!
答案 0 :(得分:3)
您遇到的问题是因为您为SendGrid提供了文件的URL,而不是文件本身,而SendGrid的API需要该文件。
要使代码生效,只需将$documentList
变量更改为:
$documentList = array(
"DOC1.pdf" => "@" . realpath("/path/where/my/attachment/file/is/myfile.pdf")
);
有关此类文件上传的说明,请参阅this StackOverflow Question,但您可能希望使用curl_file_create来执行此操作。
然而,也许最好/最简单的方法是使用SendGrid's PHP Library来sending attachments, trivially simple.:
require("path/to/sendgrid-php/sendgrid-php.php");
$sendgrid = new SendGrid('username', 'password');
$email = new SendGrid\Email();
$email->addTo('foo@bar.com')->
setFrom('me@bar.com')->
setSubject('Subject goes here')->
setText('Hello World!')->
setHtml('<strong>Hello World!</strong>')
addAttachment("../path/to/file.txt");
$sendgrid->send($email);
答案 1 :(得分:0)
我最初的问题是因为路径是自动生成的链接,这就是为什么我没有使用url而不是realpath。
无论如何,我改变了我的代码,现在使用文件realpath(和之前的@)之后提到的mimetype的realpath。
现在似乎工作正常。
我要感谢你的帮助。
此致