mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 08:42:41 +01:00
Move "send test" to bin/mail
Summary: Like D6417. See D6413. Test Plan: >>> orbital ~/devtools/phabricator $ echo "hello" | ./bin/mail send-test --to dog --cc duck --from epriestley --subject 'hey there' --attach README --tag blip --tag bloop Reading message body from stdin... Mail sent! You can view details by running this command: phabricator/ $ ./bin/mail show-outbound --id 6480 >>> orbital ~/devtools/phabricator $ ./bin/mail show-outbound --id 6480 PROPERTIES ID: 6480 Status: sent Retry Count: 0 Next Retry: 1373493443 Related PHID: Message: PARAMETERS to: ["PHID-USER-cluwcdowc35gmperlkbi"] cc: ["PHID-USER-aeabc4ipqbifny3rw4ok"] subject: hey there is-html: is-bulk: mailtags: ["blip","bloop"] from: PHID-USER-lqiz3yd7wmk64ejugvov worker-task: 936543 BODY hello Reviewers: btrahan Reviewed By: btrahan CC: aran Differential Revision: https://secure.phabricator.com/D6419
This commit is contained in:
parent
293a475e39
commit
6bac7e390e
6 changed files with 141 additions and 193 deletions
|
@ -19,6 +19,7 @@ $workflows = array(
|
||||||
new PhutilHelpArgumentWorkflow(),
|
new PhutilHelpArgumentWorkflow(),
|
||||||
new PhabricatorMailManagementShowOutboundWorkflow(),
|
new PhabricatorMailManagementShowOutboundWorkflow(),
|
||||||
new PhabricatorMailManagementShowInboundWorkflow(),
|
new PhabricatorMailManagementShowInboundWorkflow(),
|
||||||
|
new PhabricatorMailManagementSendTestWorkflow(),
|
||||||
new PhabricatorMailManagementReceiveTestWorkflow(),
|
new PhabricatorMailManagementReceiveTestWorkflow(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -1213,6 +1213,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorMailImplementationTestAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationTestAdapter.php',
|
'PhabricatorMailImplementationTestAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationTestAdapter.php',
|
||||||
'PhabricatorMailManagementReceiveTestWorkflow' => 'applications/metamta/management/PhabricatorMailManagementReceiveTestWorkflow.php',
|
'PhabricatorMailManagementReceiveTestWorkflow' => 'applications/metamta/management/PhabricatorMailManagementReceiveTestWorkflow.php',
|
||||||
'PhabricatorMailManagementResendWorkflow' => 'applications/metamta/management/PhabricatorMailManagementResendWorkflow.php',
|
'PhabricatorMailManagementResendWorkflow' => 'applications/metamta/management/PhabricatorMailManagementResendWorkflow.php',
|
||||||
|
'PhabricatorMailManagementSendTestWorkflow' => 'applications/metamta/management/PhabricatorMailManagementSendTestWorkflow.php',
|
||||||
'PhabricatorMailManagementShowInboundWorkflow' => 'applications/metamta/management/PhabricatorMailManagementShowInboundWorkflow.php',
|
'PhabricatorMailManagementShowInboundWorkflow' => 'applications/metamta/management/PhabricatorMailManagementShowInboundWorkflow.php',
|
||||||
'PhabricatorMailManagementShowOutboundWorkflow' => 'applications/metamta/management/PhabricatorMailManagementShowOutboundWorkflow.php',
|
'PhabricatorMailManagementShowOutboundWorkflow' => 'applications/metamta/management/PhabricatorMailManagementShowOutboundWorkflow.php',
|
||||||
'PhabricatorMailManagementWorkflow' => 'applications/metamta/management/PhabricatorMailManagementWorkflow.php',
|
'PhabricatorMailManagementWorkflow' => 'applications/metamta/management/PhabricatorMailManagementWorkflow.php',
|
||||||
|
@ -1251,7 +1252,6 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorMetaMTAReceivedMail' => 'applications/metamta/storage/PhabricatorMetaMTAReceivedMail.php',
|
'PhabricatorMetaMTAReceivedMail' => 'applications/metamta/storage/PhabricatorMetaMTAReceivedMail.php',
|
||||||
'PhabricatorMetaMTAReceivedMailProcessingException' => 'applications/metamta/exception/PhabricatorMetaMTAReceivedMailProcessingException.php',
|
'PhabricatorMetaMTAReceivedMailProcessingException' => 'applications/metamta/exception/PhabricatorMetaMTAReceivedMailProcessingException.php',
|
||||||
'PhabricatorMetaMTAReceivedMailTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMetaMTAReceivedMailTestCase.php',
|
'PhabricatorMetaMTAReceivedMailTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMetaMTAReceivedMailTestCase.php',
|
||||||
'PhabricatorMetaMTASendController' => 'applications/metamta/controller/PhabricatorMetaMTASendController.php',
|
|
||||||
'PhabricatorMetaMTASendGridReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTASendGridReceiveController.php',
|
'PhabricatorMetaMTASendGridReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTASendGridReceiveController.php',
|
||||||
'PhabricatorMetaMTAViewController' => 'applications/metamta/controller/PhabricatorMetaMTAViewController.php',
|
'PhabricatorMetaMTAViewController' => 'applications/metamta/controller/PhabricatorMetaMTAViewController.php',
|
||||||
'PhabricatorMetaMTAWorker' => 'applications/metamta/PhabricatorMetaMTAWorker.php',
|
'PhabricatorMetaMTAWorker' => 'applications/metamta/PhabricatorMetaMTAWorker.php',
|
||||||
|
@ -3170,6 +3170,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorMailImplementationTestAdapter' => 'PhabricatorMailImplementationAdapter',
|
'PhabricatorMailImplementationTestAdapter' => 'PhabricatorMailImplementationAdapter',
|
||||||
'PhabricatorMailManagementReceiveTestWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
'PhabricatorMailManagementReceiveTestWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
||||||
'PhabricatorMailManagementResendWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
'PhabricatorMailManagementResendWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
||||||
|
'PhabricatorMailManagementSendTestWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
||||||
'PhabricatorMailManagementShowInboundWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
'PhabricatorMailManagementShowInboundWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
||||||
'PhabricatorMailManagementShowOutboundWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
'PhabricatorMailManagementShowOutboundWorkflow' => 'PhabricatorSearchManagementWorkflow',
|
||||||
'PhabricatorMailManagementWorkflow' => 'PhutilArgumentWorkflow',
|
'PhabricatorMailManagementWorkflow' => 'PhutilArgumentWorkflow',
|
||||||
|
@ -3199,7 +3200,6 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorMetaMTAReceivedMail' => 'PhabricatorMetaMTADAO',
|
'PhabricatorMetaMTAReceivedMail' => 'PhabricatorMetaMTADAO',
|
||||||
'PhabricatorMetaMTAReceivedMailProcessingException' => 'Exception',
|
'PhabricatorMetaMTAReceivedMailProcessingException' => 'Exception',
|
||||||
'PhabricatorMetaMTAReceivedMailTestCase' => 'PhabricatorTestCase',
|
'PhabricatorMetaMTAReceivedMailTestCase' => 'PhabricatorTestCase',
|
||||||
'PhabricatorMetaMTASendController' => 'PhabricatorMetaMTAController',
|
|
||||||
'PhabricatorMetaMTASendGridReceiveController' => 'PhabricatorMetaMTAController',
|
'PhabricatorMetaMTASendGridReceiveController' => 'PhabricatorMetaMTAController',
|
||||||
'PhabricatorMetaMTAViewController' => 'PhabricatorMetaMTAController',
|
'PhabricatorMetaMTAViewController' => 'PhabricatorMetaMTAController',
|
||||||
'PhabricatorMetaMTAWorker' => 'PhabricatorWorker',
|
'PhabricatorMetaMTAWorker' => 'PhabricatorWorker',
|
||||||
|
|
|
@ -30,7 +30,6 @@ final class PhabricatorApplicationMetaMTA extends PhabricatorApplication {
|
||||||
return array(
|
return array(
|
||||||
$this->getBaseURI() => array(
|
$this->getBaseURI() => array(
|
||||||
'' => 'PhabricatorMetaMTAListController',
|
'' => 'PhabricatorMetaMTAListController',
|
||||||
'send/' => 'PhabricatorMetaMTASendController',
|
|
||||||
'view/(?P<id>[1-9]\d*)/' => 'PhabricatorMetaMTAViewController',
|
'view/(?P<id>[1-9]\d*)/' => 'PhabricatorMetaMTAViewController',
|
||||||
'received/' => 'PhabricatorMetaMTAReceivedListController',
|
'received/' => 'PhabricatorMetaMTAReceivedListController',
|
||||||
'sendgrid/' => 'PhabricatorMetaMTASendGridReceiveController',
|
'sendgrid/' => 'PhabricatorMetaMTASendGridReceiveController',
|
||||||
|
|
|
@ -14,11 +14,6 @@ abstract class PhabricatorMetaMTAController extends PhabricatorController {
|
||||||
$nav->addFilter('sent', pht('Sent Mail'), $this->getApplicationURI());
|
$nav->addFilter('sent', pht('Sent Mail'), $this->getApplicationURI());
|
||||||
$nav->addFilter('received', pht('Received Mail'));
|
$nav->addFilter('received', pht('Received Mail'));
|
||||||
|
|
||||||
if ($this->getRequest()->getUser()->getIsAdmin()) {
|
|
||||||
$nav->addLabel(pht('Diagnostics'));
|
|
||||||
$nav->addFilter('send', pht('Send Test'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return $nav;
|
return $nav;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,185 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhabricatorMetaMTASendController
|
|
||||||
extends PhabricatorMetaMTAController {
|
|
||||||
|
|
||||||
public function processRequest() {
|
|
||||||
|
|
||||||
$request = $this->getRequest();
|
|
||||||
|
|
||||||
if ($request->isFormPost()) {
|
|
||||||
|
|
||||||
$mail = new PhabricatorMetaMTAMail();
|
|
||||||
$mail->addTos($request->getArr('to'));
|
|
||||||
$mail->addCCs($request->getArr('cc'));
|
|
||||||
$mail->setSubject($request->getStr('subject'));
|
|
||||||
$mail->setBody($request->getStr('body'));
|
|
||||||
|
|
||||||
$files = $request->getArr('files');
|
|
||||||
if ($files) {
|
|
||||||
foreach ($files as $phid) {
|
|
||||||
$file = id(new PhabricatorFile())->loadOneWhere('phid = %s', $phid);
|
|
||||||
$mail->addAttachment(new PhabricatorMetaMTAAttachment(
|
|
||||||
$file->loadFileData(),
|
|
||||||
$file->getName(),
|
|
||||||
$file->getMimeType()
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$mail->setFrom($request->getUser()->getPHID());
|
|
||||||
$mail->setSimulatedFailureCount($request->getInt('failures'));
|
|
||||||
$mail->setIsHTML($request->getInt('html'));
|
|
||||||
$mail->setIsBulk($request->getInt('bulk'));
|
|
||||||
$mail->setMailTags($request->getStrList('mailtags'));
|
|
||||||
$mail->setOverrideNoSelfMailPreference(true);
|
|
||||||
$mail->save();
|
|
||||||
if ($request->getInt('immediately')) {
|
|
||||||
$mail->sendNow();
|
|
||||||
}
|
|
||||||
|
|
||||||
return id(new AphrontRedirectResponse())
|
|
||||||
->setURI($this->getApplicationURI('/view/'.$mail->getID().'/'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$failure_caption =
|
|
||||||
pht("Enter a number to simulate that many consecutive send failures ".
|
|
||||||
"brefore really attempting to deliver via the underlying MTA.");
|
|
||||||
|
|
||||||
$doclink_href = PhabricatorEnv::getDoclink(
|
|
||||||
'article/Configuring_Outbound_Email.html');
|
|
||||||
|
|
||||||
$doclink = phutil_tag(
|
|
||||||
'a',
|
|
||||||
array(
|
|
||||||
'href' => $doclink_href,
|
|
||||||
'target' => '_blank',
|
|
||||||
),
|
|
||||||
pht('Configuring Outbound Email'));
|
|
||||||
$instructions = hsprintf(
|
|
||||||
'<p class="aphront-form-instructions">%s</p>',
|
|
||||||
pht(
|
|
||||||
'This form will send a normal email using the settings you have '.
|
|
||||||
'configured for Phabricator. For more information, see %s.',
|
|
||||||
$doclink));
|
|
||||||
|
|
||||||
$adapter = PhabricatorEnv::getEnvConfig('metamta.mail-adapter');
|
|
||||||
$warning = null;
|
|
||||||
if ($adapter == 'PhabricatorMailImplementationTestAdapter') {
|
|
||||||
$warning = new AphrontErrorView();
|
|
||||||
$warning->setTitle('Email is Disabled');
|
|
||||||
$warning->setSeverity(AphrontErrorView::SEVERITY_WARNING);
|
|
||||||
$warning->appendChild(phutil_tag(
|
|
||||||
'p',
|
|
||||||
array(),
|
|
||||||
pht(
|
|
||||||
'This installation of Phabricator is currently set to use %s to '.
|
|
||||||
'deliver outbound email. This completely disables outbound email! '.
|
|
||||||
'All outbound email will be thrown in a deep, dark hole until you '.
|
|
||||||
'configure a real adapter.',
|
|
||||||
phutil_tag(
|
|
||||||
'tt',
|
|
||||||
array(),
|
|
||||||
'PhabricatorMailImplementationTestAdapter'))));
|
|
||||||
}
|
|
||||||
|
|
||||||
$phdlink_href = PhabricatorEnv::getDoclink(
|
|
||||||
'article/Managing_Daemons_with_phd.html');
|
|
||||||
|
|
||||||
$phdlink = phutil_tag(
|
|
||||||
'a',
|
|
||||||
array(
|
|
||||||
'href' => $phdlink_href,
|
|
||||||
'target' => '_blank',
|
|
||||||
),
|
|
||||||
'"phd start"');
|
|
||||||
|
|
||||||
$form = new AphrontFormView();
|
|
||||||
$form->setUser($request->getUser());
|
|
||||||
$form
|
|
||||||
->appendChild($instructions)
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormStaticControl())
|
|
||||||
->setLabel(pht('Adapter'))
|
|
||||||
->setValue($adapter))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormTokenizerControl())
|
|
||||||
->setLabel(pht('To'))
|
|
||||||
->setName('to')
|
|
||||||
->setDatasource('/typeahead/common/mailable/'))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormTokenizerControl())
|
|
||||||
->setLabel(pht('CC'))
|
|
||||||
->setName('cc')
|
|
||||||
->setDatasource('/typeahead/common/mailable/'))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormTextControl())
|
|
||||||
->setLabel(pht('Subject'))
|
|
||||||
->setName('subject'))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormTextAreaControl())
|
|
||||||
->setLabel(pht('Body'))
|
|
||||||
->setName('body'))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormTextControl())
|
|
||||||
->setLabel(pht('Mail Tags'))
|
|
||||||
->setName('mailtags')
|
|
||||||
->setCaption(pht(
|
|
||||||
'Example: %s',
|
|
||||||
phutil_tag(
|
|
||||||
'tt',
|
|
||||||
array(),
|
|
||||||
'differential-cc, differential-comment'))))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormDragAndDropUploadControl())
|
|
||||||
->setLabel(pht('Attach Files'))
|
|
||||||
->setName('files')
|
|
||||||
->setActivatedClass('aphront-panel-view-drag-and-drop'))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormTextControl())
|
|
||||||
->setLabel(pht('Simulate Failures'))
|
|
||||||
->setName('failures')
|
|
||||||
->setCaption($failure_caption))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormCheckboxControl())
|
|
||||||
->setLabel(pht('HTML'))
|
|
||||||
->addCheckbox('html', '1', 'Send as HTML email.'))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormCheckboxControl())
|
|
||||||
->setLabel(pht('Bulk'))
|
|
||||||
->addCheckbox('bulk', '1', 'Send with bulk email headers.'))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormCheckboxControl())
|
|
||||||
->setLabel('Send Now')
|
|
||||||
->addCheckbox(
|
|
||||||
'immediately',
|
|
||||||
'1',
|
|
||||||
pht('Send immediately. (Do not enqueue for daemons.)'),
|
|
||||||
PhabricatorEnv::getEnvConfig('metamta.send-immediately'))
|
|
||||||
->setCaption(pht('Daemons can be started with %s.', $phdlink)))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormSubmitControl())
|
|
||||||
->setValue(pht('Send Mail')));
|
|
||||||
|
|
||||||
$panel = new AphrontPanelView();
|
|
||||||
$panel->setHeader(pht('Send Email'));
|
|
||||||
$panel->appendChild($form);
|
|
||||||
$panel->setNoBackground();
|
|
||||||
|
|
||||||
$nav = $this->buildSideNavView();
|
|
||||||
$nav->selectFilter('send');
|
|
||||||
$nav->appendChild(
|
|
||||||
array(
|
|
||||||
$warning,
|
|
||||||
$panel,
|
|
||||||
));
|
|
||||||
|
|
||||||
return $this->buildApplicationPage(
|
|
||||||
$nav,
|
|
||||||
array(
|
|
||||||
'title' => pht('Send Test'),
|
|
||||||
'device' => true,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,138 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorMailManagementSendTestWorkflow
|
||||||
|
extends PhabricatorSearchManagementWorkflow {
|
||||||
|
|
||||||
|
protected function didConstruct() {
|
||||||
|
$this
|
||||||
|
->setName('send-test')
|
||||||
|
->setSynopsis(
|
||||||
|
pht(
|
||||||
|
'Simulate sending mail. This may be useful to test your mail '.
|
||||||
|
'configuration, or while developing new mail adapters.'))
|
||||||
|
->setExamples(
|
||||||
|
"**send-test** --to alincoln --subject hi < body.txt")
|
||||||
|
->setArguments(
|
||||||
|
array(
|
||||||
|
array(
|
||||||
|
'name' => 'from',
|
||||||
|
'param' => 'user',
|
||||||
|
'help' => 'Send mail from the specified user.',
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'to',
|
||||||
|
'param' => 'user',
|
||||||
|
'help' => 'Send mail "To:" the specified users.',
|
||||||
|
'repeat' => true,
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'cc',
|
||||||
|
'param' => 'user',
|
||||||
|
'help' => 'Send mail which "Cc:"s the specified users.',
|
||||||
|
'repeat' => true,
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'subject',
|
||||||
|
'param' => 'text',
|
||||||
|
'help' => 'Use the provided subject.',
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'tag',
|
||||||
|
'param' => 'text',
|
||||||
|
'help' => 'Add the given mail tags.',
|
||||||
|
'repeat' => true,
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'attach',
|
||||||
|
'param' => 'file',
|
||||||
|
'help' => 'Attach a file.',
|
||||||
|
'repeat' => true,
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'html',
|
||||||
|
'help' => 'Send as HTML mail.',
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'bulk',
|
||||||
|
'help' => 'Send with bulk headers.',
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function execute(PhutilArgumentParser $args) {
|
||||||
|
$console = PhutilConsole::getConsole();
|
||||||
|
$viewer = PhabricatorUser::getOmnipotentUser();
|
||||||
|
|
||||||
|
$from = $args->getArg('from');
|
||||||
|
if ($from) {
|
||||||
|
$user = id(new PhabricatorPeopleQuery())
|
||||||
|
->setViewer($viewer)
|
||||||
|
->withUsernames(array($from))
|
||||||
|
->executeOne();
|
||||||
|
if (!$user) {
|
||||||
|
throw new PhutilArgumentUsageException(
|
||||||
|
pht("No such user '%s' exists.", $from));
|
||||||
|
}
|
||||||
|
$from = $user;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tos = $args->getArg('to');
|
||||||
|
$ccs = $args->getArg('cc');
|
||||||
|
|
||||||
|
$names = array_merge($tos, $ccs);
|
||||||
|
$users = id(new PhabricatorPeopleQuery())
|
||||||
|
->setViewer($viewer)
|
||||||
|
->withUsernames($names)
|
||||||
|
->execute();
|
||||||
|
$users = mpull($users, null, 'getUsername');
|
||||||
|
|
||||||
|
foreach ($tos as $key => $username) {
|
||||||
|
if (empty($users[$username])) {
|
||||||
|
throw new PhutilArgumentUsageException(
|
||||||
|
pht("No such user '%s' exists.", $username));
|
||||||
|
}
|
||||||
|
$tos[$key] = $users[$username]->getPHID();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($ccs as $key => $username) {
|
||||||
|
if (empty($users[$username])) {
|
||||||
|
throw new PhutilArgumentUsageException(
|
||||||
|
pht("No such user '%s' exists.", $username));
|
||||||
|
}
|
||||||
|
$ccs[$key] = $users[$username]->getPHID();
|
||||||
|
}
|
||||||
|
|
||||||
|
$subject = $args->getArg('subject');
|
||||||
|
$tags = $args->getArg('tag');
|
||||||
|
$attach = $args->getArg('attach');
|
||||||
|
$is_html = $args->getArg('html');
|
||||||
|
$is_bulk = $args->getArg('bulk');
|
||||||
|
|
||||||
|
$console->writeErr("%s\n", pht('Reading message body from stdin...'));
|
||||||
|
$body = file_get_contents('php://stdin');
|
||||||
|
|
||||||
|
|
||||||
|
$mail = id(new PhabricatorMetaMTAMail())
|
||||||
|
->addTos($tos)
|
||||||
|
->addCCs($ccs)
|
||||||
|
->setSubject($subject)
|
||||||
|
->setBody($body)
|
||||||
|
->setOverrideNoSelfMailPreference(true)
|
||||||
|
->setIsHTML($is_html)
|
||||||
|
->setIsBulk($is_bulk)
|
||||||
|
->setMailTags($tags);
|
||||||
|
|
||||||
|
if ($from) {
|
||||||
|
$mail->setFrom($from->getPHID());
|
||||||
|
}
|
||||||
|
|
||||||
|
$mail->save();
|
||||||
|
$mail->sendNow();
|
||||||
|
|
||||||
|
$console->writeErr(
|
||||||
|
"%s\n\n phabricator/ $ ./bin/mail show-outbound --id %d\n\n",
|
||||||
|
pht("Mail sent! You can view details by running this command:"),
|
||||||
|
$mail->getID());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue