当前位置: 首页 > 知识库问答 >
问题:

使用带有PDF附件的AWS SESClient Yi2发送邮件时出现问题

宋原
2023-03-14

我们正在尝试向多个用户发送带有PDF附件的电子邮件。附加的PDF通过kartik\mpdf\PDF生成。

我们采取的步骤

  1. 从DB中获取用户和消息内容
  2. 对于所有可用的用户,生成电子邮件对象,也生成PDF并发送带有附加pdf的邮件。
  3. 要发送电子邮件,我们使用亚马逊SES。
'pdf' => [
    'class' => Pdf::classname(),
    'format' => Pdf::FORMAT_A4,
    'orientation' => Pdf::ORIENT_PORTRAIT,
    'destination' => Pdf::DEST_STRING,
]

===========================

use Aws\Ses\SesClient;

//Fetch all records whose mail_send is 0 and in_queue is 0
$email_model = new MailQueue();
$mail_queue_data = // select query to get Email IDs, email content etc from mail queue table;

foreach($mail_queue_data as $result) 
{
    try {
        // Create SES client Instance
        $gaws_ses_client = SesClient::factory(array(
            'version' => 'latest',
            'region'  => 'us-east-1',
            'credentials' => [
                'key' => 'YOUR_KEY',
                'secret' => 'YOUR_SECRET_KEY',
            ]
        ));

        // Set SES linked user email
        $my_from_address = 'this_is_test@demo.com';

        $my_string_to_addresses = $result['to_email'];
        $my_array_to_adresses = [$my_string_to_addresses];

        $my_subject = isset($result['subject']) ? $result['subject'] : '';
        $my_html_body = isset($result['email_html']) ? $result['email_html'] : '';

        // Set mail message
        $my_message = "";
        $my_message .= "MIME-Version: 1.0\n";
        $my_message .= "To: ".$my_string_to_addresses."\n"; 
        $my_message .= "From:".$my_from_address."\n";   
        $my_message .= "Subject:".$my_subject."\n";

        $my_separator = md5(time());
        $my_separator_multipart = md5($my_subject . time());

        // Set headers
        $my_message .= "Content-Type: multipart/mixed; boundary=\"".$my_separator_multipart."\"\n";
        $my_message .= "\n--".$my_separator_multipart."\n";
        $my_message .= "Content-Type: multipart/alternative; boundary=\"".$my_separator."\"\n";
        $my_message .= "\n--".$my_separator."\n";
        $my_message .= "Content-Type: text/html; charset=\"UTF-8\"\n";
        $my_message .= "\n".$my_html_body."\n";
        $my_message .= "\n--".$my_separator."--\n";

        $content = $my_html_body;
        $pdf = Yii::$app->pdf;
        $pdf->cssFile = '@backend/web/css/externalcss_file_name.css';
        $pdf->content = $content;
        $raw_data = $pdf->render();

        $my_file_name = 'attachment.pdf';

        $my_data_attached_file = chunk_split(base64_encode($raw_data));

        $file_info = new \finfo(FILEINFO_MIME_TYPE);
        $my_file_mime_type = $file_info->buffer($raw_data);

        $my_message .= "--".$my_separator_multipart."\n";
        $my_message .= "Content-Type: ".$my_file_mime_type."; name=\"".$my_file_name."\"\n";
        $my_message .= "Content-Disposition: attachment; filename=\"".$my_file_name."\"\n";
        $my_message .= "Content-Transfer-Encoding: base64\n\n";
        $my_message .= $my_data_attached_file."\n";
        $my_message .= "--".$my_separator_multipart."--";

        $my_array_ses = [
            'Source'       => $my_from_address,
            'Destinations' => $my_array_to_adresses,
            'RawMessage'   => [
                'Data' => $my_message
            ]
        ];

        $my_api_result = $gaws_ses_client->sendRawEmail($my_array_ses);

        //view sample output
        echo "\n<BR>SES Result:<BR>\n";
        echo "Message ID : ".$my_api_result['MessageId']."<BR>\n";
        print_r($my_api_result);
        echo "<BR>\n";

    } catch (Exception $my_obj_error) {
        //An error happened and the email did not get sent
        $my_error_info = $my_obj_error->getMessage();

        echo "\n<BR>*** SES ERROR:<BR>\n";
        print_r($my_error_info);
        echo "<BR>\n";      

        $myfile = fopen("ses_send_error.txt", "w");
        fwrite($myfile, $my_error_info);
        fclose($myfile);

    }
}

PHP通知–yii\base\ErrorException

未定义索引:数据

当PDF包含图像时,会生成该异常。如果我们生成没有图像的PDF,它可以正常工作。那么如何解决这个问题呢?

共有1个答案

周浩淼
2023-03-14

为了解决这个问题,我建议对电子邮件地址进行硬编码,如下所示。确保添加真实的电子邮件地址。一旦工作正常,就可以将my\u string\u to\u addresses格式化为这种格式。

$my_array_to_adresses = ['email1@domain.com', 'email2@domain.com'];
 类似资料:
  • 所有数据以文本格式发送,而不是作为附件的PDF格式。 内容类型:多部分/备用;边界=myapp--_myapp_内容类型:文本/普通;charset=UTF-8Content-Transfer-Encoding:7bit测试消息--myapp--_myapp_Content-Type:Application/pdf;name=myPdf。PDF内容处置:附件;filename=myPdf。PDF内

  • 尝试发送带有pdf附件的电子邮件,尝试使用swickmailer,但没有成功,此代码使用zip但不使用PDF:( 邮件被发送罚款,我得到的邮件:但附件是不存在的,在meial有所有的bas64编码在电子邮件像: onatatent-Type: Application/octet-stream; name="media.pdf"Content-transver-Encode: base 64 Con

  • 我需要在我的应用程序中集成邮件服务。我的应用程序应该发送电子邮件,其中必须附上。pdf文件(详细报告)。PDF文件现在位于远程服务器上。 有人能帮我理解如何在黑莓手机上发送带有pdf附件的邮件吗?如果实施是可行的,那么我将如何实施? 以下是我从Blackberry知识库论坛获得的用Blackberry发送邮件的链接 如何-创建附件 如何创建和发送消息

  • 本文向大家介绍Codeigniter实现发送带附件的邮件,包括了Codeigniter实现发送带附件的邮件的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Codeigniter实现发送带附件的邮件的方法。分享给大家供大家参考。具体分析如下: attach() 方法允许你的发邮件时带上附件,下面是演示代码 希望本文所述对大家基于Codeigniter的php程序设计有所帮助。

  • 问题内容: 如何使用Outlook 2010发送带有附件的电子邮件(本地文件或Intranet中的文件)? 似乎不起作用。 问题答案: 不,这根本不可能。协议中对此没有规定,如果可能的话,这将是一个巨大的安全漏洞。 发送文件但让客户端发送我能想到的电子邮件的最佳方法是: 让用户选择一个文件 将文件上传到服务器 上传后让服务器返回随机文件名 在消息正文中建立一个包含上载文件的URL 的链接

  • 我正在将Mailgun集成到我的iOS应用程序中,并尝试发送带有附件的电子邮件。电子邮件已发送,但附件似乎已被忽略。有什么想法吗?代码如下。我使用的是AFNetworking 2,我没有使用本机的Mailgun Objective-C SDK,因为它似乎没有得到维护。 我可以使用curl发送附件,例如: