1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-25 16:22:43 +01:00
phorge-phorge/src/applications/differential/mail/base/DifferentialMail.php

285 lines
6.7 KiB
PHP
Raw Normal View History

2011-01-26 02:17:19 +01:00
<?php
/*
* Copyright 2011 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
abstract class DifferentialMail {
const SUBJECT_PREFIX = '[Differential]';
protected $to = array();
protected $cc = array();
protected $actorHandle;
2011-01-26 02:17:19 +01:00
protected $revision;
protected $comment;
2011-01-26 02:17:19 +01:00
protected $changesets;
protected $inlineComments;
protected $isFirstMailAboutRevision;
protected $isFirstMailToRecipients;
protected $heraldTranscriptURI;
protected $heraldRulesHeader;
abstract protected function renderSubject();
abstract protected function renderBody();
2011-01-26 02:17:19 +01:00
public function setActorHandle($actor_handle) {
$this->actorHandle = $actor_handle;
2011-01-26 02:17:19 +01:00
return $this;
}
public function getActorHandle() {
return $this->actorHandle;
}
protected function getActorName() {
$handle = $this->getActorHandle();
if ($handle) {
return $handle->getName();
}
return '???';
}
2011-01-26 02:17:19 +01:00
public function setXHeraldRulesHeader($header) {
$this->heraldRulesHeader = $header;
return $this;
}
public function send() {
$to_phids = $this->getToPHIDs();
if (!$to_phids) {
throw new Exception('No "To:" users provided!');
}
$cc_phids = $this->getCCPHIDs();
$subject = $this->buildSubject();
$body = $this->buildBody();
$mail = new PhabricatorMetaMTAMail();
$handle = $this->getActorHandle();
$reply = $this->getReplyHandlerEmailAddress();
if ($handle) {
$mail->setFrom($handle->getPHID());
if ($reply) {
$mail->setReplyTo($this->getReplyHandlerEmailAddress());
}
2011-01-26 02:17:19 +01:00
} else {
if ($reply) {
$mail->setFrom($this->getReplyHandlerEmailAddress());
}
2011-01-26 02:17:19 +01:00
}
$mail
->addTos($to_phids)
->addCCs($cc_phids)
->setSubject($subject)
->setBody($body)
->setIsHTML($this->shouldMarkMailAsHTML())
->addHeader('Thread-Topic', $this->getRevision()->getTitle());
2011-01-26 02:17:19 +01:00
$mail->setThreadID(
$this->getThreadID(),
$this->isFirstMailAboutRevision());
2011-01-26 02:17:19 +01:00
if ($this->heraldRulesHeader) {
$mail->addHeader('X-Herald-Rules', $this->heraldRulesHeader);
}
$mail->setRelatedPHID($this->getRevision()->getPHID());
// Save this to the MetaMTA queue for later delivery to the MTA.
$mail->save();
}
protected function buildSubject() {
return self::SUBJECT_PREFIX.' '.$this->renderSubject();
}
protected function shouldMarkMailAsHTML() {
return false;
}
protected function buildBody() {
$actions = array();
$body = $this->renderBody();
/*
2011-01-26 02:17:19 +01:00
$body .= <<<EOTEXT
ACTIONS
Reply to comment, or !accept, !reject, !abandon, !resign, or !showdiff.
EOTEXT;
*/
2011-01-26 02:17:19 +01:00
if ($this->getHeraldTranscriptURI() && $this->isFirstMailToRecipients()) {
2011-04-10 17:46:17 +02:00
$manage_uri = PhabricatorEnv::getProductionURI(
'/herald/view/differential/');
2011-01-26 02:17:19 +01:00
$xscript_uri = $this->getHeraldTranscriptURI();
$body .= <<<EOTEXT
2011-04-10 17:46:17 +02:00
MANAGE HERALD DIFFERENTIAL RULES
2011-04-10 21:39:05 +02:00
{$manage_uri}
2011-01-26 02:17:19 +01:00
WHY DID I GET THIS EMAIL?
{$xscript_uri}
Tip: use the X-Herald-Rules header to filter Herald messages in your client.
EOTEXT;
}
return $body;
}
protected function getReplyHandlerEmailAddress() {
return null;
2011-01-26 02:17:19 +01:00
// TODO
$phid = $this->getRevision()->getPHID();
$server = 'todo.example.com';
return "differential+{$phid}@{$server}";
}
protected function formatText($text) {
$text = explode("\n", $text);
foreach ($text as &$line) {
$line = rtrim(' '.$line);
}
unset($line);
return implode("\n", $text);
}
public function setToPHIDs(array $to) {
$this->to = $this->filterContactPHIDs($to);
return $this;
}
public function setCCPHIDs(array $cc) {
$this->cc = $this->filterContactPHIDs($cc);
return $this;
}
protected function filterContactPHIDs(array $phids) {
return $phids;
// TODO: actually do this?
// Differential revisions use Subscriptions for CCs, so any arbitrary
// PHID can end up CC'd to them. Only try to actually send email PHIDs
// which have ToolsHandle types that are marked emailable. If we don't
// filter here, sending the email will fail.
/*
$handles = array();
prep(new ToolsHandleData($phids, $handles));
foreach ($handles as $phid => $handle) {
if (!$handle->isEmailable()) {
unset($handles[$phid]);
}
}
return array_keys($handles);
*/
}
protected function getToPHIDs() {
return $this->to;
}
protected function getCCPHIDs() {
return $this->cc;
}
public function setRevision($revision) {
$this->revision = $revision;
return $this;
}
public function getRevision() {
return $this->revision;
}
protected function getThreadID() {
2011-01-26 02:17:19 +01:00
$phid = $this->getRevision()->getPHID();
2011-04-10 17:46:17 +02:00
$domain = PhabricatorEnv::getEnvConfig('metamta.domain');
return "<differential-rev-{$phid}-req@{$domain}>";
2011-01-26 02:17:19 +01:00
}
public function setComment($comment) {
$this->comment = $comment;
2011-01-26 02:17:19 +01:00
return $this;
}
public function getComment() {
return $this->comment;
2011-01-26 02:17:19 +01:00
}
public function setChangesets($changesets) {
$this->changesets = $changesets;
return $this;
}
public function getChangesets() {
return $this->changesets;
}
public function setInlineComments(array $inline_comments) {
$this->inlineComments = $inline_comments;
return $this;
}
public function getInlineComments() {
return $this->inlineComments;
}
public function renderRevisionDetailLink() {
$uri = $this->getRevisionURI();
return "REVISION DETAIL\n {$uri}";
}
public function getRevisionURI() {
return PhabricatorEnv::getProductionURI('/D'.$this->getRevision()->getID());
2011-01-26 02:17:19 +01:00
}
public function setIsFirstMailToRecipients($first) {
$this->isFirstMailToRecipients = $first;
return $this;
}
public function isFirstMailToRecipients() {
return $this->isFirstMailToRecipients;
}
public function setIsFirstMailAboutRevision($first) {
$this->isFirstMailAboutRevision = $first;
return $this;
}
public function isFirstMailAboutRevision() {
return $this->isFirstMailAboutRevision;
}
public function setHeraldTranscriptURI($herald_transcript_uri) {
$this->heraldTranscriptURI = $herald_transcript_uri;
return $this;
}
public function getHeraldTranscriptURI() {
return $this->heraldTranscriptURI;
}
}