【问题标题】:Php Curl add string file as a post fieldPhp Curl 添加字符串文件作为帖子字段
【发布时间】:2013-04-26 19:24:10
【问题描述】:

我在使用 mailGun Web API 时遇到了添加内联文件的问题。 我们的软件创建一个图像并将其作为字符串传递。我想内联该图像 我遇到的问题是 php curl 接收文件指针,而不是实际文件。如果可能,我想避免编写 tmp 文件,因为我们有许多在服务器上运行的进程并且不想发送错误的电子邮件

提前致谢

MailGun 内联示例:http://documentation.mailgun.net/user_manual.html#inline-image 我正在使用的代码示例:

function send_inline_image($image) {
  $ch = curl_init();

  curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
  curl_setopt($ch, CURLOPT_USERPWD, 'api:key-3ax6xnjp29jd6fds4gc373sgvjxteol0');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
  curl_setopt($ch, CURLOPT_URL, 'https://api.mailgun.net/v2/samples.mailgun.org/messages');
  curl_setopt($ch,
              CURLOPT_POSTFIELDS,
              array('from' => 'Excited User <me@samples.mailgun.org>',
                    'to' => 'sergeyo@profista.com',
                    'subject' => 'Hello',
                    'text' => 'Testing some Mailgun awesomness!',
                    'html' => '<html>Inline image: <img src="cid:test.jpg"></html>',
                    'inline' => $image))

  $result = curl_exec($ch);
  curl_close($ch);

  return $result;
 }
$image = 'Some image string that we have generated'
send_inline_image($image)

【问题讨论】:

  • 我对 php/mailgun 和电子邮件构造一无所知。您是否能够使用上述“不起作用”的代码生成和发送电子邮件,或者您只是在寻找一种使用字符串而不是文件调用 php curl 代码的方法?如果是前者,请根据第 3 节中rfc2183 中的示例检查电子邮件的源文件。无论哪种方式,您的图像字符串是什么格式的?比如是base64编码,还是希望mailgun编码?
  • 再解释一下,我正在从我们当前的 SMPT 服务器切换到 mailGun。我们使用旧版本的 phpmailer 来发送进行 base64 编码的文件。所以我有 raw 和 base64 版本。它也是一个PNG文件,上面的代码示例是我要执行的。
  • 您收到什么错误?根据几个stackoverflow问题,php curl可以处理多个数据输入表单,例如。 CURL PHP send image。您可以跳过数组技术并构建完整的 urlencoded 字符串,如手册中的 param1=val1&amp;param2=val2&amp;...。如果这不起作用,也许 mailgun 的 api 只喜欢 inline= 以特殊方式发布给他们的图像。您可以向网络服务器发送一个工作示例,该服务器只是将输入回显给您,以便您可以学习模仿该格式。
  • 主要问题是通过字符串发送文件。如果是一个文件,我可以手动设置参数并以这种方式发送。如果我有一个文件位置,我可以像您的示例中那样使用 @ 表示法。但我都没有。也没有错误,因为它在需要发送具有 mime 类型、名称等的文件时将字符串作为参数发送。
  • 抱歉我在这里没用。如果您不希望 php curl 的 automagic mime-type 等包装并且想要发送您的字符串,您可能已经自己制作了完整的请求正文。类似于this example 的东西,但您不必在该页面上的$pld0200request/$pldfile 中读取文件。您必须“自己”管理内容长度等(可能有一个库)。另外,也许您可​​以尝试 curl (没有 php ),它是 --trace-ascii 标志来“查看”发生了什么。

标签: php curl mailgun


【解决方案1】:

您只需要更改数组的内联参数。我已经完成了它和它的工作。内联参数应该是一个数组而不是字符串图像路径。你可以这样做:

function send_inline_image($image) {
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
  curl_setopt($ch, CURLOPT_USERPWD, 'api:key-3ax6xnjp29jd6fds4gc373sgvjxteol0');
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
 curl_setopt($ch, CURLOPT_URL, 'https://api.mailgun.net/v2/samples.mailgun.org/messages');
curl_setopt($ch,
          CURLOPT_POSTFIELDS,
          array('from' => 'Excited User <me@samples.mailgun.org>',
                'to' => 'sergeyo@profista.com',
                'subject' => 'Hello',
                'text' => 'Testing some Mailgun awesomness!',
                'html' => '<html>Inline image: <img src="cid:test.jpg"></html>',
                'inline' => array($image)//Use array instead of $image
))

   $result = curl_exec($ch);
  curl_close($ch);
  return $result;
}
$image = 'Some image string that we have generated'
send_inline_image($image)

看评论“用数组代替$image”

【讨论】:

  • 非常感谢,我会试试这个
  • 在使用数组的行中抛出“注意:数组到字符串的转换...” -> 'inline' => array($image) 有人遇到过这个吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 2012-03-15
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多