Let the platform do the work

Mailer Factory

Overview

The Mailer Factory, located in ./modules/Mailer/MailerFactory.php, helps developers generate outbound mailers for the system account as well as individual user accounts. The Mailer Factory is a replacement for SugarPHPMailer which is now deprecated.

Mailers

There are two types of outbound mailers: System and User. The follow sections will outline how to use each.

System Mailer

The system outbound mailer can be set using the getSystemDefaultMailer method. This will set the mailer to use the system outbound email account. 

Example

$mailer = MailerFactory::getSystemDefaultMailer();

User Mailer

The user outbound mailer can be set using the getMailerForUser method. This will set the mailer to use the outbound email account for a specific user. 

Example

$user = BeanFactory::getBean("Users", 1);
$mailer = MailerFactory::getMailerForUser($user);

Populating the Mailer

Setting the Subject

To set the email subject, use the setSubject method. It accepts a plain text string.

Example

$mailer->setSubject("Test Mail Subject");

Setting the Body

Depending on your email type, you can use the setTextBody and/or setHtmlBody methods respectively to populate the content of the email body.

Example

// Text Body
$mailer->setTextBody("This is a text body message");

// HTML Body
$mailer->setHtmlBody("This is an <b>HTML</b> body message. <br> You can use html tags.");

Note: The email HTML body is not necessary if you have populated the text body.

Adding Recipients

To add recipients to your email, you can use the addRecipientsTo, addRecipientsCc, or addRecipientsBcc methods . These methods require an EmailIdentity object as a parameter.

Example

$mailer->addRecipientsTo(new EmailIdentity('user1@yourcompany.crm', 'User 1'));
$mailer->addRecipientsCc(new EmailIdentity('user2@yourcompany.crm', 'User 2'));
$mailer->addRecipientsBcc(new EmailIdentity('user3@yourcompany.crm', 'User 3'));

Clearing Recipients

You can clear the current recipients specified in the mailer by using the clearRecipients method.

Example

$to = true; 
$cc = true; 
$bcc = true;

$mailer->clearRecipients($to, $cc, $bcc);

Adding Attachments

To add attachments, use the addAttachment method.

Example

$path = "/path/to/your/document";
$mailer->addAttachment(new Attachment($path));

Sending Emails

Once your email is populated, you can send it using the send method. The send method will return the content of the mail. If the Mailer Factory experiences an error, it will throw an exception. It is highly recommended to use a try and catch when sending emails.

Example

$mailSubject = "Test Mail Subject";
$mailHTML = "<h1>SugarCRM</h1><br> Test body message";
$mailTo = array(
    0 => array(
        'name' => 'Test User',
        'email' => 'test@yourcompany.crm',
    ),
    1 => array(
        'name' => 'Other Recipient',
        'email' => 'email@addres'
    )
);

$mailAttachment = "/path/to/pdf/files/document.pdf";

try {
    $mailer = MailerFactory::getSystemDefaultMailer();
    $mailTransmissionProtocol = $mailer->getMailTransmissionProtocol();
    $mailer->setSubject($mailSubject);
    $body = trim($mailHTML);
    $textOnly = EmailFormatter::isTextOnly($body);
    if ($textOnly) {
        $mailer->setTextBody($body);
    } else {
        $textBody = strip_tags(br2nl($body)); // need to create the plain-text part
        $mailer->setTextBody($textBody);
        $mailer->setHtmlBody($body);
    }
    $mailer->clearRecipients();
    foreach ($mailTo as $mailTo) {
        $mailer->addRecipientsTo(new \EmailIdentity($mailTo['email'], $mailTo['name']));
    }
    $mailer->addAttachment(new \Attachment($mailAttachment));
    $result = $mailer->send();
    if ($result) {
        // $result will be the body of the sent email
    } else {
        // an exception will have been thrown
    }
} catch (MailerException $me) {
    $message = $me->getMessage();
    switch ($me->getCode()) {
        case \MailerException::FailedToConnectToRemoteServer:
            $GLOBALS["log"]->fatal("BeanUpdatesMailer :: error sending email, system smtp server is not set");
            break;
        default:
            $GLOBALS["log"]->fatal("BeanUpdatesMailer :: error sending e-mail (method: {$mailTransmissionProtocol}), (error: {$message})");
            break;
    }
}