Commit inicial - WordPress Análisis de Precios Unitarios

- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
root
2025-11-03 21:04:30 -06:00
commit a22573bf0b
24068 changed files with 4993111 additions and 0 deletions

View File

@@ -0,0 +1,360 @@
<?php
namespace FluentMail\App\Services\Mailer\Providers\ElasticMail;
use FluentMail\Includes\Support\Arr;
use FluentMail\App\Services\Mailer\BaseHandler;
class Handler extends BaseHandler
{
use ValidatorTrait;
protected $boundary = '';
protected $postbody = [];
protected $url = 'https://api.elasticemail.com/v2/';
public function send()
{
if ($this->preSend()) {
return $this->postSend();
}
return $this->handleResponse(new \WP_Error(422, __('Something went wrong!', 'fluent-smtp'), []));
}
public function postSend()
{
$this->boundary = hash('sha256', uniqid('', true));
$this->postbody = [];
$replyTo = $this->getReplyTo();
$postData = [
'subject' => $this->getSubject(),
'from' => $this->getParam('sender_email'),
'fromName' => $this->getParam('sender_name'),
'replyTo' => Arr::get($replyTo, 'email'),
'replyToName' => Arr::get($replyTo, 'name'),
'msgTo' => $this->getToFormatted(),
'msgCC' => $this->getCcFormatted(), // with ; separated or null
'msgBcc' => $this->getBccFormatted(), // with ; separated or null
'bodyHtml' => '',
'bodyText' => '',
'charset' => $this->phpMailer->CharSet,
'encodingType' => 0,
'isTransactional' => ($this->getSetting('mail_type') == 'transactional') ? true : false
];
if ($this->phpMailer->ContentType == 'text/html') {
$postData['bodyHtml'] = $this->getBody();
} else if ($this->phpMailer->ContentType == 'multipart/alternative') {
$postData['bodyHtml'] = $this->getBody();
$postData['bodyText'] = $this->phpMailer->AltBody;
} else {
$postData['bodyText'] = $this->getBody();
}
foreach ($this->getParam('custom_headers') as $header) {
$key = trim($header['key']);
$postData['headers_' . $key] = $key . ': ' . trim($header['value']);
}
$this->parseAllPostData($postData);
$this->setAttachments();
$this->postbody[] = '--' . $this->boundary . '--';
$actualData = implode('', $this->postbody);
try {
$response = wp_remote_post($this->url . 'email/send?apikey=' . $this->getSetting('api_key'), array(
'method' => 'POST',
'headers' => array(
'content-type' => 'multipart/form-data; boundary=' . $this->boundary
),
'body' => $actualData
)
);
if (is_wp_error($response)) {
$returnResponse = new \WP_Error($response->get_error_code(), $response->get_error_message(), $response->get_error_messages());
} else {
$responseBody = wp_remote_retrieve_body($response);
$responseBody = \json_decode($responseBody, true);
if (!$responseBody['success']) {
$returnResponse = new \WP_Error('api_error', $responseBody['error'], $responseBody);
} else {
$returnResponse = [
'code' => 200,
'message' => $responseBody
];
}
}
} catch (\Exception $exception) {
$returnResponse = new \WP_Error($exception->getCode(), $exception->getMessage(), []);
}
$this->response = $returnResponse;
return $this->handleResponse($this->response);
}
protected function parseAllPostData($data)
{
foreach ($data as $key => $item) {
if (empty($item)) {
continue;
}
if (is_array($item)) {
$this->parseAllPostData($item);
} else {
$this->postbody[] = '--' . $this->boundary . "\r\n" . 'Content-Disposition: form-data; name=' . $key . "\r\n\r\n" . $item . "\r\n";
}
}
}
protected function getFrom()
{
$from = [
'email' => $this->getParam('sender_email')
];
if ($name = $this->getParam('sender_name')) {
$from['name'] = $name;
}
return $from;
}
protected function getReplyTo()
{
if ($replyTo = $this->getParam('headers.reply-to')) {
return reset($replyTo);
}
return [
'name' => '',
'email' => ''
];
}
protected function getRecipients()
{
$recipients = [
'to' => $this->getTo(),
'cc' => $this->getCarbonCopy(),
'bcc' => $this->getBlindCarbonCopy(),
];
$recipients = array_filter($recipients);
foreach ($recipients as $key => $recipient) {
$array = array_map(function ($recipient) {
return isset($recipient['name'])
? $recipient['name'] . ' <' . $recipient['email'] . '>'
: $recipient['email'];
}, $recipient);
$this->attributes['formatted'][$key] = implode(', ', $array);
}
return [$recipients];
}
protected function getCcFormatted()
{
$ccs = $this->getCarbonCopy();
if (!$ccs) {
return null;
}
$ccs = array_filter($ccs);
$toFormatted = [];
foreach ($ccs as $toEmail) {
if (!empty($toEmail['name'])) {
$string = $toEmail['name'] . ' <' . $toEmail['email'] . '>';
} else {
$string = $toEmail['email'];
}
$toFormatted[] = $string;
}
$toFormatted = array_filter($toFormatted);
return implode(';', $toFormatted);
}
protected function getBccFormatted()
{
$ccs = $this->getBlindCarbonCopy();
if (!$ccs) {
return null;
}
$ccs = array_filter($ccs);
$toFormatted = [];
foreach ($ccs as $toEmail) {
if (!empty($toEmail['name'])) {
$string = $toEmail['name'] . ' <' . $toEmail['email'] . '>';
} else {
$string = $toEmail['email'];
}
$toFormatted[] = $string;
}
$toFormatted = array_filter($toFormatted);
return implode(';', $toFormatted);
}
protected function getToFormatted()
{
$to = $this->getParam('to');
$toFormatted = [];
foreach ($to as $toEmail) {
if (!empty($toEmail['name'])) {
$string = $toEmail['name'] . ' <' . $toEmail['email'] . '>';
} else {
$string = $toEmail['email'];
}
$toFormatted[] = $string;
}
$toFormatted = array_filter($toFormatted);
return implode(';', $toFormatted);
}
protected function getCarbonCopy()
{
return $this->getParam('headers.cc');
}
protected function getBlindCarbonCopy()
{
return $this->getParam('headers.bcc');
}
protected function getBody()
{
return $this->getParam('message');
}
protected function setAttachments()
{
$rawAttachments = $this->getParam('attachments');
if (empty($rawAttachments) === true) {
return false;
}
foreach ($rawAttachments as $i => $attpath) {
if (empty($attpath) === true) {
continue;
}
if (!is_readable($attpath[0]) || !is_file($attpath[0])) {
continue;
}
//Extracting the file name
$filenameonly = explode(DIRECTORY_SEPARATOR, $attpath[0]);
$fname = end($filenameonly);
$mimeType = 'application/octet-stream'; // Default
if (function_exists('mime_content_type')) {
$detectedMime = mime_content_type($attpath[0]);
if ($detectedMime !== false) {
$mimeType = $detectedMime;
}
} elseif (function_exists('finfo_file')) {
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$detectedMime = finfo_file($finfo, $attpath[0]);
finfo_close($finfo);
if ($detectedMime !== false) {
$mimeType = $detectedMime;
}
}
// Add boundary and headers for attachment
$this->postbody[] = '--' . $this->boundary . "\r\n";
$this->postbody[] = 'Content-Disposition: form-data; name="attachments' . ($i + 1) . '"; filename="' . $fname . '"' . "\r\n";
$this->postbody[] = 'Content-Type: ' . $mimeType . "\r\n";
$this->postbody[] = "\r\n";
$handle = fopen($attpath[0], "rb");
if ($handle) {
$fileContent = '';
while (($buffer = fread($handle, 8192)) !== false && $buffer !== '') {
$fileContent .= $buffer;
}
fclose($handle);
$this->postbody[] = $fileContent . "\r\n";
}
}
}
protected function getCustomEmailHeaders()
{
return [];
}
protected function getRequestHeaders()
{
return [
'Content-Type' => 'application/json',
'X-ElasticEmail-ApiKey' => $this->getSetting('api_key')
];
}
public function setSettings($settings)
{
if ($settings['key_store'] == 'wp_config') {
$settings['api_key'] = defined('FLUENTMAIL_ELASTICMAIL_API_KEY') ? FLUENTMAIL_ELASTICMAIL_API_KEY : '';
}
$this->settings = $settings;
return $this;
}
public function checkConnection($connection)
{
$this->setSettings($connection);
$request = wp_remote_get($this->url . 'account/profileoverview', [
'body' => [
'apikey' => $this->getSetting('api_key')
]
]);
if (is_wp_error($request)) {
$this->throwValidationException([
'api_key' => [
'required' => $request->get_error_message()
]
]);
}
$response = json_decode(wp_remote_retrieve_body($request), true);
if (!$response || empty($response['success'])) {
$error = 'API Key is invalid';
if (!empty($response['error'])) {
$error = $response['error'];
}
$this->throwValidationException([
'api_key' => [
'required' => $error
]
]);
}
return true;
}
}