php - 通过 Sparkpost 发送 iCal 邀请

标签 php email-attachments sparkpost

我尝试使用 SparkPost 通过电子邮件以附件形式发送日历邀请,但收到电子邮件后邀请不会打开。我使用两个文件“calendarinvite.php”来创建邀请,使用“Sendemail.php”来发送电子邮件。

calendarinvite.php 文件正确创建邀请,因为当我运行脚本时,我可以下载邀请并打开它。但是,一旦作为附件发送,我就无法打开邀请。

如有任何帮助,我们将不胜感激。

Sendemail.php:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

// include substr($_SERVER["DOCUMENT_ROOT"], 0, strrpos($_SERVER["DOCUMENT_ROOT"], '\\')) . '/thingzine/sparkpost/CalendarInvit.php';

// echo $ical;

// Function to Access SparkPost API:
function sparkpost($method, $uri, $payload = [], $headers = [])
{
    $defaultHeaders = [ 'Content-Type: application/json' ];
    $curl = curl_init();
    $method = strtoupper($method);
    $finalHeaders = array_merge($defaultHeaders, $headers);
    $url = 'https://api.sparkpost.com:443/api/v1/'.$uri;

    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    if ($method !== 'GET') {
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($payload));
    }

    curl_setopt($curl, CURLOPT_HTTPHEADER, $finalHeaders);
    $result = curl_exec($curl);
    curl_close($curl);
    return $result;
}


// Variables for Attachment:
$filePath = dirname(__FILE__).'/';
$fileName = 'calendar.ics';
// $fileName = 'test.jpg';

// ====== Sample Code: mime_content_type not a function in our version of php:
// mime_content_type not a function in our version of php:
// $attFile = $filePath.$fileName;
// $fileType = mime_content_type($attFile);
// ==================

$fileData = base64_encode($filePath.$fileName);

// ========= Vairable to get template for email Body:
$fileNameHTLM = 'TemplateTest.html';
$htmltemplate = $filePath.$fileNameHTLM;
$html = file_get_contents($htmltemplate);
// ===============================

// Payload to send Email:
$payload = [
    'options' => ['sandbox' => false,],
    'content' => [
        'from' => [
            'name' => 'Team 3',
            'email' => '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="84dcdcdcdcdcc4dcdcdcdcaae7ebe9" rel="noreferrer noopener nofollow">[email protected]</a>',
        ],
        'subject' => 'Sending an email with SparkPost',
        'html' => "$html",
        'attachments' => [
                          [
                              'name' => $fileName,
                              'type' => 'application/ics',
                              'data' => $fileData,
                          ],
                      ],
    ],
    'recipients' => [
        ['address' => '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5c0e0e0e181a1c3b313d3530723f3331" rel="noreferrer noopener nofollow">[email protected]</a>', 'name' => 'Testing'],
    ],
];

$headers = [ 'Authorization: XXXXXXXXXXXXX' ];


?>

CalendarInvite.php:

<?php
$domain         = "XXX.com";
$sentDate       = gmdate('Ymd') . 'T' . gmdate('His');
$message        = "";
$fromName       = "ZZZZ";
$fromEmail      = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d9a1a1a199a1a1a1a1f7bab6b4" rel="noreferrer noopener nofollow">[email protected]</a>";
$toName         = "George";
$toEmail        = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0850505050485050505050266b6765" rel="noreferrer noopener nofollow">[email protected]</a>";
$subject        = gmdate('His') . " - test calen invite";
$description    = "SPARKPOST: This is a meeting to eat steak. Come hungry.";
$startTime      = "20190130T053000";
$endTime        = "20190130T073000";
$location       = "123 oak ave\, CA 07642";
$organizerName  = "YYYY O.";
$organizerEmail = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2c7474746c554d444343024f4341" rel="noreferrer noopener nofollow">[email protected]</a>";
$eventTitle     = "Meeting Calendar Event";
$msgID          = md5(uniqid(mt_rand(), true)) . ".nariel.com";

//Create ICAL Content (Google rfc 2445 for details and examples of usage)

$ical = 'BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
CALSCALE:GREGORIAN
METHOD:REQUEST
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
BEGIN:VEVENT
LOCATION:' . $location . '
DESCRIPTION: ' . $description . '
DTEND:' . $endTime . 'Z
DTSTAMP:' . $sentDate . 'Z
DTSTART:' . $startTime . 'Z
ORGANIZER;CN=' . $organizerName . ':mailto:' . $fromEmail . '
PRIORITY:5
SEQUENCE:0
SUMMARY;LANGUAGE=en-us:' . $eventTitle . '
TRANSP:OPAQUE
UID:' . $msgID . '
X-ALT-DESC;FMTTYPE=text/html:
BEGIN:VALARM
TRIGGER:-PT15M
ACTION:DISPLAY
DESCRIPTION:Reminder
END:VALARM
END:VEVENT
END:VCALENDAR';

// $message .= $ical;
// $mimeMessage = $headers . $message;
// echo $mimeMessage  . "<br><br><br><br>"

