Post SMTP Mailer/Email Log - Version 1.8.1

Version Description

  • 2017-12-24
  • New: Sendgrid API & Client Version 6
  • New: Add email log 'send to' column
  • Fix: fallback emails on hosting require the '-f' parameter
  • Fix: Using hostname insted of an IP
  • Fix: Remove mailgun test folder ( virustotal issue )
  • Fix: Additional bugs collected from support tickets.
  • Added: added filters to from_name and from_email filters (local connection)
  • change hostname extrect logic
Download this release

Release Info

Developer yehudah
Plugin Icon 128x128 Post SMTP Mailer/Email Log
Version 1.8.1
Comparing to
See all releases

Code changes from version 1.8 to 1.8.1

Files changed (28) hide show
  1. Postman/Postman-Email-Log/PostmanEmailLogController.php +3 -1
  2. Postman/Postman-Email-Log/PostmanEmailLogService.php +4 -2
  3. Postman/Postman-Email-Log/PostmanEmailLogView.php +4 -1
  4. Postman/Postman-Mail/PostmanDefaultModuleTransport.php +4 -6
  5. Postman/Postman-Mail/PostmanSendGridMailEngine.php +85 -51
  6. Postman/Postman-Mail/Zend-1.12.10/Mail.php +3 -1
  7. Postman/Postman-Mail/Zend-1.12.10/Mail/Protocol/Smtp.php +1 -1
  8. Postman/Postman-Mail/Zend-1.12.10/Mail/Transport/Smtp.php +1 -1
  9. Postman/Postman-Mail/mailgun/vendor/clue/stream-filter/tests/FilterTest.php +0 -386
  10. Postman/Postman-Mail/mailgun/vendor/clue/stream-filter/tests/FunTest.php +0 -44
  11. Postman/Postman-Mail/mailgun/vendor/clue/stream-filter/tests/FunZlibTest.php +0 -79
  12. Postman/Postman-Mail/mailgun/vendor/php-http/multipart-stream-builder/appveyor.yml +0 -39
  13. Postman/Postman-Mail/sendgrid-php-3.2.0/CHANGELOG.md +0 -36
  14. Postman/Postman-Mail/sendgrid-php-3.2.0/MIT.LICENSE +0 -15
  15. Postman/Postman-Mail/sendgrid-php-3.2.0/README.md +0 -958
  16. Postman/Postman-Mail/sendgrid-php-3.2.0/lib/SendGrid.php +0 -156
  17. Postman/Postman-Mail/sendgrid-php-3.2.0/lib/SendGrid/Email.php +0 -637
  18. Postman/Postman-Mail/sendgrid-php-3.2.0/lib/SendGrid/Exception.php +0 -14
  19. Postman/Postman-Mail/sendgrid-php-3.2.0/lib/SendGrid/Response.php +0 -40
  20. Postman/Postman-Mail/{sendgrid-php-3.2.0 → sendgrid}/.editorconfig +0 -0
  21. Postman/Postman-Mail/{sendgrid-php-3.2.0 → sendgrid}/.gitignore +0 -0
  22. Postman/Postman-Mail/{sendgrid-php-3.2.0 → sendgrid}/.travis.yml +0 -0
  23. Postman/Postman-Mail/sendgrid/composer.json +5 -0
  24. Postman/Postman-Send-Test-Email/PostmanSendTestEmailController.php +1 -1
  25. Postman/PostmanUtils.php +13 -5
  26. postman-smtp.php +2 -2
  27. readme.txt +13 -2
  28. style/postman-email-log.css +6 -0
