1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
usersenderdataprovider.php
См. документацию.
1<?php
2
4
13
15{
16 public const SENDER_TYPE = 'sender';
17 public const ALIAS_TYPE = 'alias';
18 public const MAILBOX_SENDER_TYPE = 'mailboxSender';
19 public const MAILBOX_TYPE = 'mailbox';
20
24 public static function getUserAvailableSenders(?int $userId = null): array
25 {
26 $isAdmin = false;
27 if (!($userId > 0))
28 {
29 $currentUser = Main\Engine\CurrentUser::get();
30 $userId = (int)$currentUser->getId();
31 $isAdmin = self::isAdmin();
32 }
33
34 if (!$userId)
35 {
36 return [];
37 }
38
39 $senders = [];
40
41 $userFormattedName = self::getUserFormattedName($userId);
42
43 $sendersList = SenderTable::query()
44 ->setSelect(['ID', 'NAME', 'EMAIL', 'USER_ID', 'OPTIONS'])
45 ->where('IS_CONFIRMED')
46 ->where(Query::filter()
47 ->logic('or')
48 ->where('USER_ID', $userId)
49 ->where('IS_PUBLIC', true)
50 )
51 ->where('PARENT_MODULE_ID', 'main')
52 ->fetchAll()
53 ;
54
55 $emailsWithSmtpSenders = [];
56 $availableSmtpSenders = [];
57 $emailsWithoutSmtpSenders = [];
58 foreach ($sendersList as $sender)
59 {
60 $sender['USER_ID'] = (int)$sender['USER_ID'];
61 if (in_array($sender['EMAIL'], $emailsWithoutSmtpSenders, true))
62 {
63 continue;
64 }
65
66 if (
67 !in_array($sender['EMAIL'], $availableSmtpSenders, true)
68 && !in_array($sender['EMAIL'], $emailsWithSmtpSenders, true)
69 )
70 {
71 //excluded emails senders for box, the list of senders contains senders with smtp and mail addresses without smtp senders
72 if (Sender::hasUserAvailableSmtpSenderByEmail($sender['EMAIL'], $userId))
73 {
74 $availableSmtpSenders[] = $sender['EMAIL'];
75 }
76 else
77 {
78 $emailsWithoutSmtpSenders[] = $sender['EMAIL'];
79
80 continue;
81 }
82 }
83
84 if (
85 $userId !== $sender['USER_ID']
86 && self::getUserFormattedName($sender['USER_ID']) === $sender['NAME']
87 )
88 {
89 $sender['NAME'] = $userFormattedName ?? $sender['NAME'];
90 }
91 else
92 {
93 $sender['NAME'] = trim($sender['NAME']) ?: $userFormattedName;
94 }
95
96 $sender['EMAIL'] = mb_strtolower($sender['EMAIL']);
97
98 $senders[] = [
99 'id' => (int)$sender['ID'],
100 'name' => $sender['NAME'],
101 'email' => $sender['EMAIL'],
102 'can_delete' => $sender['USER_ID'] === $userId || $isAdmin,
103 'type' => !empty($sender['OPTIONS']['smtp']) ? self::SENDER_TYPE : self::ALIAS_TYPE,
104 'showEditHint' => false,
105 ];
106
107 //excluded emails senders for box, the list of senders contains senders with smtp and mail addresses without smtp senders
108 if (
109 !in_array($sender['EMAIL'], $emailsWithSmtpSenders, true)
110 && !empty($sender['OPTIONS']['smtp'])
111 )
112 {
113 $emailsWithSmtpSenders[] = $sender['EMAIL'];
114 }
115 }
116
117 $senders = array_merge(
118 self::getUserAvailableMailboxSenders(
119 getMailboxesWithoutSmtp: true,
120 userId: $userId,
121 ),
122 $senders,
123 );
124
125 //leaves only senders with unique names
126 $uniqueSenders = [];
127 $uniqueSenderNames = [];
128 foreach ($senders as $key => $sender)
129 {
130 $senders[$key]['formated'] = "{$sender['name']} <{$sender['email']}>";
131 if (in_array($senders[$key]['formated'], $uniqueSenderNames, true))
132 {
133 continue;
134 }
135
136 $uniqueSenderNames[] = $senders[$key]['formated'];
137 $uniqueSenders[] = $senders[$key];
138 }
139
140 return $uniqueSenders;
141 }
142
146 public static function getUserAvailableSendersByEmail(string $email, int $userId = null): ?array
147 {
148 $isAdmin = false;
149 if (!$userId)
150 {
151 $userId = (int)Main\Engine\CurrentUser::get()->getId();
152 $isAdmin = self::isAdmin();
153 }
154
155 $senders = [];
156 $mailboxSenders = self::getUserAvailableMailboxSenders(
157 email: $email,
158 userId: $userId,
159 );
160
161 $senderListQuery = SenderTable::query()
162 ->setSelect(['*'])
163 ->where('IS_CONFIRMED')
164 ->where('EMAIL', $email)
165 ->where(Query::filter()
166 ->logic('or')
167 ->where('USER_ID', $userId)
168 ->where('IS_PUBLIC', true)
169 )
170 ;
171
172 if (Loader::includeModule('mail'))
173 {
174 $senderListQuery->where('PARENT_MODULE_ID', 'main');
175 }
176
177 $userFormattedName = self::getUserFormattedName($userId);
178 $senderList = $senderListQuery->fetchAll();
179 $userData = [];
180 foreach ($senderList as $sender)
181 {
182 $ownerId = (int)$sender['USER_ID'];
183 if (!empty($sender['OPTIONS']['smtp']['server']))
184 {
185 $type = self::SENDER_TYPE;
186 }
187 else
188 {
189 $type = self::ALIAS_TYPE;
190 }
191
192 if (empty($sender['NAME']))
193 {
194 $sender['NAME'] = self::getUserFormattedName($ownerId);
195 }
196
197 if (!isset($userData[$ownerId]))
198 {
199 $userData[$ownerId] = self::getUserInfo($ownerId);
200 }
201
202 $canEdit = $ownerId === $userId || $isAdmin;
203 $isOwner = $ownerId === $userId;
204
205 if (
206 $userId !== $ownerId
207 && self::getUserFormattedName((int)$sender['USER_ID']) === $sender['NAME']
208 )
209 {
210 $sender['NAME'] = $userFormattedName ?? $sender['NAME'];
211 }
212
213 $senders[] = [
214 'id' => (int)$sender['ID'],
215 'name' => $sender['NAME'],
216 'type' => $type,
217 'email' => $sender['EMAIL'],
218 'userId' => $ownerId,
219 'canEdit' => $canEdit,
220 'isOwner' => $isOwner,
221 'avatar' => $userData[$ownerId]['userAvatar'] ?? null,
222 'userUrl' => $userData[$ownerId]['userUrl'] ?? null,
223 ];
224 }
225
226 return array_merge($senders, $mailboxSenders);
227 }
228
232 public static function getUserAvailableMailboxSenders(
233 ?string $email = null,
234 ?bool $getMailboxesWithoutSmtp = false,
235 ?array $excludedEmails = [],
236 ?int $userId = null,
237 ): array
238 {
239 if (!$userId)
240 {
241 $userId = (int)Main\Engine\CurrentUser::get()->getId();
242 }
243
244 $isAdmin = self::isAdmin();
245
246 $senders = [];
247 if (!Loader::includeModule('mail') || !$userId)
248 {
249 return $senders;
250 }
251
252 $currentUserFormattedName = self::getUserFormattedName($userId);
253 foreach (MailboxTable::getUserMailboxes($userId) as $mailbox)
254 {
255 if (
256 empty($mailbox['EMAIL'])
257 || ($email && $email !== $mailbox['EMAIL'])
258 || in_array($mailbox['EMAIL'], $excludedEmails, true)
259 )
260 {
261 continue;
262 }
263
264 $mailbox['USER_ID'] = (int)$mailbox['USER_ID'];
265 $canEdit = $mailbox['USER_ID'] === $userId || $isAdmin;
266 $isOwner = $mailbox['USER_ID'] === $userId;
267
268 $sender = null;
269 if (self::isSmtpAvailable())
270 {
271 $sender = SenderTable::query()
272 ->setSelect(['*'])
273 ->where('IS_CONFIRMED', true)
274 ->where('PARENT_MODULE_ID', 'mail')
275 ->where('PARENT_ID', $mailbox['ID'])
276 ->setLimit(1)
277 ->fetchObject()
278 ;
279 }
280
281 if (!$sender && !$getMailboxesWithoutSmtp)
282 {
283 continue;
284 }
285
286 $userFormattedName = self::getUserFormattedName((int)($sender['USER_ID'] ?? $mailbox['USER_ID']));
287 $senderName = trim($mailbox['USERNAME'] ?? '');
288 if ($sender)
289 {
290 $sender['USER_ID'] = (int)$sender['USER_ID'];
291 if (empty($sender['NAME']) && empty($mailbox['USERNAME']))
292 {
293 $senderName = self::getUserFormattedName($sender['USER_ID']);
294 }
295
296 if (!empty($mailbox['USERNAME']))
297 {
298 if ($sender['NAME'] !== $mailbox['USERNAME'])
299 {
300 SenderTable::update($sender['ID'], ['NAME' => $senderName]);
301 }
302 }
303
304 if (empty($senderName) && $sender['NAME'])
305 {
306 $senderName = $sender['NAME'];
307 MailboxTable::update($mailbox['ID'], ['USERNAME' => $senderName]);
308 }
309
310 if (!isset($userData[$sender['USER_ID']]))
311 {
312 $userData[$sender['USER_ID']] = self::getUserInfo($sender['USER_ID']);
313 }
314
315 $canEdit = $sender['USER_ID'] === $userId || $isAdmin;
316 $isOwner = $sender['USER_ID'] === $userId;
317 }
318
319 if (
320 empty($senderName)
321 || (
322 $userId !== (int)$mailbox['USER_ID']
323 && self::getUserFormattedName((int)$mailbox['USER_ID']) === $senderName
324 )
325 )
326 {
327 $senderName = $currentUserFormattedName ?? $senderName;
328 }
329
330 if (!empty($sender['USER_ID']))
331 {
332 $avatar = $userData[$sender['USER_ID']]['userAvatar'] ?? null;
333 $userUrl = $userData[$sender['USER_ID']]['userUrl'] ?? null;
334 }
335
336 $senders[] = [
337 'id' => $sender['ID'] ?? $mailbox['ID'],
338 'mailboxId' => $sender['PARENT_ID'] ?? $mailbox['ID'],
339 'name' => !empty($senderName) ? $senderName : $userFormattedName,
340 'type' => $sender ? self::MAILBOX_SENDER_TYPE : self::MAILBOX_TYPE,
341 'email' => $mailbox['EMAIL'],
342 'userId' => $sender['USER_ID'] ?? $mailbox['USER_ID'],
343 'canEdit' => $canEdit,
344 'isOwner' => $isOwner,
345 'editHref' => $canEdit ? self::getMailboxConfigPath($sender['PARENT_ID'] ?? $mailbox['ID']) : null,
346 'avatar' => $avatar ?? null,
347 'userUrl' => $userUrl ?? null,
348 'showEditHint' => empty($sender),
349 ];
350 }
351
352 return $senders;
353 }
354
358 public static function getSenderTransitionalData(int $senderId): ?array
359 {
360 $sender = SenderTable::getById($senderId)->fetch();
361 $transitionalData = [];
362
363 if (!$sender)
364 {
365 return null;
366 }
367
368 $userId = (int)Main\Engine\CurrentUser::get()->getId();
369
370 if (!$userId)
371 {
372 return null;
373 }
374
375 $isAdmin = self::isAdmin();
376 $transitionalData['email'] = $sender['EMAIL'];
377 $transitionalData['senders'] = self::getUserAvailableSendersByEmail($sender['EMAIL']);
378 $isModuleMailAvailable = Loader::includeModule('mail');
379
380 if ($isModuleMailAvailable)
381 {
382 foreach (MailboxTable::getUserMailboxes() as $mailbox)
383 {
384 if (
385 $mailbox['EMAIL'] === $sender['EMAIL']
386 && ((int)$mailbox['USER_ID'] === $userId || $isAdmin)
387 )
388 {
389 foreach ($transitionalData['senders'] as $emailSender)
390 {
391 if ($emailSender['type'] !== self::MAILBOX_SENDER_TYPE)
392 {
393 continue;
394 }
395 $transitionalData['id'] = $mailbox['ID'];
396 $transitionalData['type'] = self::MAILBOX_TYPE;
397 $transitionalData['href'] = self::getMailboxConfigPath($mailbox['ID']);
398 $transitionalData['canEdit'] = true;
399 return $transitionalData;
400 }
401
402 }
403 }
404 }
405
406 if (
407 ($sender['PARENT_MODULE_ID'] === 'main' || !$isModuleMailAvailable)
408 && !empty($sender['OPTIONS']['smtp']['server'])
409 && ((int)$sender['USER_ID'] === $userId || $isAdmin)
410 )
411 {
412 $transitionalData['id'] = $senderId;
413 $transitionalData['type'] = self::SENDER_TYPE;
414 $transitionalData['canEdit'] = true;
415 return $transitionalData;
416 }
417
418 foreach ($transitionalData['senders'] as $emailSender)
419 {
420 if (
421 $emailSender['type'] === self::SENDER_TYPE
422 && ($emailSender['USER_ID'] === $userId || $isAdmin)
423 )
424 {
425 $transitionalData['id'] = $emailSender['id'];
426 $transitionalData['type'] = self::SENDER_TYPE;
427 $transitionalData['canEdit'] = true;
428 return $transitionalData;
429 }
430 }
431
432 return $transitionalData;
433 }
434
435 public static function getUserFormattedName(?int $userId = null): ?string
436 {
437 if (!$userId)
438 {
440 }
441
442 if (!$userId)
443 {
444 return null;
445 }
446
447 $userData = self::getUserData($userId);
448 if (!$userData)
449 {
450 return null;
451 }
452
453 return \CUser::formatName(\CSite::getNameFormat(), $userData, true, false);
454 }
455
456 public static function getAddressInEmailAngleFormat(
457 string $email,
458 ?string $senderName = null,
459 ?int $userId = null,
460 ): ?string
461 {
462 if (strlen($senderName ?? '') === 0)
463 {
464 $senderName = self::getUserFormattedName($userId);
465 }
466
467 if (!$senderName)
468 {
469 return null;
470 }
471
472 return "{$senderName} <{$email}>";
473 }
474
475 public static function getSenderNameByMailboxId(int $mailboxId, bool $getSenderWithoutSmtp = false): ?array
476 {
477 $sender = SenderTable::query()
478 ->setSelect(['*'])
479 ->where('IS_CONFIRMED', true)
480 ->where('PARENT_MODULE_ID', 'mail')
481 ->where('PARENT_ID', $mailboxId)
482 ->setLimit(1)
483 ->fetchObject()
484 ;
485
486 if ($sender)
487 {
488 return [
489 'id' => $sender['ID'],
490 'name' => (strlen($sender['NAME'] ?? '') > 0) ? $sender['NAME'] : self::getUserFormattedName($sender['USER_ID']),
491 'email' => $sender['EMAIL'],
492 'type' => self::MAILBOX_SENDER_TYPE,
493 ];
494 }
495
496 if (
497 !$getSenderWithoutSmtp
498 || !self::canUseMailboxTable()
499 )
500 {
501 return null;
502 }
503
504 $mailbox = MailboxTable::getById($mailboxId)->fetch();
505
506 if (!$mailbox)
507 {
508 return null;
509 }
510
511 return [
512 'id' => $mailbox['ID'],
513 'name' => (strlen($mailbox['USERNAME'] ?? '') > 0) ? $mailbox['USERNAME'] : self::getUserFormattedName($mailbox['USER_ID']),
514 'email' => $mailbox['EMAIL'],
515 'type' => self::MAILBOX_TYPE,
516 ];
517 }
518
519 private static function getMailboxConfigPath(int $mailboxId): string
520 {
521 return str_replace('#id#', $mailboxId, Config\Option::get('intranet', 'path_mail_config', SITE_DIR . 'mail/'));
522 }
523
524 public static function getUserInfo(int $userId): ?array
525 {
526 static $userInfo = [];
527
528 if (isset($userInfo[$userId]))
529 {
530 return $userInfo[$userId];
531 }
532
533 $userData = self::getUserData($userId);
534 if (!$userData)
535 {
536 return null;
537 }
538
539 $userUrl = str_replace('#USER_ID#', $userId, \COption::GetOptionString('intranet', 'path_user', '/company/personal/user/#USER_ID#/'));
540
541 if ($userData['PERSONAL_PHOTO'])
542 {
543 $resizedImage = \CFile::ResizeImageGet(
544 $userData["PERSONAL_PHOTO"],
545 ['width' => 50, 'height' => 50],
547 false,
548 false,
549 true
550 );
551 if (!empty($resizedImage['src']))
552 {
553 $userAvatar = $resizedImage['src'];
554 }
555 }
556
557 $userInfo[$userId] = [
558 'userUrl' => $userUrl,
559 'userAvatar' => $userAvatar ?? null,
560 ];
561
562 return $userInfo[$userId];
563 }
564
565 private static function canUseMailboxTable(): bool
566 {
567 return Loader::includeModule('mail') && class_exists('Bitrix\Mail\MailboxTable');
568 }
569
570 private static function isSmtpAvailable(): bool
571 {
572 $defaultMailConfiguration = Configuration::getValue('smtp');
573 return Loader::includeModule('bitrix24')
574 || $defaultMailConfiguration['enabled']
575 ;
576 }
577
578 public static function isAdmin(): bool
579 {
580 $currentUser = Main\Engine\CurrentUser::get();
581
582 return $currentUser->isAdmin() || $currentUser->canDoOperation('bitrix24_config');
583 }
584
585 private static function getUserData(int $userId): ?array
586 {
587 static $userData = [];
588 if (!empty($userData[$userId]))
589 {
590 return $userData[$userId];
591 }
592
593 $select = [
594 'ID',
595 'NAME',
596 'LAST_NAME',
597 'SECOND_NAME',
598 'PERSONAL_PHOTO',
599 'LOGIN',
600 'EMAIL',
601 ];
602
604 'select' => $select,
605 'filter' => ['=ID' => $userId],
606 ])->fetch();
607
608 return $userData[$userId] ?: null;
609 }
610}
$type
Определения options.php:106
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static getUserMailboxes($userId=null, bool $onlyIds=false)
Определения mailbox.php:339
static get()
Определения currentuser.php:33
Определения loader.php:13
static includeModule($moduleName)
Определения loader.php:67
static getUserAvailableSenders(?int $userId=null)
Определения usersenderdataprovider.php:24
static getAddressInEmailAngleFormat(string $email, ?string $senderName=null, ?int $userId=null,)
Определения usersenderdataprovider.php:456
static getSenderNameByMailboxId(int $mailboxId, bool $getSenderWithoutSmtp=false)
Определения usersenderdataprovider.php:475
static getUserAvailableMailboxSenders(?string $email=null, ?bool $getMailboxesWithoutSmtp=false, ?array $excludedEmails=[], ?int $userId=null,)
Определения usersenderdataprovider.php:232
static getSenderTransitionalData(int $senderId)
Определения usersenderdataprovider.php:358
static getUserFormattedName(?int $userId=null)
Определения usersenderdataprovider.php:435
static getUserAvailableSendersByEmail(string $email, int $userId=null)
Определения usersenderdataprovider.php:146
static getById($id)
Определения datamanager.php:364
static getList(array $parameters=array())
Определения datamanager.php:431
static update($primary, array $data)
Определения datamanager.php:1256
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$select
Определения iblock_catalog_list.php:194
const BX_RESIZE_IMAGE_EXACT
Определения constants.php:12
const SITE_DIR(!defined('LANG'))
Определения include.php:72
Определения action.php:3
Определения chain.php:3
$email
Определения payment.php:49
if(empty($signedUserToken)) $key
Определения quickway.php:257