// header('Content-Type: text/calendar; method=REQUEST; charset="UTF-8"\n');
// header('Content-Disposition: inline; filename=Invit.ics');

header('Content-Type: text/Calendar; charset="UTF-8"; method=REQUEST');
header("Content-Disposition: inline; filename=calendar.ics");

echo $ical;

?>

最佳答案

这对我有用:

传输 API 的 JSON 输入

{
    "options": {
        "open_tracking": true,
        "click_tracking": true,
        "transactional": false,
        "sandbox": false,
        "inline_css": false
    },
    "campaign_id": "test",
    "recipients": [
        {
            "address": {
                "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="126677616652776a737f627e773c717d7f" rel="noreferrer noopener nofollow">[email protected]</a>",
                "name": "test recipient"
            },
            "tags": [],
            "substitution_data": {
                "firstname": "John"
            }
        }
    ],
    "content": {
        "from": {
            "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="bacedfc9cefacedfc9ce94dfc2dbd7cad6df94d9d5d7" rel="noreferrer noopener nofollow">[email protected]</a>",
            "name": "Sparkpost Demo System"
        },
        "subject": "My Cal Invite",
        "reply_to": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f185948285b19489909c819d94df929e9c" rel="noreferrer noopener nofollow">[email protected]</a>",
        "text": "Sample Calendar Invite \n ",
        "html": "<p>Here is a sample calendar invite</p>",
        "attachments": [
            {
                "name": "invite.ics",
                "type": "application/ics; name=\"invite.ics\"",
                "data": "QkVHSU46VkNBTEVOREFSDQpWRVJTSU9OOjIuMA0KQ0FMU0NBTEU6R1JFR09SSUFODQpNRVRIT0Q6UkVRVUVTVA0KQkVHSU46VkVWRU5UDQpEVFNUQVJUOjIwMTkwMTA5VDIyMDAwMFoNCkRURU5EOjIwMTkwMTA5VDIzMDAwMFoNCkRUU1RBTVA6MjAxOTAxMDlUMjEyNDQxWg0KT1JHQU5JWkVSO0NOPUpvaG4gRG9lOm1haWx0bzpqb2huQGV4YW1wbGUuY29tDQpVSUQ6MjA0QTNDQTYtOENDNS00MzJFLTk3NzgtMzQxOENBNDY3QUIzDQpBVFRFTkRFRTtDVVRZUEU9SU5ESVZJRFVBTDtST0xFPVJFUS1QQVJUSUNJUEFOVDtQQVJUU1RBVD1BQ0NFUFRFRDtSU1ZQPVRSVUUNCiA7Q049SmFuZSBEb2U7WC1OVU0tR1VFU1RTPTA6bWFpbHRvOmphbmVAZXhhbXBsZS5jb20NCkFUVEVOREVFO0NVVFlQRT1JTkRJVklEVUFMO1JPTEU9UkVRLVBBUlRJQ0lQQU5UO1BBUlRTVEFUPU5FRURTLUFDVElPTjtSU1ZQPQ0KIFRSVUU7Q049am9obkBleGFtcGxlLmNvbTtYLU5VTS1HVUVTVFM9MDptYWlsdG86am9obkBleGFtcGxlLmNvbQ0KQ1JFQVRFRDoyMDE5MDEwOVQyMTI0MDJaDQpERVNDUklQVElPTjpZb3VyIGV2ZW50IGNvbnRlbnQNCkxBU1QtTU9ESUZJRUQ6MjAxOTAxMDlUMjEyNDQwWg0KTE9DQVRJT046DQpTRVFVRU5DRTowDQpTVEFUVVM6Q09ORklSTUVEDQpTVU1NQVJZOlRlc3QNClRSQU5TUDpPUEFRVUUNClgtQVBQTEUtVFJBVkVMLUFEVklTT1JZLUJFSEFWSU9SOkFVVE9NQVRJQw0KRU5EOlZFVkVOVA0KRU5EOlZDQUxFTkRBUg0K"
            }
        ]
    }
}

这是一个示例 CURL 命令。您需要输入正确的往返地址和 API key 。

