recipientName = $recipientName ?? $user->name; $editUrl = $user->canAccessAdmin() ? route('admin.press-releases.edit', $pressRelease->id) : route('me.press-releases.edit', $pressRelease->id); // Herkunft und Meldung an den Link (Roadmap 0.4) — sonst ist später // nicht unterscheidbar, ob eine Wiedereinreichung aus dieser Mail kam. $this->editUrl = $editUrl.(str_contains($editUrl, '?') ? '&' : '?').http_build_query([ 'src' => ConversionSource::MailReject->value, 'pr' => $pressRelease->id, ]); $this->helpUrl = $this->helpUrl($pressRelease); // Geht die Mail an einen Empfänger ohne Konto (API-Meldung), meldet // der Abmeldelink diese Adresse ab — nicht das Konto des Einlieferers. if ($recipientEmail !== null && mb_strtolower(trim($recipientEmail)) !== mb_strtolower((string) $user->email)) { $this->configureAddressUnsubscribe($recipientEmail, EmailNotificationType::PressReleaseRejected); } else { $this->configureUnsubscribe($user, EmailNotificationType::PressReleaseRejected); } } /** * „Was eine gute Pressemitteilung ausmacht" auf dem Portal der Meldung, * mit Herkunft und Meldung im Link — damit messbar ist, ob der Hinweis * gelesen wird und ob danach eine Wiedereinreichung folgt. */ private function helpUrl(PressRelease $pressRelease): string { $host = rtrim((string) match ($pressRelease->portal) { Portal::Presseecho => config('domains.domain_presseecho_url'), Portal::Businessportal24 => config('domains.domain_businessportal_url'), default => config('domains.domain_portal_url'), }, '/'); $edition = in_array($pressRelease->language, ['de', 'en'], true) ? $pressRelease->language : 'de'; return sprintf('%s/%s/gute-pressemitteilung?%s', $host, $edition, http_build_query([ 'src' => ConversionSource::MailReject->value, 'pr' => $pressRelease->id, ])); } /** * Bounce-Referenz: Ein DSN bringt die Original-Header zurück, so ordnet * der Parser den Rückläufer der Meldung zu (Roadmap 1b.6). Gesetzt über * den gemeinsamen headers() des Unsubscribable-Traits. */ public function bounceReference(): string { return sprintf('pm:%d:company:%s', $this->pressRelease->id, $this->pressRelease->company_id ?? '-'); } public function envelope(): Envelope { return new Envelope( subject: 'Ihre Pressemitteilung wurde abgelehnt: '.$this->pressRelease->title, ); } public function content(): Content { return new Content(view: 'emails.press-release.rejected'); } }