使用 foreach 循环添加山魈电子邮件附件


adding mandrill email attachments using foreach loop

我需要回复传入的电子邮件,包括它们包含的附件。我编写了这段代码,但由于某种原因,当我检查调试日志和山钻 API 日志时,附件未包含在请求中。我的错在哪里?

if ($message['attachments']) 
    {
        $mail= 
            [
                'html' => $mail->msg->html,
                'text' => $mail->msg->text,
                'subject' => $mail->msg->subject,
                'from_email' => 'test@test.com',
                'from_name' => $mail->msg->from_name,
                'to' => [
                    [
                        'email' => 'test@test.com',
                        'name' => 'test@test.com',
                        'type' => 'to'
                    ]
                ],
                'headers' => [
                    'Reply-To' => $mail->msg->from_email
                ],
            ];
            //just some sample data for testing
            foreach ($message['attachment'] as $attachment) 
                {
                    $mail['attachments']['name'] ='sample.png';
                    $mail['attachments']['type'] ='image/png';
                    $mail['attachments']['content'] ='iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABlBMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDrEX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg==';
                }
                $async = false;
                $ip_pool = 'Main Pool';
                $v = var_export( $mail, true);
                file_put_contents('phplog.txt', 'gesendet: ' . $v, FILE_APPEND);
                $result = $mandrill->messages->send($mail, $async, $ip_pool, $send_at);
    }

下面的行看起来很可疑。如果您在此处检查 https://mandrillapp.com/api/docs/messages.html。您可以清楚地看到attachments是一个多维数组。

 //just some sample data for testing
        foreach ($message['attachment'] as $attachment) 
            {
                $mail['attachments']['name'] ='sample.png';
                $mail['attachments']['type'] ='image/png';
                $mail['attachments']['content'] ='iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABlBMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDrEX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg==';
            }

至少它应该像下面一样,但你仍然没有在代码中使用$attachment。但正确的用法如下。

    foreach ($message['attachment'] as $key => $attachment) 
        {
            $mail['attachments'][$key]['name'] ='sample.png';
            $mail['attachments'][$key]['type'] ='image/png';
            $mail['attachments'][$key]['content'] ='iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABlBMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDrEX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg==';
        }

如果您想以更清晰的方式尝试,请使用以下内容:

$attachment = [];
$attachment['name'] ='sample.png';
$attachment['type'] ='image/png';
$attachment['content'] ='iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABlBMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDrEX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg==';


$mail['attachments'][] = $attachment;

根据评论更新:

事情看起来很好,只需将您的 if 语句if ($message['attachments'])更改为 if (is_array($message['attachments']) && count($message['attachments']) > 1),然后在 if 语句放置$message['attachments'] = array_values($message['attachments']);之后

所以像下面这样循环。只需注意我向其添加语义键$attachment,您就可以根据需要进行更改。我不知道您从哪里获取文件,静态或文件上传等。我添加了一个例子。

    foreach ($message['attachment'] as $key => $attachment) 
        {
            $mail['attachments'][$key]['name'] =$attachment['fileName'];
            $mail['attachments'][$key]['type'] =$attachment['mimeType'];
            $mail['attachments'][$key]['content'] = chunk_split(base64_encode(file_get_contents($attachment['filePath']))); ;
        }