curl -X POST \
  https://api.sparkpost.com/api/v1/transmissions \
  -H 'Authorization: [YOUR_TOKEN_HERE]' \
  -H 'cache-control: no-cache' \
  -d '{
    "options": {
        "open_tracking": true,
        "click_tracking": true,
        "transactional": false,
        "sandbox": false,
        "inline_css": false
    },
    "campaign_id": "test",
    "recipients": [
        {
            "address": {
                "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4135243235012439202c312d246f222e2c" rel="noreferrer noopener nofollow">[email protected]</a>",
                "name": "test recipient"
            },
            "tags": [],
            "substitution_data": {
                "firstname": "John"
            }
        }
    ],
    "content": {
        "from": {
            "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8df9e8fef9cdf9e8fef9a3e8f5ece0fde1e8a3eee2e0" rel="noreferrer noopener nofollow">[email protected]</a>",
            "name": "Sparkpost Demo System"
        },
        "subject": "My Cal Invite",
        "reply_to": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5024352324103528313d203c357e333f3d" rel="noreferrer noopener nofollow">[email protected]</a>",
        "text": "Sample Calendar Invite \n ",
        "html": "<p>Here is a sample calendar invite</p>",
        "attachments": [
            {
                "name": "invite.ics",
                "type": "application/ics; name=\"invite.ics\"",
                "data": "QkVHSU46VkNBTEVOREFSDQpWRVJTSU9OOjIuMA0KQ0FMU0NBTEU6R1JFR09SSUFODQpNRVRIT0Q6UkVRVUVTVA0KQkVHSU46VkVWRU5UDQpEVFNUQVJUOjIwMTkwMTA5VDIyMDAwMFoNCkRURU5EOjIwMTkwMTA5VDIzMDAwMFoNCkRUU1RBTVA6MjAxOTAxMDlUMjEyNDQxWg0KT1JHQU5JWkVSO0NOPUpvaG4gRG9lOm1haWx0bzpqb2huQGV4YW1wbGUuY29tDQpVSUQ6MjA0QTNDQTYtOENDNS00MzJFLTk3NzgtMzQxOENBNDY3QUIzDQpBVFRFTkRFRTtDVVRZUEU9SU5ESVZJRFVBTDtST0xFPVJFUS1QQVJUSUNJUEFOVDtQQVJUU1RBVD1BQ0NFUFRFRDtSU1ZQPVRSVUUNCiA7Q049SmFuZSBEb2U7WC1OVU0tR1VFU1RTPTA6bWFpbHRvOmphbmVAZXhhbXBsZS5jb20NCkFUVEVOREVFO0NVVFlQRT1JTkRJVklEVUFMO1JPTEU9UkVRLVBBUlRJQ0lQQU5UO1BBUlRTVEFUPU5FRURTLUFDVElPTjtSU1ZQPQ0KIFRSVUU7Q049am9obkBleGFtcGxlLmNvbTtYLU5VTS1HVUVTVFM9MDptYWlsdG86am9obkBleGFtcGxlLmNvbQ0KQ1JFQVRFRDoyMDE5MDEwOVQyMTI0MDJaDQpERVNDUklQVElPTjpZb3VyIGV2ZW50IGNvbnRlbnQNCkxBU1QtTU9ESUZJRUQ6MjAxOTAxMDlUMjEyNDQwWg0KTE9DQVRJT046DQpTRVFVRU5DRTowDQpTVEFUVVM6Q09ORklSTUVEDQpTVU1NQVJZOlRlc3QNClRSQU5TUDpPUEFRVUUNClgtQVBQTEUtVFJBVkVMLUFEVklTT1JZLUJFSEFWSU9SOkFVVE9NQVRJQw0KRU5EOlZFVkVOVA0KRU5EOlZDQUxFTkRBUg0K"
            }
        ]
    }
}
'

这是 Base64 之前的原始日历数据:

BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
DTSTART:20190109T220000Z
DTEND:20190109T230000Z
DTSTAMP:20190109T212441Z
ORGANIZER;CN=John Doe:mailto:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0963666167496c71686479656c276a6664" rel="noreferrer noopener nofollow">[email protected]</a>
UID:204A3CA6-8CC5-432E-9778-3418CA467AB3
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE
 ;CN=Jane Doe;X-NUM-GUESTS=0:mailto:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4b212a252e0b2e332a263b272e65282426" rel="noreferrer noopener nofollow">[email protected]</a>
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
 TRUE;<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e2a1acdf888d8a8ca2879a838f928e87cc818d8f" rel="noreferrer noopener nofollow">[email protected]</a>;X-NUM-GUESTS=0:mailto:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="264c494e4866435e474b564a430845494b" rel="noreferrer noopener nofollow">[email protected]</a>
CREATED:20190109T212402Z
DESCRIPTION:Your event content
LAST-MODIFIED:20190109T212440Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Test
TRANSP:OPAQUE
X-APPLE-TRAVEL-ADVISORY-BEHAVIOR:AUTOMATIC
END:VEVENT
END:VCALENDAR

关于php - 通过 Sparkpost 发送 iCal 邀请,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54118343/

相关文章:

php - 判断一个字符是否是字母

php - 可以用来代替 mysql_num_rows 的 mysql 查询

Java 邮件附加文件在下载后显示损坏

swift - 使用 ios 8 应用程序打开邮件中的附件 [swift]

ruby - 如何使用 SparkPosts Ruby API 客户端设置reply_to/reply-to?

php - 如何使用 Composer 将 FirePHP 添加到 Zend Framework 2

php - header ('Content-Type: image/png' );不工作了?

python - 在 App Engine 中接收电子邮件附件 Unicode 文本文件出现 Python 错误

email - 如何为电子邮件设置 "MAIL FROM" header ?

python - SparkPost:至少需要一个有效的收件人 python/django API