Postman/Postman-Email-Log/PostmanEmailLogController.php CHANGED
@@ -43,6 +43,8 @@ class PostmanEmailLogController {
43
$this,
44
'on_admin_init',
45
) );
46
}
47
if ( is_admin() ) {
48
$actionName = self::RESEND_MAIL_AJAX_SLUG;
@@ -390,7 +392,7 @@ class PostmanEmailLogController {
390
</select>
391
</div>
392
<div class="form-control" style="padding: 0 5px 0 5px;">
393
- <button type="submit" name="filter" class="button button-primary"><?php _e( 'Filter', Postman::TEXT_DOMAIN ); ?></button>
394
</div>
395
<div class="form-control">
396
<button type="submit" id="postman_trash_all" name="postman_trash_all" class="button button-primary"><?php _e( 'Trash All', Postman::TEXT_DOMAIN ); ?></button>
43
$this,
44
'on_admin_init',
45
) );
46
+
47
+
48
}
49
if ( is_admin() ) {
50
$actionName = self::RESEND_MAIL_AJAX_SLUG;
392
</select>
393
</div>
394
<div class="form-control" style="padding: 0 5px 0 5px;">
395
+ <button type="submit" name="filter" class="button button-primary"><?php _e( 'Filter/Search', Postman::TEXT_DOMAIN ); ?></button>
396
</div>
397
<div class="form-control">
398
<button type="submit" id="postman_trash_all" name="postman_trash_all" class="button button-primary"><?php _e( 'Trash All', Postman::TEXT_DOMAIN ); ?></button>
Postman/Postman-Email-Log/PostmanEmailLogService.php CHANGED
@@ -160,14 +160,16 @@ if ( ! class_exists( 'PostmanEmailLogService' ) ) {
160
$message .= "\r\n" . __( 'You are welcome to post a support issue.', Postman::TEXT_DOMAIN );
161
$message .= "\r\n" . __( 'The log to paste with your support issue:', Postman::TEXT_DOMAIN ) . "\r\n";
162
163
if ( $log->statusMessage && ! empty( $log->statusMessage ) ) {
164
- mail( get_bloginfo( 'admin_email' ), __( 'Post SMTP email error', Postman::TEXT_DOMAIN ), $message . $log->statusMessage );
165
}
166
167
preg_match_all( '/(.*)From/s', $log->sessionTranscript, $matches );
168
169
if ( isset( $matches[1][0] ) && ! empty( $matches[1][0] ) && strpos( strtolower( $matches[1][0] ), 'error' ) !== false ) {
170
- mail( get_bloginfo( 'admin_email' ), __( 'Post SMTP session transcript error', Postman::TEXT_DOMAIN ), $message . $log->sessionTranscript );
171
}
172
}
173
160
$message .= "\r\n" . __( 'You are welcome to post a support issue.', Postman::TEXT_DOMAIN );
161
$message .= "\r\n" . __( 'The log to paste with your support issue:', Postman::TEXT_DOMAIN ) . "\r\n";
162
163
+ $to_email = get_bloginfo( 'admin_email' );
164
+ $domain = get_bloginfo( 'url' );
165
if ( $log->statusMessage && ! empty( $log->statusMessage ) ) {
166
+ mail( $to_email, "{$domain}: " . __( 'Post SMTP email error', Postman::TEXT_DOMAIN ), $message . $log->statusMessage, null, "-f{$to_email}" );
167
}
168
169
preg_match_all( '/(.*)From/s', $log->sessionTranscript, $matches );
170
171
if ( isset( $matches[1][0] ) && ! empty( $matches[1][0] ) && strpos( strtolower( $matches[1][0] ), 'error' ) !== false ) {
172
+ mail( $to_email, "{$domain}: " . __( 'Post SMTP session transcript error', Postman::TEXT_DOMAIN ), $message . $log->sessionTranscript, null, "-f{$to_email}" );
173
}
174
}
175
Postman/Postman-Email-Log/PostmanEmailLogView.php CHANGED
@@ -55,6 +55,7 @@ class PostmanEmailLogView extends WP_List_Table {
55
*/
56
function column_default( $item, $column_name ) {
57
switch ( $column_name ) {
58
case 'date' :
59
case 'status' :
60
return $item [ $column_name ];
@@ -159,6 +160,7 @@ class PostmanEmailLogView extends WP_List_Table {
159
$columns = array(
160
'cb' => '<input type="checkbox" />', // Render a checkbox instead of text
161
'title' => _x( 'Subject', 'What is the subject of this message?', Postman::TEXT_DOMAIN ),
162
'status' => __( 'Status', Postman::TEXT_DOMAIN ),
163
'date' => _x( 'Delivery Time', 'When was this email sent?', Postman::TEXT_DOMAIN ),
164
);
@@ -363,9 +365,10 @@ class PostmanEmailLogView extends WP_List_Table {
363
/* Translators: where %s indicates the relative time from now */
364
$date = sprintf( _x( '%s ago', 'A relative time as in "five days ago"', Postman::TEXT_DOMAIN ), $humanTime );
365
}
366
-
367
$flattenedPost = array(
368
// the post title must be escaped as they are displayed in the HTML output
369
'title' => esc_html( $post->post_title ),
370
// the post status must be escaped as they are displayed in the HTML output
371
'status' => ($post->post_excerpt != null ? esc_html( $post->post_excerpt ) : __( 'Sent', Postman::TEXT_DOMAIN )),
55
*/
56
function column_default( $item, $column_name ) {
57
switch ( $column_name ) {
58
+ case 'sent_to' :
59
case 'date' :
60
case 'status' :
61
return $item [ $column_name ];
160
$columns = array(
161
'cb' => '<input type="checkbox" />', // Render a checkbox instead of text
162
'title' => _x( 'Subject', 'What is the subject of this message?', Postman::TEXT_DOMAIN ),
163
+ 'sent_to' => __( 'Sent To', Postman::TEXT_DOMAIN ),
164
'status' => __( 'Status', Postman::TEXT_DOMAIN ),
165
'date' => _x( 'Delivery Time', 'When was this email sent?', Postman::TEXT_DOMAIN ),
166
);
365
/* Translators: where %s indicates the relative time from now */
366
$date = sprintf( _x( '%s ago', 'A relative time as in "five days ago"', Postman::TEXT_DOMAIN ), $humanTime );
367
}
368
+ $meta_values = get_post_meta( $post->ID );
369
$flattenedPost = array(
370
// the post title must be escaped as they are displayed in the HTML output
371
+ 'sent_to' => sanitize_email( $meta_values ['to_header'] [0] ),
372
'title' => esc_html( $post->post_title ),
373
// the post status must be escaped as they are displayed in the HTML output
374
'status' => ($post->post_excerpt != null ? esc_html( $post->post_excerpt ) : __( 'Sent', Postman::TEXT_DOMAIN )),
Postman/Postman-Mail/PostmanDefaultModuleTransport.php CHANGED
@@ -23,7 +23,7 @@ if (! class_exists ( 'PostmanSmtpModuleTransport' )) {
23
parent::init();
24
// From email and name
25
// If we don't have a name from the input headers
26
- $this->fromName = 'WordPress';
27
28
/*
29
* If we don't have an email from the input headers default to wordpress@$sitename
@@ -34,12 +34,10 @@ if (! class_exists ( 'PostmanSmtpModuleTransport' )) {
34
*/
35
36
// Get the site domain and get rid of www.
37
- $sitename = strtolower ( $_SERVER ['SERVER_NAME'] );
38
- if (substr ( $sitename, 0, 4 ) == 'www.') {
39
- $sitename = substr ( $sitename, 4 );
40
- }
41
42
- $this->fromEmail = 'wordpress@' . $sitename;
43
}
44
public function isConfiguredAndReady() {
45
return false;
23
parent::init();
24
// From email and name
25
// If we don't have a name from the input headers
26
+ $this->fromName = apply_filters( 'wp_mail_from_name', 'WordPress' );
27
28
/*
29
* If we don't have an email from the input headers default to wordpress@$sitename
34
*/
35
36
// Get the site domain and get rid of www.
37
+ $site_url = get_bloginfo( 'url' );
38
+ $sitename = strtolower ( PostmanUtils::getHost( $site_url ) );
39
40
+ $this->fromEmail = apply_filters( 'wp_mail_from', 'wordpress@' . $sitename );
41
}
42
public function isConfiguredAndReady() {
43
return false;
Postman/Postman-Mail/PostmanSendGridMailEngine.php CHANGED
@@ -1,7 +1,8 @@
1
<?php
2
if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) {
3
4
- require_once 'sendgrid-php-3.2.0/sendgrid-php.php';
5
6
/**
7
* Sends mail with the SendGrid API
@@ -17,7 +18,7 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) {
17
// the result
18
private $transcript;
19
20
- private $email;
21
private $apiKey;
22
23
/**
@@ -33,7 +34,7 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) {
33
$this->logger = new PostmanLogger( get_class( $this ) );
34
35
// create the Message
36
- $this->email = new SendGrid\Email();
37
}
38
39
/**
@@ -47,100 +48,111 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) {
47
// add the Postman signature - append it to whatever the user may have set
48
if ( ! $options->isStealthModeEnabled() ) {
49
$pluginData = apply_filters( 'postman_get_plugin_metadata', null );
50
- $this->email->addHeader( 'X-Mailer', sprintf( 'Postman SMTP %s for WordPress (%s)', $pluginData ['version'], 'https://wordpress.org/plugins/post-smtp/' ) );
51
}
52
53
// add the headers - see http://framework.zend.com/manual/1.12/en/zend.mail.additional-headers.html
54
foreach ( ( array ) $message->getHeaders() as $header ) {
55
$this->logger->debug( sprintf( 'Adding user header %s=%s', $header ['name'], $header ['content'] ) );
56
- $this->email->addHeader( $header ['name'], $header ['content'] );
57
}
58
59
// if the caller set a Content-Type header, use it
60
$contentType = $message->getContentType();
61
if ( ! empty( $contentType ) ) {
62
- $this->logger->debug( 'Adding content-type ' . $contentType );
63
- $this->email->addHeader( 'Content-Type', $contentType );
64
}
65
66
// add the From Header
67
$sender = $message->getFromAddress();
68
- {
69
- $senderEmail = $sender->getEmail();
70
- $senderName = $sender->getName();
71
- assert( ! empty( $senderEmail ) );
72
- $this->email->setFrom( $senderEmail );
73
- if ( ! empty( $senderName ) ) {
74
- $this->email->setFromName( $senderName );
75
- }
76
- // now log it
77
- $sender->log( $this->logger, 'From' );
78
- }
79
80
- // add the Sender Header, overriding what the user may have set
81
- $this->email->addHeader( 'Sender', $options->getEnvelopeSender() );
82
83
// add the to recipients
84
foreach ( ( array ) $message->getToRecipients() as $recipient ) {
85
$recipient->log( $this->logger, 'To' );
86
- $this->email->addTo( $recipient->getEmail(), $recipient->getName() );
87
}
88
89
// add the cc recipients
90
foreach ( ( array ) $message->getCcRecipients() as $recipient ) {
91
$recipient->log( $this->logger, 'Cc' );
92
- $this->email->addCc( $recipient->getEmail(), $recipient->getName() );
93
}
94
95
// add the bcc recipients
96
foreach ( ( array ) $message->getBccRecipients() as $recipient ) {
97
$recipient->log( $this->logger, 'Bcc' );
98
- $this->email->addBcc( $recipient->getEmail(), $recipient->getName() );
99
- }
100
-
101
- // add the reply-to
102
- $replyTo = $message->getReplyTo();
103
- // $replyTo is null or a PostmanEmailAddress object
104
- if ( isset( $replyTo ) ) {
105
- $this->email->setReplyTo( $replyTo->format() );
106
- }
107
-
108
- // add the date
109
- $date = $message->getDate();
110
- if ( ! empty( $date ) ) {
111
- $this->email->setDate( $message->getDate() );
112
}
113
114
// add the messageId
115
$messageId = $message->getMessageId();
116
if ( ! empty( $messageId ) ) {
117
- $this->email->addHeader( 'message-id', $messageId );
118
}
119
120
// add the subject
121
if ( null !== $message->getSubject() ) {
122
- $this->email->setSubject( $message->getSubject() );
123
}
124
125
// add the message content
126
- {
127
- $textPart = $message->getBodyTextPart();
128
if ( ! empty( $textPart ) ) {
129
$this->logger->debug( 'Adding body as text' );
130
- $this->email->setText( $textPart );
131
}
132
- $htmlPart = $message->getBodyHtmlPart();
133
if ( ! empty( $htmlPart ) ) {
134
$this->logger->debug( 'Adding body as html' );
135
- $this->email->setHtml( $htmlPart );
136
- }
137
}
138
139
// add attachments
140
$this->logger->debug( 'Adding attachments' );
141
- $this->addAttachmentsToMail( $message );
142
143
- $result = array();
144
try {
145
146
if ( $this->logger->isDebug() ) {
@@ -152,17 +164,27 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) {
152
if ( $this->logger->isDebug() ) {
153
$this->logger->debug( 'Sending mail' );
154
}
155
- $result = $sendgrid->send( $this->email );
156
if ( $this->logger->isInfo() ) {
157
$this->logger->info( );
158
}
159
- $this->transcript = print_r( $result, true );
160
$this->transcript .= PostmanModuleTransport::RAW_MESSAGE_FOLLOWS;
161
- $this->transcript .= print_r( $this->email, true );
162
} catch ( SendGrid\Exception $e ) {
163
$this->transcript = $e->getMessage();
164
$this->transcript .= PostmanModuleTransport::RAW_MESSAGE_FOLLOWS;
165
- $this->transcript .= print_r( $this->email, true );
166
throw $e;
167
}
168
}
@@ -181,12 +203,24 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) {
181
$attArray = $attachments;
182
}
183
// otherwise WordPress sends an array
184
foreach ( $attArray as $file ) {
185
if ( ! empty( $file ) ) {
186
$this->logger->debug( 'Adding attachment: ' . $file );
187
- $this->email->addAttachment( $file );
188
}
189
}
190
}
191
192
// return the SMTP session transcript
1
<?php
2
+
3
if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) {
4
5
+ require_once 'sendgrid/sendgrid-php.php';
6
7
/**
8
* Sends mail with the SendGrid API
18
// the result
19
private $transcript;
20
21
+ private $personalization;
22
private $apiKey;
23
24
/**
34
$this->logger = new PostmanLogger( get_class( $this ) );
35
36
// create the Message
37
+ $this->personalization = new SendGrid\Personalization();
38
}
39
40
/**
48
// add the Postman signature - append it to whatever the user may have set
49
if ( ! $options->isStealthModeEnabled() ) {
50
$pluginData = apply_filters( 'postman_get_plugin_metadata', null );
51
+ $this->personalization->addHeader( 'X-Mailer', sprintf( 'Postman SMTP %s for WordPress (%s)', $pluginData ['version'], 'https://wordpress.org/plugins/post-smtp/' ) );
52
}
53
54
// add the headers - see http://framework.zend.com/manual/1.12/en/zend.mail.additional-headers.html
55
foreach ( ( array ) $message->getHeaders() as $header ) {
56
$this->logger->debug( sprintf( 'Adding user header %s=%s', $header ['name'], $header ['content'] ) );
57
+ $this->personalization->addHeader( $header ['name'], $header ['content'] );
58
}
59
60
// if the caller set a Content-Type header, use it
61
$contentType = $message->getContentType();
62
if ( ! empty( $contentType ) ) {
63
+ $this->logger->debug( 'Some header keys are reserved. You may not include any of the following reserved headers: x-sg-id, x-sg-eid, received, dkim-signature, Content-Type, Content-Transfer-Encoding, To, From, Subject, Reply-To, CC, BCC.' );
64
}
65
66
// add the From Header
67
$sender = $message->getFromAddress();
68
69
+ $senderEmail = ! empty( $sender->getEmail() ) ? $sender->getEmail() : $options->getMessageSenderEmail();
70
+ $senderName = ! empty( $sender->getName() ) ? $sender->getName() : $options->getMessageSenderName();
71
+
72
+ $from = new SendGrid\Email( $senderName, $senderEmail );
73
+
74
+ // now log it
75
+ $sender->log( $this->logger, 'From' );
76
77
// add the to recipients
78
+ $counter = 0;
79
foreach ( ( array ) $message->getToRecipients() as $recipient ) {
80
$recipient->log( $this->logger, 'To' );
81
+ if ( $counter == 0 ) {
82
+ $to = new SendGrid\Email($recipient->getName(), $recipient->getEmail());
83
+ $this->personalization->addTo( $to );
84
+ } else {
85
+ $email = new SendGrid\Email($recipient->getName(), $recipient->getEmail());
86
+ $this->personalization->addTo( $email );
87
+ }
88
+
89
+ $counter++;
90
}
91
92
// add the cc recipients
93
foreach ( ( array ) $message->getCcRecipients() as $recipient ) {
94
$recipient->log( $this->logger, 'Cc' );
95
+ $this->personalization->addCc( $recipient->getEmail(), $recipient->getName() );
96
}
97
98
// add the bcc recipients
99
foreach ( ( array ) $message->getBccRecipients() as $recipient ) {
100
$recipient->log( $this->logger, 'Bcc' );
101
+ $this->personalization->addBcc( $recipient->getEmail(), $recipient->getName() );
102
}
103
104
// add the messageId
105
$messageId = $message->getMessageId();
106
if ( ! empty( $messageId ) ) {
107
+ $this->personalization->addHeader( 'message-id', $messageId );
108
}
109
110
// add the subject
111
if ( null !== $message->getSubject() ) {
112
+ $subject = $message->getSubject();
113
}
114
115
// add the message content
116
+
117
+ $textPart = $message->getBodyTextPart();
118
if ( ! empty( $textPart ) ) {
119
$this->logger->debug( 'Adding body as text' );
120
+ $content = new SendGrid\Content("text/plain", $textPart);
121
}
122
+
123
+ $htmlPart = $message->getBodyHtmlPart();
124
if ( ! empty( $htmlPart ) ) {
125
$this->logger->debug( 'Adding body as html' );
126
+ $content = new SendGrid\Content("text/html", $htmlPart);
127
}
128
129
// add attachments
130
$this->logger->debug( 'Adding attachments' );
131
132
+ $mail = new SendGrid\Mail($from, $subject, $to, $content);
133
+ $mail->addPersonalization($this->personalization);
134
+
135
+
136
+ // add the reply-to
137
+ $replyTo = $message->getReplyTo();
138
+ // $replyTo is null or a PostmanEmailAddress object
139
+ if ( isset( $replyTo ) ) {
140
+ $reply_to = new SendGrid\ReplyTo( $replyTo->getEmail(), $replyTo->getName() );
141
+ $mail->setReplyTo($reply_to);
142
+ }
143
+
144
+ $attachments = $this->addAttachmentsToMail( $message );
145
+
146
+ foreach ( $attachments as $index => $attachment ) {
147
+ $attach = new SendGrid\Attachment();
148
+ $attach->setContent($attachment['content']);
149
+ $attach->setType($attachment['type']);
150
+ $attach->setFilename($attachment['file_name']);
151
+ $attach->setDisposition("attachment");
152
+ $attach->setContentId($attachment['id']);
153
+ $mail->addAttachment($attach);
154
+ }
155
+
156
try {
157
158
if ( $this->logger->isDebug() ) {
164
if ( $this->logger->isDebug() ) {
165
$this->logger->debug( 'Sending mail' );
166
}
167
+
168
+ $response = $sendgrid->client->mail()->send()->post($mail);
169
if ( $this->logger->isInfo() ) {
170
$this->logger->info( );
171
}
172
+
173
+ $response_body = json_decode( $response->body() );
174
+
175
+ if ( isset( $response_body->errors[0]->message ) ) {
176
+ $this->transcript = $response_body->errors[0]->message;
177
+ $this->transcript .= PostmanModuleTransport::RAW_MESSAGE_FOLLOWS;
178
+ $this->transcript .= print_r( $mail, true );
179
+ throw new Exception( $response_body->errors[0]->message );
180
+ }
181
+ $this->transcript = print_r( $response->body(), true );
182
$this->transcript .= PostmanModuleTransport::RAW_MESSAGE_FOLLOWS;
183
+ $this->transcript .= print_r( $mail, true );
184
} catch ( SendGrid\Exception $e ) {
185
$this->transcript = $e->getMessage();
186
$this->transcript .= PostmanModuleTransport::RAW_MESSAGE_FOLLOWS;
187
+ $this->transcript .= print_r( $mail, true );
188
throw $e;
189
}
190
}
203
$attArray = $attachments;
204
}
205
// otherwise WordPress sends an array
206
+ $attachments = array();
207
foreach ( $attArray as $file ) {
208
if ( ! empty( $file ) ) {
209
$this->logger->debug( 'Adding attachment: ' . $file );
210
+
211
+ $file_name = basename( $file );
212
+ $file_parts = explode( '.', $file_name );
213
+ $attachments[] = array(
214
+ 'content' => base64_encode( file_get_contents( $file ) ),
215
+ 'type' => mime_content_type( $file ),
216
+ 'file_name' => $file_name,
217
+ 'disposition' => 'attachment',
218
+ 'id' => $file_parts[0],
219
+ );
220
}
221
}
222
+
223
+ return $attachments;
224
}
225
226
// return the SMTP session transcript
Postman/Postman-Mail/Zend-1.12.10/Mail.php CHANGED
@@ -1176,7 +1176,9 @@ class Postman_Zend_Mail extends Postman_Zend_Mime_Message
1176
if ($transport === null) {
1177
if (! self::$_defaultTransport instanceof Postman_Zend_Mail_Transport_Abstract) {
1178
require_once 'Zend/Mail/Transport/Sendmail.php';
1179
- $transport = new Postman_Zend_Mail_Transport_Sendmail();
1180
} else {
1181
$transport = self::$_defaultTransport;
1182
}
1176
if ($transport === null) {
1177
if (! self::$_defaultTransport instanceof Postman_Zend_Mail_Transport_Abstract) {
1178
require_once 'Zend/Mail/Transport/Sendmail.php';
1179
+
1180
+ $replyTo = self::getDefaultReplyTo();
1181
+ $transport = new Postman_Zend_Mail_Transport_Sendmail("-f{$replyTo['email']}");
1182
} else {
1183
$transport = self::$_defaultTransport;
1184
}
Postman/Postman-Mail/Zend-1.12.10/Mail/Protocol/Smtp.php CHANGED
@@ -205,7 +205,7 @@ class Postman_Zend_Mail_Protocol_Smtp extends Postman_Zend_Mail_Protocol_Abstrac
205
$this->_expect(220, 180);
206
207
stream_context_set_option($this->_socket, 'ssl', 'verify_peer', false);
208
- //stream_context_set_option($this->_socket, 'ssl', 'verify_peer_name', false);
209
stream_context_set_option($this->_socket, 'ssl', 'allow_self_signed', true);
210
211
if (!stream_socket_enable_crypto($this->_socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
205
$this->_expect(220, 180);
206
207
stream_context_set_option($this->_socket, 'ssl', 'verify_peer', false);
208
+ stream_context_set_option($this->_socket, 'ssl', 'verify_peer_name', false);
209
stream_context_set_option($this->_socket, 'ssl', 'allow_self_signed', true);
210
211
if (!stream_socket_enable_crypto($this->_socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
Postman/Postman-Mail/Zend-1.12.10/Mail/Transport/Smtp.php CHANGED
@@ -120,7 +120,7 @@ class Postman_Zend_Mail_Transport_Smtp extends Postman_Zend_Mail_Transport_Abstr
120
if (isset($config['name'])) {
121
$this->_name = $config['name'];
122
} else {
123
- $this->_name = PostmanUtils::getServerIp();
124
}
125
126
if (isset($config['port'])) {
120
if (isset($config['name'])) {
121
$this->_name = $config['name'];
122
} else {
123
+ $this->_name = PostmanUtils::getServerName();
124
}
125
126
if (isset($config['port'])) {
Postman/Postman-Mail/mailgun/vendor/clue/stream-filter/tests/FilterTest.php DELETED
@@ -1,386 +0,0 @@
1
- <?php
2
-
3
- use Clue\StreamFilter;
4
-
5
- class FilterTest extends PHPUnit_Framework_TestCase
6
- {
7
- public function testAppendSimpleCallback()
8
- {
9
- $stream = $this->createStream();
10
-
11
- StreamFilter\append($stream, function ($chunk) {
12
- return strtoupper($chunk);
13
- });
14
-
15
- fwrite($stream, 'hello');
16
- fwrite($stream, 'world');
17
- rewind($stream);
18
-
19
- $this->assertEquals('HELLOWORLD', stream_get_contents($stream));
20
-
21
- fclose($stream);
22
- }
23
-
24
- public function testAppendNativePhpFunction()
25
- {
26
- $stream = $this->createStream();
27
-
28
- StreamFilter\append($stream, 'strtoupper');
29
-
30
- fwrite($stream, 'hello');
31
- fwrite($stream, 'world');
32
- rewind($stream);
33
-
34
- $this->assertEquals('HELLOWORLD', stream_get_contents($stream));
35
-
36
- fclose($stream);
37
- }
38
-
39
- public function testAppendChangingChunkSize()
40
- {
41
- $stream = $this->createStream();
42
-
43
- StreamFilter\append($stream, function ($chunk) {
44
- return str_replace(array('a','e','i','o','u'), '', $chunk);
45
- });
46
-
47
- fwrite($stream, 'hello');
48
- fwrite($stream, 'world');
49
- rewind($stream);
50
-
51
- $this->assertEquals('hllwrld', stream_get_contents($stream));
52
-
53
- fclose($stream);
54
- }
55
-
56
- public function testAppendReturningEmptyStringWillNotPassThrough()
57
- {
58
- $stream = $this->createStream();
59
-
60
- StreamFilter\append($stream, function ($chunk) {
61
- return '';
62
- });
63
-
64
- fwrite($stream, 'hello');
65
- fwrite($stream, 'world');
66
- rewind($stream);
67
-
68
- $this->assertEquals('', stream_get_contents($stream));
69
-
70
- fclose($stream);
71
- }
72
-
73
- public function testAppendEndEventCanBeBufferedOnClose()
74
- {
75
- if (PHP_VERSION < 5.4) $this->markTestSkipped('Not supported on legacy PHP');
76
-
77
- $stream = $this->createStream();
78
-
79
- StreamFilter\append($stream, function ($chunk = null) {
80
- if ($chunk === null) {
81
- // this signals the end event
82
- return '!';
83
- }
84
- return $chunk . ' ';
85
- }, STREAM_FILTER_WRITE);
86
-
87
- $buffered = '';
88
- StreamFilter\append($stream, function ($chunk) use (&$buffered) {
89
- $buffered .= $chunk;
90
- return '';
91
- });
92
-
93
- fwrite($stream, 'hello');
94
- fwrite($stream, 'world');
95
-
96
- fclose($stream);
97
-
98
- $this->assertEquals('hello world !', $buffered);
99
- }
100
-
101
- public function testAppendEndEventWillBeCalledOnRemove()
102
- {
103
- $stream = $this->createStream();
104
-
105
- $ended = false;
106
- $filter = StreamFilter\append($stream, function ($chunk = null) use (&$ended) {
107
- if ($chunk === null) {
108
- $ended = true;
109
- }
110
- return $chunk;
111
- }, STREAM_FILTER_WRITE);
112
-
113
- $this->assertEquals(0, $ended);
114
- StreamFilter\remove($filter);
115
- $this->assertEquals(1, $ended);
116
- }
117
-
118
- public function testAppendEndEventWillBeCalledOnClose()
119
- {
120
- $stream = $this->createStream();
121
-
122
- $ended = false;
123
- StreamFilter\append($stream, function ($chunk = null) use (&$ended) {
124
- if ($chunk === null) {
125
- $ended = true;
126
- }
127
- return $chunk;
128
- }, STREAM_FILTER_WRITE);
129
-
130
- $this->assertEquals(0, $ended);
131
- fclose($stream);
132
- $this->assertEquals(1, $ended);
133
- }
134
-
135
- public function testAppendWriteOnly()
136
- {
137
- $stream = $this->createStream();
138
-
139
- $invoked = 0;
140
-
141
- StreamFilter\append($stream, function ($chunk) use (&$invoked) {
142
- ++$invoked;
143
-
144
- return $chunk;
145
- }, STREAM_FILTER_WRITE);
146
-
147
- fwrite($stream, 'a');
148
- fwrite($stream, 'b');
149
- fwrite($stream, 'c');
150
- rewind($stream);
151
-
152
- $this->assertEquals(3, $invoked);
153
- $this->assertEquals('abc', stream_get_contents($stream));
154
-
155
- fclose($stream);
156
- }
157
-
158
- public function testAppendReadOnly()
159
- {
160
- $stream = $this->createStream();
161
-
162
- $invoked = 0;
163
-
164
- StreamFilter\append($stream, function ($chunk) use (&$invoked) {
165
- ++$invoked;
166
-
167
- return $chunk;
168
- }, STREAM_FILTER_READ);
169
-
170
- fwrite($stream, 'a');
171
- fwrite($stream, 'b');
172
- fwrite($stream, 'c');
173
- rewind($stream);
174
-
175
- $this->assertEquals(0, $invoked);
176
- $this->assertEquals('abc', stream_get_contents($stream));
177
- $this->assertEquals(1, $invoked);
178
-
179
- fclose($stream);
180
- }
181
-
182
- public function testOrderCallingAppendAfterPrepend()
183
- {
184
- $stream = $this->createStream();
185
-
186
- StreamFilter\append($stream, function ($chunk) {
187
- return '[' . $chunk . ']';
188
- }, STREAM_FILTER_WRITE);
189
-
190
- StreamFilter\prepend($stream, function ($chunk) {
191
- return '(' . $chunk . ')';
192
- }, STREAM_FILTER_WRITE);
193
-
194
- fwrite($stream, 'hello');
195
- rewind($stream);
196
-
197
- $this->assertEquals('[(hello)]', stream_get_contents($stream));
198
-
199
- fclose($stream);
200
- }
201
-
202
- public function testRemoveFilter()
203
- {
204
- $stream = $this->createStream();
205
-
206
- $first = StreamFilter\append($stream, function ($chunk) {
207
- return $chunk . '?';
208
- }, STREAM_FILTER_WRITE);
209
-
210
- StreamFilter\append($stream, function ($chunk) {
211
- return $chunk . '!';
212
- }, STREAM_FILTER_WRITE);
213
-
214
- StreamFilter\remove($first);
215
-
216
- fwrite($stream, 'hello');
217
- rewind($stream);
218
-
219
- $this->assertEquals('hello!', stream_get_contents($stream));
220
-
221
- fclose($stream);
222
- }
223
-
224
- public function testAppendFunDechunk()
225
- {
226
- if (defined('HHVM_VERSION')) $this->markTestSkipped('Not supported on HHVM (dechunk filter does not exist)');
227
-
228
- $stream = $this->createStream();
229
-
230
- StreamFilter\append($stream, StreamFilter\fun('dechunk'), STREAM_FILTER_WRITE);
231
-
232
- fwrite($stream, "2\r\nhe\r\n");
233
- fwrite($stream, "3\r\nllo\r\n");
234
- fwrite($stream, "0\r\n\r\n");
235
- rewind($stream);
236
-
237
- $this->assertEquals('hello', stream_get_contents($stream));
238
-
239
- fclose($stream);
240
- }
241
-
242
- public function testAppendThrows()
243
- {
244
- $this->createErrorHandler($errors);
245
-
246
- $stream = $this->createStream();
247
- $this->createErrorHandler($errors);
248
-
249
- StreamFilter\append($stream, function ($chunk) {
250
- throw new \DomainException($chunk);
251
- });
252
-
253
- fwrite($stream, 'test');
254
-
255
- $this->removeErrorHandler();
256
- $this->assertCount(1, $errors);
257
- $this->assertContains('test', $errors[0]);
258
- }
259
-
260
- public function testAppendThrowsDuringEnd()
261
- {
262
- $stream = $this->createStream();
263
- $this->createErrorHandler($errors);
264
-
265
- StreamFilter\append($stream, function ($chunk = null) {
266
- if ($chunk === null) {
267
- throw new \DomainException('end');
268
- }
269
- return $chunk;
270
- });
271
-
272
- fclose($stream);
273
-
274
- $this->removeErrorHandler();
275
-
276
- // We can only assert we're not seeing an exception here…
277
- // * php 5.3-5.6 sees one error here
278
- // * php 7 does not see any error here
279
- // * hhvm sees the same error twice
280
- //
281
- // If you're curious:
282
- //
283
- // var_dump($errors);
284
- // $this->assertCount(1, $errors);
285
- // $this->assertContains('end', $errors[0]);
286
- }
287
-
288
- public function testAppendThrowsShouldTriggerEnd()
289
- {
290
- $stream = $this->createStream();
291
- $this->createErrorHandler($errors);
292
-
293
- $ended = false;
294
- StreamFilter\append($stream, function ($chunk = null) use (&$ended) {
295
- if ($chunk === null) {
296
- $ended = true;
297
- return '';
298
- }
299
- throw new \DomainException($chunk);
300
- });
301
-
302
- $this->assertEquals(false, $ended);
303
- fwrite($stream, 'test');
304
- $this->assertEquals(true, $ended);
305
-
306
- $this->removeErrorHandler();
307
- $this->assertCount(1, $errors);
308
- $this->assertContains('test', $errors[0]);
309
- }
310
-
311
- public function testAppendThrowsShouldTriggerEndButIgnoreExceptionDuringEnd()
312
- {
313
- //$this->markTestIncomplete();
314
- $stream = $this->createStream();
315
- $this->createErrorHandler($errors);
316
-
317
- StreamFilter\append($stream, function ($chunk = null) {
318
- if ($chunk === null) {
319
- $chunk = 'end';
320
- //return '';
321
- }
322
- throw new \DomainException($chunk);
323
- });
324
-
325
- fwrite($stream, 'test');
326
-
327
- $this->removeErrorHandler();
328
- $this->assertCount(1, $errors);
329
- $this->assertContains('test', $errors[0]);
330
- }
331
-
332
- /**
333
- * @expectedException RuntimeException
334
- */
335
- public function testAppendInvalidStreamIsRuntimeError()
336
- {
337
- if (defined('HHVM_VERSION')) $this->markTestSkipped('Not supported on HHVM (does not reject invalid stream)');
338
- StreamFilter\append(false, function () { });
339
- }
340
-
341
- /**
342
- * @expectedException RuntimeException
343
- */
344
- public function testPrependInvalidStreamIsRuntimeError()
345
- {
346
- if (defined('HHVM_VERSION')) $this->markTestSkipped('Not supported on HHVM (does not reject invalid stream)');
347
- StreamFilter\prepend(false, function () { });
348
- }
349
-
350
- /**
351
- * @expectedException RuntimeException
352
- */
353
- public function testRemoveInvalidFilterIsRuntimeError()
354
- {
355
- if (defined('HHVM_VERSION')) $this->markTestSkipped('Not supported on HHVM (does not reject invalid filters)');
356
- StreamFilter\remove(false);
357
- }
358
-
359
- /**
360
- * @expectedException InvalidArgumentException
361
- */
362
- public function testInvalidCallbackIsInvalidArgument()
363
- {
364
- $stream = $this->createStream();
365
-
366
- StreamFilter\append($stream, 'a-b-c');
367
- }
368
-
369
- private function createStream()
370
- {
371
- return fopen('php://memory', 'r+');
372
- }
373
-
374
- private function createErrorHandler(&$errors)
375
- {
376
- $errors = array();
377
- set_error_handler(function ($_, $message) use (&$errors) {
378
- $errors []= $message;
379
- });
380
- }
381
-
382
- private function removeErrorHandler()
383
- {
384
- restore_error_handler();
385
- }
386
- }
Postman/Postman-Mail/mailgun/vendor/clue/stream-filter/tests/FunTest.php DELETED
@@ -1,44 +0,0 @@
1
- <?php
2
-
3
- use Clue\StreamFilter as Filter;
4
-
5
- class FunTest extends PHPUnit_Framework_TestCase
6
- {
7
- public function testFunInRot13()
8
- {
9
- $rot = Filter\fun('string.rot13');
10
-
11
- $this->assertEquals('grfg', $rot('test'));
12
- $this->assertEquals('test', $rot($rot('test')));
13
- $this->assertEquals(null, $rot());
14
- }
15
-
16
- public function testFunInQuotedPrintable()
17
- {
18
- $encode = Filter\fun('convert.quoted-printable-encode');
19
- $decode = Filter\fun('convert.quoted-printable-decode');
20
-
21
- $this->assertEquals('t=C3=A4st', $encode('täst'));
22
- $this->assertEquals('täst', $decode($encode('täst')));
23
- $this->assertEquals(null, $encode());
24
- }
25
-
26
- /**
27
- * @expectedException RuntimeException
28
- */
29
- public function testFunWriteAfterCloseRot13()
30
- {
31
- $rot = Filter\fun('string.rot13');
32
-
33
- $this->assertEquals(null, $rot());
34
- $rot('test');
35
- }
36
-
37
- /**
38
- * @expectedException RuntimeException
39
- */
40
- public function testFunInvalid()
41
- {
42
- Filter\fun('unknown');
43
- }
44
- }
Postman/Postman-Mail/mailgun/vendor/clue/stream-filter/tests/FunZlibTest.php DELETED
@@ -1,79 +0,0 @@
1
- <?php
2
-
3
- use Clue\StreamFilter;
4
-
5
- class BuiltInZlibTest extends PHPUnit_Framework_TestCase
6
- {
7
- public function testFunZlibDeflateHelloWorld()
8
- {
9
- $deflate = StreamFilter\fun('zlib.deflate');
10
-
11
- $data = $deflate('hello') . $deflate(' ') . $deflate('world') . $deflate();
12
-
13
- $this->assertEquals(gzdeflate('hello world'), $data);
14
- }
15
-
16
- public function testFunZlibDeflateEmpty()
17
- {
18
- if (PHP_VERSION >= 7) $this->markTestSkipped('Not supported on PHP7 (empty string does not invoke filter)');
19
-
20
- $deflate = StreamFilter\fun('zlib.deflate');
21
-
22
- //$data = gzdeflate('');
23
- $data = $deflate();
24
-
25
- $this->assertEquals("\x03\x00", $data);
26
- }
27
-
28
- public function testFunZlibDeflateBig()
29
- {
30
- $deflate = StreamFilter\fun('zlib.deflate');
31
-
32
- $n = 1000;
33
- $expected = str_repeat('hello', $n);
34
-
35
- $bytes = '';
36
- for ($i = 0; $i < $n; ++$i) {
37
- $bytes .= $deflate('hello');
38
- }
39
- $bytes .= $deflate();
40
-
41
- $this->assertEquals($expected, gzinflate($bytes));
42
- }
43
-
44
- public function testFunZlibInflateHelloWorld()
45
- {
46
- $inflate = StreamFilter\fun('zlib.inflate');
47
-
48
- $data = $inflate(gzdeflate('hello world')) . $inflate();
49
-
50
- $this->assertEquals('hello world', $data);
51
- }
52
-
53
- public function testFunZlibInflateEmpty()
54
- {
55
- $inflate = StreamFilter\fun('zlib.inflate');
56
-
57
- $data = $inflate("\x03\x00") . $inflate();
58
-
59
- $this->assertEquals('', $data);
60
- }
61
-
62
- public function testFunZlibInflateBig()
63
- {
64
- if (defined('HHVM_VERSION')) $this->markTestSkipped('Not supported on HHVM (final chunk will not be emitted)');
65
-
66
- $inflate = StreamFilter\fun('zlib.inflate');
67
-
68
- $expected = str_repeat('hello', 10);
69
- $bytes = gzdeflate($expected);
70
-
71
- $ret = '';
72
- foreach (str_split($bytes, 2) as $chunk) {
73
- $ret .= $inflate($chunk);
74
- }
75
- $ret .= $inflate();
76
-
77
- $this->assertEquals($expected, $ret);
78
- }
79
- }
Postman/Postman-Mail/mailgun/vendor/php-http/multipart-stream-builder/appveyor.yml DELETED
@@ -1,39 +0,0 @@
1
- build: false
2
- platform:
3
- - x86
4
- - x64
5
-
6
- clone_folder: c:\projects\php-http\multipart-stream-builder
7
-
8
- cache:
9
- - c:\tools\php -> appveyor.yml
10
-
11
- init:
12
- - SET PATH=c:\php;%PATH%
13
- - SET COMPOSER_NO_INTERACTION=1
14
- - SET PHP=1
15
-
16
-
17
- install:
18
- - IF EXIST c:\php (SET PHP=0) ELSE (mkdir c:\php)
19
- - cd c:\php
20
- - IF %PHP%==1 appveyor DownloadFile http://windows.php.net/downloads/releases/archives/php-7.0.0-nts-Win32-VC14-x86.zip
21
- - IF %PHP%==1 7z x php-7.0.0-nts-Win32-VC14-x86.zip -y >nul
22
- - IF %PHP%==1 del /Q *.zip
23
- - IF %PHP%==1 echo @php %%~dp0composer.phar %%* > composer.bat
24
- - IF %PHP%==1 copy /Y php.ini-development php.ini
25
- - IF %PHP%==1 echo max_execution_time=1200 >> php.ini
26
- - IF %PHP%==1 echo date.timezone="UTC" >> php.ini
27
- - IF %PHP%==1 echo extension_dir=ext >> php.ini
28
- - IF %PHP%==1 echo extension=php_openssl.dll >> php.ini
29
- - IF %PHP%==1 echo extension=php_mbstring.dll >> php.ini
30
- - IF %PHP%==1 echo extension=php_fileinfo.dll >> php.ini
31
- - appveyor DownloadFile https://getcomposer.org/composer.phar
32
- - cd c:\projects\php-http\multipart-stream-builder
33
- - mkdir %APPDATA%\Composer
34
- - composer update --prefer-dist --no-progress --ansi
35
-
36
- test_script:
37
- - cd c:\projects\php-http\multipart-stream-builder
38
- - vendor\bin\phpunit.bat --verbose
39
-
Postman/Postman-Mail/sendgrid-php-3.2.0/CHANGELOG.md DELETED
@@ -1,36 +0,0 @@
1
- # Change Log
2
- All notable changes to this project will be documented in this file.
3
- This project adheres to [Semantic Versioning](http://semver.org/).
4
-
5
- ## [v3.2.0] - (2015-05-13)
6
- ### Added
7
- - Specify Guzzle proxy via [#149](https://github.com/sendgrid/sendgrid-php/pull/149)
8
- - Option to disable exception raising
9
-
10
- ## [v3.1.0] - (2015-04-27)
11
- ### Added
12
- - Support for API keys
13
-
14
- ## [v3.0.0] - (2015-04-14)
15
- ### Fixed
16
- - CC and BCC not working with SMTPAPI To
17
-
18
- ### Changed
19
- - **Breaking:** A `\SendGrid\Exception` is now raised when response is not 200
20
- - **Breaking:** `addTo` now uses the Web API parameter as opposed to the SMTPAPI Header. Substitutions will most likely break unless you update to use `addSmtpapiTo`
21
- - The library now depends on Guzzle3
22
- - Major refactoring
23
-
24
- ### Added
25
- - **Breaking:** `send()` now returns an instance of `\SendGrid\Response`
26
- - Numerous missing methods for new functionality
27
- - `addSmtpapiTo` for using the SMTPAPI To
28
-
29
- ## [v2.2.1] - (2014-01-29)
30
- ### Fixed
31
- - Fix turn_off_ssl_verification option via [#123](https://github.com/sendgrid/sendgrid-php/pull/123)
32
-
33
- ## [v2.2.0] - (2014-01-12)
34
- ### Changed
35
- - Remove [Unirest](https://github.com/Mashape/unirest-php/) and replace with native cURL
36
- - Add CHANGELOG.md
Postman/Postman-Mail/sendgrid-php-3.2.0/MIT.LICENSE DELETED
@@ -1,15 +0,0 @@
1
- Copyright (c) 2013 SendGrid
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
4
- documentation files (the "Software"), to deal in the Software without restriction, including without limitation
5
- the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
6
- and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
7
-
8
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of
9
- the Software.
10
-
11
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
12
- THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
13
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
14
- CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
15
- DEALINGS IN THE SOFTWARE.
Postman/Postman-Mail/sendgrid-php-3.2.0/README.md DELETED
@@ -1,958 +0,0 @@
1
- # SendGrid-PHP
2
-
3
- This library allows you to quickly and easily send emails through SendGrid using PHP.
4
-
5
- WARNING: This module was recently upgraded from [2.2.x](https://github.com/sendgrid/sendgrid-php/tree/v2.2.1) to 3.X. There were API breaking changes for various method names. See [usage](https://github.com/sendgrid/sendgrid-php#usage) for up to date method names.
6
-
7
- ## PLEASE READ THIS
8
-
9
- **TLDR: If you upgrade and don't change your code appropriately, things *WILL* break.**
10
-
11
- One of the most notable changes is how `addTo()` behaves. We are now using our Web API parameters instead of the X-SMTPAPI header. What this means is that if you call `addTo()` multiple times for an email, **ONE** email will be sent with each email address visible to everyone. To utilize the original behavior of having an individual personalized email sent to each recipient you must now use `addSmtpapiTo()`. **This will break substitutions if there is more than one To address added unless you update to use `addSmtpapiTo()`.**
12
-
13
- Smtpapi addressing methods cannot be mixed with non Smtpapi addressing methods. Meaning you cannot currently use Cc and Bcc with `addSmtpapiTo()`.
14
-
15
- The `send()` method now raises a `\SendGrid\Exception` by default if the response code is not 200 and returns an instance of `\SendGrid\Response`.
16
-
17
- ---
18
-
19
- Important: This library requires PHP 5.3 or higher.
20
-
21
- [![BuildStatus](https://travis-ci.org/sendgrid/sendgrid-php.svg?branch=master)](https://travis-ci.org/sendgrid/sendgrid-php)
22
- [![Latest Stable Version](https://poser.pugx.org/sendgrid/sendgrid/version.svg)](https://packagist.org/packages/sendgrid/sendgrid)
23
-
24
- ```php
25
- $sendgrid = new SendGrid('username', 'password');
26
- $email = new SendGrid\Email();
27
- $email
28
- ->addTo('foo@bar.com')
29
- ->setFrom('me@bar.com')
30
- ->setSubject('Subject goes here')
31
- ->setText('Hello World!')
32
- ->setHtml('<strong>Hello World!</strong>')
33
- ;
34
-
35
- $sendgrid->send($email);
36
-
37
- // Or catch the error
38
-
39
- try {
40
- $sendgrid->send($email);
41
- } catch(\SendGrid\Exception $e) {
42
- echo $e->getCode();
43
- foreach($e->getErrors() as $er) {
44
- echo $er;
45
- }
46
- }
47
- ```
48
-
49
- ## Installation
50
-
51
- Add SendGrid to your `composer.json` file. If you are not using [Composer](http://getcomposer.org), you should be. It's an excellent way to manage dependencies in your PHP application.
52
-
53
- ```json
54
- {
55
- "require": {
56
- "sendgrid/sendgrid": "~3.2"
57
- }
58
- }
59
- ```
60
-
61
- Then at the top of your PHP script require the autoloader:
62
-
63
- ```bash
64
- require 'vendor/autoload.php';
65
- ```
66
-
67
- #### Alternative: Install from zip
68
-
69
- If you are not using Composer, simply download and install the **[latest packaged release of the library as a zip](https://sendgrid-open-source.s3.amazonaws.com/sendgrid-php/sendgrid-php.zip)**.
70
-
71
- [**⬇︎ Download Packaged Library ⬇︎**](https://sendgrid-open-source.s3.amazonaws.com/sendgrid-php/sendgrid-php.zip)
72
-
73
- Then require the library from package:
74
-
75
- ```php
76
- require("path/to/sendgrid-php/sendgrid-php.php");
77
- ```
78
-
79
- Previous versions of the library can be found in the [version index](https://sendgrid-open-source.s3.amazonaws.com/index.html).
80
-
81
- ## Example App
82
-
83
- There is a [sendgrid-php-example app](https://github.com/sendgrid/sendgrid-php-example) to help jumpstart your development.
84
-
85
- ## Usage
86
-
87
- To begin using this library, initialize the SendGrid object with your SendGrid credentials OR a SendGrid [API Key](https://sendgrid.com/docs/Classroom/Send/api_keys.html). API Key is the preferred method. To configure API keys, visit https://app.sendgrid.com/settings/api_keys.
88
-
89
- ```php
90
- $sendgrid = new SendGrid('username', 'password');
91
- // OR
92
- $sendgrid = new SendGrid('sendgrid api key');
93
- ```
94
-
95
- Create a new SendGrid Email object and add your message details.
96
-
97
- ```php
98
- $email = new SendGrid\Email();
99
- $email
100
- ->addTo('foo@bar.com')
101
- ->addTo('bar@foo.com')
102
- ->setFrom('me@bar.com')
103
- ->setSubject('Subject goes here')
104
- ->setText('Hello World!')
105
- ->setHtml('<strong>Hello World!</strong>')
106
- ;
107
- ```
108
-
109
- Send it.
110
-
111
- ```php
112
- $sendgrid->send($email);
113
- ```
114
-
115
- ### Exceptions
116
-
117
- A `SendGrid\Exception` is raised by default if the response is not 200 OK.
118
-
119
- To disable exceptions, pass in the `raise_exceptions => false` option when creating a `SendGrid\Client`.
120
-
121
- ```php
122
- $client = new SendGrid('SENDGRID_APIKEY', array('raise_exceptions' => false));
123
- ```
124
-
125
- ### Options
126
- Options may be passed to the library when initializing the SendGrid object:
127
-
128
- ```php
129
- $options = array(
130
- 'turn_off_ssl_verification' => false,
131
- 'protocol' => 'https',
132
- 'host' => 'api.sendgrid.com',
133
- 'endpoint' => '/api/mail.send.json',
134
- 'port' => null,
135
- 'url' => null,
136
- 'raise_exceptions' => false
137
- );
138
- $sendgrid = new SendGrid('username', 'password', $options);
139
- // OR
140
- $sendgrid = new SendGrid('sendgrid api key', $options);
141
- ```
142
-
143
- #### Changing URL
144
- You may change the URL sendgrid-php uses to send email by supplying various parameters to `options`, all parameters are optional:
145
-
146
- ```php
147
- $sendgrid = new SendGrid(
148
- 'username',
149
- 'password',
150
- array(
151
- 'protocol' => 'http',
152
- 'host' => 'sendgrid.org',
153
- 'endpoint' => '/send',
154
- 'port' => '80'
155
- )
156
- );
157
- // OR
158
- $sendgrid = new SendGrid(
159
- 'sendgrid_api_key',
160
- array(
161
- 'protocol' => 'http',
162
- 'host' => 'sendgrid.org',
163
- 'endpoint' => '/send',
164
- 'port' => '80'
165
- )
166
- );
167
- ```
168
-
169
- A full URL may also be provided:
170
-
171
- ```php
172
- $sendgrid = new SendGrid(
173
- 'username',
174
- 'password',
175
- array( 'url' => 'http://sendgrid.org:80/send')
176
- );
177
- // OR
178
- $sendgrid = new SendGrid(
179
- 'sendgrid_api_key',
180
- array( 'url' => 'http://sendgrid.org:80/send')
181
- );
182
- ```
183
-
184
- #### Ignoring SSL certificate verification
185
-
186
- You can optionally ignore verification of SSL certificate when using the Web API.
187
-
188
- ```php
189
- $sendgrid = new SendGrid(
190
- 'username',
191
- 'password',
192
- array("turn_off_ssl_verification" => true)
193
- );
194
- // OR
195
- $sendgrid = new SendGrid(
196
- 'sendgrid_api_key',
197
- array("turn_off_ssl_verification" => true)
198
- );
199
- ```
200
-
201
- #### Response ####
202
-
203
- An instance of `\SendGrid\Response` is returned from the `send()` method.
204
-
205
- ```php
206
- $email = new SendGrid\Email();
207
- $email
208
- ->addTo('foo@bar.com')
209
- ->setFrom('me@bar.com')
210
- ->setSubject('Subject goes here')
211
- ->setText('Hello World!');
212
- $res = sendgrid->send($email);
213
-
214
- var_dump($res);
215
-
216
- // Output
217
- object(SendGrid\Response)#31 (4) {
218
- ["code"]=>
219
- int(200)
220
- ["headers"]=>
221
- object(Guzzle\Http\Message\Header\HeaderCollection)#48 (1) {
222
- ["headers":protected]=>
223
- array(6) {
224
- ...
225
- ["content-type"]=>
226
- object(Guzzle\Http\Message\Header)#41 (3) {
227
- ["values":protected]=>
228
- array(1) {
229
- [0]=>
230
- string(16) "application/json"
231
- }
232
- ["header":protected]=>
233
- string(12) "Content-Type"
234
- ["glue":protected]=>
235
- string(1) ","
236
- }
237
- ...
238
- }
239
- }
240
- ["raw_body"]=>
241
- string(21) "{"message":"success"}"
242
- ["body"]=>
243
- array(1) {
244
- ["message"]=>
245
- string(7) "success"
246
- }
247
- }
248
- ```
249
-
250
- #### getCode ####
251
-
252
- Returns the status code of the response.
253
-
254
- ```
255
- $res = $sendgrid->send($email);
256
- echo $res->getCode()
257
- ```
258
-
259
- #### getHeaders ####
260
-
261
- Returns the headers of the response as a [Guzzle\Http\Message\Header\HeaderCollection object](https://docs.aws.amazon.com/aws-sdk-php/v2/api/class-Guzzle.Http.Message.Header.HeaderCollection.html).
262
-
263
- ```
264
- $res = $sendgrid->send($email);
265
- $guzzle = $res->getHeaders();
266
- echo var_dump($guzzle);
267
- ```
268
-
269
- #### getRawBody ####
270
-
271
- Returns the unparsed JSON response from SendGrid.
272
-
273
- ```
274
- $res = $sendgrid->send($email);
275
- echo $res->getRawBody()
276
- ```
277
-
278
- #### getBody ####
279
-
280
- Returns the parsed JSON from SendGrid.
281
-
282
- ```
283
- $res = $sendgrid->send($email);
284
- echo var_dump($res->getBody());
285
- ```
286
-
287
- ### Exception ###
288
-
289
- A `\SendGrid\Exception` is raised if the response code is not 200. Catching it is optional but highly recommended.
290
-
291
- ```php
292
- try {
293
- $sendgrid->send($email);
294
- } catch(\SendGrid\Exception $e) {
295
- echo $e->getCode() . "\n";
296
- foreach($e->getErrors() as $er) {
297
- echo $er;
298
- }
299
- }
300
-
301
- // Output
302
- 400
303
- Permission denied, wrong credentials
304
- ```
305
-
306
- ### SMTPAPI ###
307
-
308
- This library makes use of [sendgrid/smtpapi-php](https://github.com/sendgrid/smtpapi-php/) for all things related to the [X-SMTPAPI Header](https://sendgrid.com/docs/API_Reference/SMTP_API/index.html).
309
-
310
- ---
311
-
312
- ### Library Methods ###
313
-
314
- #### addTo
315
-
316
- You can add one or multiple TO addresses using `addTo` along with an optional TO name. Note: If using TO names, each address needs a name.
317
-
318
- ```php
319
- $email = new SendGrid\Email();
320
- $email
321
- ->addTo('foo@bar.com')
322
- ->addTo('another@another.com')
323
- ;
324
- $sendgrid->send($email);
325
-
326
- // With names
327
- $email = new SendGrid\Email();
328
- $email
329
- ->addTo('foo@bar.com', 'Frank Foo')
330
- ->addTo('another@another.com', 'Joe Bar')
331
- ;
332
- $sendgrid->send($email);
333
-
334
- // As an array
335
- $email = new SendGrid\Email();
336
- $email
337
- ->addTo(array('foo@bar.com', 'bar@example'), array('Frank Foo', 'Brian Bar'))
338
- ;
339
- $sendgrid->send($email);
340
- ```
341
-
342
- #### addSmtpapiTo
343
-
344
- Add a TO address to the smtpapi header along with an optional name.
345
-
346
- ```php
347
- $email = new SendGrid\Email();
348
- $email
349
- ->addSmtpapiTo('foo@bar.com')
350
- ->addSmtpapiTo('another@another.com', 'Mike Bar')
351
- ;
352
- $sendgrid->send($email);
353
- ```
354
-
355
- #### setTos
356
-
357
- If you prefer, you can add multiple TO addresses as an array using the `setTos` method. This will unset any previous `addTo`s you appended.
358
-
359
- ```php
360
- $email = new SendGrid\Email();
361
- $emails = array("foo@bar.com", "another@another.com", "other@other.com");
362
- $email->setTos($emails);
363
- $sendgrid->send($email);
364
- ```
365
-
366
- #### setSmtpapiTos
367
-
368
- ```php
369
- $email = new SendGrid\Email();
370
- $emails = array("foo@bar.com", "Brian Bar <bar@example.com>", "other@example.com");
371
- $email->setSmtpapiTos($emails);
372
- $sendgrid->send($email);
373
- ```
374
-
375
- #### setFrom
376
-
377
- ```php
378
- $email = new SendGrid\Email();
379
- $email->setFrom('foo@bar.com');
380
- $sendgrid->send($email);
381
- ```
382
-
383
- #### setFromName
384
-
385
- ```php
386
- $email = new SendGrid\Email();
387
- $email
388
- ->setFrom('foo@bar.com')
389
- ->setFromName('Foo Bar')
390
- ;
391
- $sendgrid->send($email);
392
- ```
393
-
394
- #### setReplyTo
395
-
396
- ```php
397
- $email = new SendGrid\Email();
398
- $email
399
- ->addTo('foo@bar.com')
400
- ->setReplyTo('someone.else@example.com')
401
- ->setFromName('John Doe')
402
- ...
403
- ;
404
- ```
405
-
406
- ### Cc
407
-
408
- #### addCc
409
-
410
- ```php
411
- $email = new SendGrid\Email();
412
- $email->addCc('foo@bar.com');
413
- $sendgrid->send($email);
414
- ```
415
-
416
- #### setCc
417
-
418
- ```php
419
- $email = new SendGrid\Email();
420
- $email->setCc('foo@bar.com');
421
- $sendgrid->send($email);
422
- ```
423
-
424
- #### setCcs
425
-
426
- ```php
427
- $email = new SendGrid\Email();
428
- $emails = array("foo@bar.com", "another@another.com", "other@other.com");
429
- $email->setCcs($emails);
430
- $sendgrid->send($email);
431
- ```
432
-
433
- #### removeCc
434
-
435
- ```php
436
- $email->removeCc('foo@bar.com');
437
- ```
438
-
439
- ### Bcc
440
-
441
- Use multiple `addSmtpapiTo`s as a superior alternative to `setBcc`.
442
-
443
- ```php
444
- $email = new SendGrid\Email();
445
- $email
446
- ->addSmtpapiTo('foo@bar.com')
447
- ->addSmtpapiTo('someotheraddress@bar.com')
448
- ->addSmtpapiTo('another@another.com')
449
- ...
450
- ;
451
- ```
452
-
453
- But if you do still have a need for Bcc you can do the following:
454
-
455
- #### addBcc
456
-
457
- ```php
458
- $email = new SendGrid\Email();
459
- $email->addTo('bar@example.com');
460
- $email->addBcc('foo@bar.com');
461
- $sendgrid->send($email);
462
- ```
463
-
464
- #### setBcc
465
-
466
- ```php
467
- $email = new SendGrid\Email();
468
- $email->setBcc('foo@bar.com');
469
- $sendgrid->send($email);
470
- ```
471
-
472
- #### setBccs
473
-
474
- ```php
475
- $email = new SendGrid\Email();
476
- $emails = array("foo@bar.com", "another@another.com", "other@other.com");
477
- $email->setBccs($emails);
478
- $sendgrid->send($email);
479
- ```
480
-
481
- #### removeBcc
482
-
483
- ```php
484
- $email->removeBcc('foo@bar.com');
485
- ```
486
-
487
- **Important Gotcha**: Using multiple `addSmtpapiTo`s is recommended over bcc whenever possible. Each user will receive their own personalized email with that setup, and only see their own email.
488
-
489
- Standard `setBcc` will hide who the email is addressed to. If you use multiple `addSmtpapiTo`'s, each user will receive a personalized email showing *only* their email. This is more friendly and more personal.
490
-
491
- #### setSubject
492
-
493
- ```php
494
- $email = new SendGrid\Email();
495
- $email->setSubject('This is a subject');
496
- $sendgrid->send($email);
497
- ```
498
-
499
- #### setText
500
-
501
- ```php
502
- $email = new SendGrid\Email();
503
- $email->setText('This is some text');
504
- $sendgrid->send($email);
505
- ```
506
-
507
- #### setHtml
508
-
509
- ```php
510
- $email = new SendGrid\Email();
511
- $email->setHtml('<h1>This is an html email</h1>');
512
- $sendgrid->send($email);
513
- ```
514
-
515
- #### setDate
516
-
517
- ```php
518
- $email = new SendGrid\Email();
519
- $email->setDate('Wed, 17 Dec 2014 19:21:16 +0000');
520
- $sendgrid->send($email);
521
- ```
522
-
523
- #### setSendAt
524
-
525
- ```php
526
- $email = new SendGrid\Email();
527
- $email->setSendAt(1409348513);
528
- $sendgrid->send($email);
529
- ```
530
-
531
- #### setSendEachAt
532
-
533
- ```php
534
- $email = new SendGrid\Email();
535
- $email->setSendEachAt(array(1409348513, 1409348514, 1409348515));
536
- $sendgrid->send($email);
537
- ```
538
-
539
- #### addSendEachAt
540
-
541
- ```php
542
- $email = new SendGrid\Email();
543
- $email
544
- ->addSendEachAt(1409348513)
545
- ->addSendEachAt(1409348514)
546
- ->addSendEachAt(1409348515)
547
- ;
548
- $sendgrid->send($email);
549
- ```
550
-
551
- ### Categories ###
552
-
553
- Categories are used to group email statistics provided by SendGrid.
554
-
555
- To use a category, simply set the category name. Note: there is a maximum of 10 categories per email.
556
-
557
- #### addCategory
558
-
559
- ```php
560
- $email = new SendGrid\Email();
561
- $email
562
- ->addTo('foo@bar.com')
563
- ...
564
- ->addCategory("Category 1")
565
- ->addCategory("Category 2")
566
- ;
567
- ```
568
-
569
- #### setCategory
570
-
571
- ```php
572
- $email = new SendGrid\Email();
573
- $email
574
- ->addTo('foo@bar.com')
575
- ...
576
- ->setCategory("Category 1")
577
- ;
578
- ```
579
-
580
- #### setCategories
581
-
582
- ```php
583
- $email = new SendGrid\Email();
584
- $categories = array("Category 1", "Category 2", "Category 3");
585
- $email->setCategories($categories);
586
- ```
587
-
588
- #### removeCategory
589
-
590
- ```php
591
- $email = new SendGrid\Email();
592
- $email
593
- ->addTo('foo@bar.com')
594
- ...
595
- ->removeCategory("Category 1")
596
- ;
597
- ```
598
-
599
- ### Attachments ###
600
-
601
- Attachments are currently file based only, with future plans for an in memory implementation as well.
602
-
603
- File attachments are limited to 7 MB per file.
604
-
605
- #### addAttachment
606
-
607
- ```php
608
- $email = new SendGrid\Email();
609
- $email
610
- ->addTo('foo@bar.com')
611
- ...
612
- ->addAttachment("../path/to/file.txt")
613
- ;
614
- ```
615
-
616
- #### setAttachment
617
-
618
- ```php
619
- $email = new SendGrid\Email();
620
- $email
621
- ->addTo('foo@bar.com')
622
- ...
623
- ->setAttachment("../path/to/file.txt")
624
- ;
625
- ```
626
-
627
- #### setAttachments
628
-
629
- ```php
630
- $email = new SendGrid\Email();
631
- $attachments = array("../path/to/file1.txt", "../path/to/file2.txt");
632
- $email
633
- ->addTo('foo@bar.com')
634
- ...
635
- ->setAttachments($attachments)
636
- ;
637
- ```
638
-
639
- #### removeAttachment
640
-
641
- ```php
642
- $email = new SendGrid\Email();
643
- $email
644
- ->addTo('foo@bar.com')
645
- ...
646
- ->addAttachment("../path/to/file.txt")
647
- ->removeAttachment("../path/to/file.txt")
648
- ;
649
- ```
650
-
651
- You can tag files for use as inline HTML content. It will mark the file for inline disposition using the specified "cid".
652
-
653
- ```php
654
- $email = new SendGrid\Email();
655
- $email
656
- ->addTo('foo@bar.com')
657
- ->setHtml('<div>Our logo:<img src="cid:file-cid"></div>')
658
- ->addAttachment("../path/to/file.png", "super_file.png", "file-cid")
659
- ;
660
- ```
661
-
662
- ### Substitutions ###
663
-
664
- Substitutions can be used to customize multi-recipient emails, and tailor them for the user.
665
-
666
- Unless you are only sending to one recipient, please make sure to use `addSmtpapiTo()`.
667
-
668
- #### addSubstitution
669
-
670
- ```php
671
- $email = new SendGrid\Email();
672
- $email
673
- ->addSmtpapiTo('john@somewhere.com')
674
- ->addSmtpapiTo('harry@somewhere.com')
675
- ->addSmtpapiTo('Bob@somewhere.com')
676
- ...
677
- ->setHtml("Hey %name%, we've seen that you've been gone for a while")
678
- ->addSubstitution('%name%', array('John', 'Harry', 'Bob'))
679
- ;
680
- ```
681
-
682
- Substitutions can also be used to customize multi-recipient subjects.
683
-
684
- ```php
685
- $email = new SendGrid\Email();
686
- $email
687
- ->addSmtpapiTo(array('john@somewhere.com', 'harry@somewhere.com', 'bob@somewhere.com'))
688
- ->setSubject('%subject%')
689
- ->addSubstitution(
690
- '%subject%',
691
- array('Subject to John', 'Subject to Harry', 'Subject to Bob')
692
- )
693
- ...
694
- ;
695
- ```
696
-
697
- #### setSubstitutions
698
-
699
- ```php
700
- $email = new SendGrid\Email();
701
- $email
702
- ->addSmtpapiTo(array('john@somewhere.com', 'harry@somewhere.com', 'bob@somewhere.com'))
703
- ->setSubject('%subject%')
704
- ->setSubstitutions(array(
705
- '%name%' => array('John', 'Harry', 'Bob'),
706
- '%subject%' => array('Subject to John', 'Subject to Harry', 'Subject to Bob')
707
- ))
708
- ...
709
- ;
710
- ```
711
-
712
- ### Sections ###
713
-
714
- Sections can be used to further customize messages for the end users. A section is only useful in conjunction with a substitution value.
715
-
716
- #### addSection
717
-
718
- ```php
719
- $email = new SendGrid\Email();
720
- $email
721
- ->addSmtpapiTo('john@somewhere.com')
722
- ->addSmtpapiTo("harry@somewhere.com")
723
- ->addSmtpapiTo("Bob@somewhere.com")
724
- ...
725
- ->setHtml("Hey %name%, you work at %place%")
726
- ->addSubstitution("%name%", array("John", "Harry", "Bob"))
727
- ->addSubstitution("%place%", array("%office%", "%office%", "%home%"))
728
- ->addSection("%office%", "an office")
729
- ->addSection("%home%", "your house")
730
- ;
731
- ```
732
-
733
- #### setSections
734
-
735
- ```php
736
- $email = new SendGrid\Email();
737
- $email
738
- ->addSmtpapiTo('john@somewhere.com')
739
- ->addSmtpapiTo("harry@somewhere.com")
740
- ->addSmtpapiTo("Bob@somewhere.com")
741
- ...
742
- ->setHtml("Hey %name%, you work at %place%")
743
- ->addSubstitution("%name%", array("John", "Harry", "Bob"))
744
- ->addSubstitution("%place%", array("%office%", "%office%", "%home%"))
745
- ->setSections(array("%office%" => "an office", "%home%" => "your house"))
746
- ;
747
- ```
748
-
749
- ### Unique Arguments ###
750
-
751
- [Unique Arguments](https://sendgrid.com/docs/API_Reference/SMTP_API/unique_arguments.html) are used for tracking purposes.
752
-
753
- #### addUniqueArg / addUniqueArgument
754
-
755
- ```php
756
- $email = new SendGrid\Email();
757
- $email
758
- ->addTo('foo@bar.com')
759
- ...
760
- ->addUniqueArg("Customer", "Someone")
761
- ->addUniqueArg("location", "Somewhere")
762
- ;
763
- ```
764
-
765
- #### setUniqueArgs / setUniqueArguments
766
-
767
- ```php
768
- $email = new SendGrid\Email();
769
- $email
770
- ->addTo('foo@bar.com')
771
- ...
772
- ->setUniqueArgs(array('cow' => 'chicken'))
773
- ;
774
- ```
775
-
776
- ### Filter Settings ###
777
-
778
- [Filter Settings](https://sendgrid.com/docs/API_Reference/SMTP_API/apps.html) are used to enable and disable apps, and to pass parameters to those apps.
779
-
780
- #### addFilter / addFilterSetting
781
-
782
- ```php
783
- $email = new SendGrid\Email();
784
- $email
785
- ->addTo('foo@bar.com')
786
- ...
787
- addFilter("gravatar", "enable", 1)
788
- ->addFilter("footer", "enable", 1)
789
- ->addFilter("footer", "text/plain", "Here is a plain text footer")
790
- ->addFilter(
791
- "footer",
792
- "text/html",
793
- "<p style='color:red;'>Here is an HTML footer</p>"
794
- )
795
- ;
796
- ```
797
-
798
- #### setFilters / setFilterSettings
799
-
800
- ```php
801
- $email = new SendGrid\Email();
802
- $email
803
- ->addTo('foo@bar.com')
804
- ...
805
- setFilters(array("gravatar" => array("settings" => array("enable" => 1))))
806
- ;
807
- ```
808
-
809
- ### Templates ###
810
-
811
- You can easily use SendGrid's [template engine](https://sendgrid.com/docs/User_Guide/Apps/template_engine.html) by applying filters.
812
-
813
- #### setTemplateId
814
-
815
- ```php
816
- $email = new SendGrid\Email();
817
- $email
818
- ->addTo('someone@example.com')
819
- ->setFrom('support@example.com')
820
- ->setFromName('Support')
821
- ->setSubject('Subject goes here')
822
- // set html or text to an empty space (see http://git.io/hCNy)
823
- ->setHtml(' ') // <-- triggers the html version of the template
824
- // AND / OR
825
- ->setText(' ') // <-- triggers the plaintext version of the template
826
- ->setTemplateId($templateId);
827
- ```
828
-
829
- This is simply a convenience method for:
830
-
831
- ```php
832
- $email = new SendGrid\Email();
833
- $email
834
- ->addFilter('templates', 'enabled', 1)
835
- ->addFilter('templates', 'template_id', $templateId)
836
- ;
837
- ```
838
-
839
- ### Advanced Suppression Manager ###
840
-
841
- [ASM](https://sendgrid.com/docs/User_Guide/advanced_suppression_manager.html) is used to handle suppression groups.
842
-
843
- #### setAsmGroupId ####
844
-
845
- ```php
846
- $email = new SendGrid\Email();
847
- $email->setAsmGroupId('my_group_id');
848
- ```
849
-
850
- ### Headers ###
851
-
852
- You can add standard email message headers as necessary.
853
-
854
- #### addHeader
855
-
856
- ```php
857
- $email = new SendGrid\Email();
858
- $email
859
- ->addTo('foo@bar.com')
860
- ...
861
- ->addHeader('X-Sent-Using', 'SendGrid-API')
862
- ->addHeader('X-Transport', 'web')
863
- ;
864
- ```
865
-
866
- #### setHeaders
867
-
868
- ```php
869
- $email = new SendGrid\Email();
870
- $email
871
- ->addTo('foo@bar.com')
872
- ...
873
- ->setHeaders(array('X-Sent-Using' => 'SendGrid-API', 'X-Transport' => 'web'))
874
- ;
875
- ```
876
-
877
- #### removeHeader
878
-
879
- ```php
880
- $email = new SendGrid\Email();
881
- $email
882
- ->addTo('foo@bar.com')
883
- ...
884
- ->addHeader('X-Sent-Using', 'SendGrid-API')
885
- ->addHeader('X-Transport', 'web')
886
- ;
887
- $email->removeHeader('X-Transport');
888
- ```
889
-
890
- ### Sending to 1,000s of emails in one batch
891
-
892
- Sometimes you might want to send 1,000s of emails in one request. You can do that. It is recommended you break each batch up in 1,000 increments. So if you need to send to 5,000 emails, then you'd break this into a loop of 1,000 emails at a time.
893
-
894
- ```php
895
- $sendgrid = new SendGrid(SENDGRID_USERNAME, SENDGRID_PASSWORD);
896
- // OR
897
- $sendgrid = new SendGrid(SENDGRID_APIKEY);
898
- $email = new SendGrid\Email();
899
-
900
- $recipients = array(
901
- "alpha@mailinator.com",
902
- "beta@mailinator.com",
903
- "zeta@mailinator.com"
904
- );
905
- $names = array("Alpha", "Beta", "Zeta");
906
-
907
- $email
908
- ->setFrom("from@mailinator.com")
909
- ->setSubject('[sendgrid-php-batch-email]')
910
- ->setSmtpapiTos($recipients)
911
- ->addSubstitution("%name%", $names)
912
- ->setText("Hey %name%, we have an email for you")
913
- ->setHtml("<h1>Hey %name%, we have an email for you</h1>")
914
- ;
915
-
916
- $result = $sendgrid->send($email);
917
- ```
918
-
919
- ## Contributing
920
-
921
- 1. Fork it
922
- 2. Create your feature branch (`git checkout -b my-new-feature`)
923
- 3. Commit your changes (`git commit -am 'Added some feature'`)
924
- 4. Push to the branch (`git push origin my-new-feature`)
925
- 5. Create new Pull Request
926
-
927
- ## Running Tests
928
-
929
- The existing tests in the `test` directory can be run using [PHPUnit](https://github.com/sebastianbergmann/phpunit/) with the following command:
930
-
931
- ````bash
932
- composer update --dev
933
- cd test
934
- ../vendor/bin/phpunit
935
- ```
936
-
937
- or if you already have PHPUnit installed globally.
938
-
939
- ```bash
940
- cd test
941
- phpunit
942
- ```
943
-
944
- ## Releasing
945
-
946
- To release a new version of this library, update the version in all locations, tag the version, and then push the tag up. Packagist.org takes care of the rest.
947
-
948
- #### Testing uploading to Amazon S3
949
-
950
- If you want to test uploading the zipped file to Amazon S3 (SendGrid employees only), do the following.
951
-
952
- ```
953
- export S3_SIGNATURE="secret_signature"
954
- export S3_POLICY="secret_policy"
955
- export S3_BUCKET="sendgrid-open-source"
956
- export S3_ACCESS_KEY="secret_access_key"
957
- ./scripts/s3upload.sh
958
- ```
Postman/Postman-Mail/sendgrid-php-3.2.0/lib/SendGrid.php DELETED
@@ -1,156 +0,0 @@
1
- <?php
2
-
3
- class SendGrid
4
- {
5
- const VERSION = '3.2.0';
6
-
7
- protected
8
- $namespace = 'SendGrid',
9
- $headers = array('Content-Type' => 'application/json'),
10
- $client,
11
- $options;
12
-
13
- public
14
- $apiUser,
15
- $apiKey,
16
- $url,
17
- $endpoint,
18
- $version = self::VERSION;
19
-
20
- public function __construct($apiUserOrKey, $apiKeyOrOptions = null, $options = array())
21
- {
22
- // Check if given a username + password or api key
23
- if (is_string($apiKeyOrOptions)) {
24
- // Username and password
25
- $this->apiUser = $apiUserOrKey;
26
- $this->apiKey = $apiKeyOrOptions;
27
- $this->options = $options;
28
- } elseif (is_array($apiKeyOrOptions) || $apiKeyOrOptions === null) {
29
- // API key
30
- $this->apiKey = $apiUserOrKey;
31
- $this->apiUser = null;
32
-
33
- // With options
34
- if (is_array($apiKeyOrOptions)) {
35
- $this->options = $apiKeyOrOptions;
36
- }
37
- } else {
38
- // Won't be thrown?
39
- throw new InvalidArgumentException('Need a username + password or api key!');
40
- }
41
-
42
- $this->options['turn_off_ssl_verification'] = (isset($this->options['turn_off_ssl_verification']) && $this->options['turn_off_ssl_verification'] == true);
43
- if (!isset($this->options['raise_exceptions'])) {
44
- $this->options['raise_exceptions'] = true;
45
- }
46
- $protocol = isset($this->options['protocol']) ? $this->options['protocol'] : 'https';
47
- $host = isset($this->options['host']) ? $this->options['host'] : 'api.sendgrid.com';
48
- $port = isset($this->options['port']) ? $this->options['port'] : '';
49
-
50
- $this->url = isset($this->options['url']) ? $this->options['url'] : $protocol . '://' . $host . ($port ? ':' . $port : '');
51
- $this->endpoint = isset($this->options['endpoint']) ? $this->options['endpoint'] : '/api/mail.send.json';
52
-
53
- $this->client = $this->prepareHttpClient();
54
- }
55
-
56
- /**
57
- * Prepares the HTTP client
58
- *
59
- *