Can this SQL be made more efficient and combined into one select?
As a first pass, I'd see whether you can eliminate the temporary tables. I like CTE's but they don't always provide better performance. 

;WITH tmp_Attachments_Sent_To_smc AS
(
    -- Find all the emails to smc+
    -- that had attachments 
    -- and something else
    SELECT
        [date] = CONVERT(date, M.crdate)
    ,   [tally sent to smc w/ attachment] = COUNT(*)
    ,   [total MB size] = SUM(CAST(AD.Size AS decimal(10, 2))) / 1024 / 1024
    FROM
        AttachmentDetail AD
        INNER JOIN 
            MessageAttachment MA
            ON AD.AttachmentId = MA.AttachmentId
        INNER JOIN 
            MessageRecipient MR
            ON MA.MessageId = MR.MessageId
        INNER JOIN 
            [Message] M
            ON MR.MessageId = M.id
    WHERE
        AD.isinline &lt;&gt; 1
        AND MR.RecipientTypeId = 2
        AND LEFT(mr.EmailAddress, 4) = 'smc+'
    GROUP BY
        CONVERT(date, M.crdate)
)
, tmp_Attachments_Sent_from_smc AS
(
    SELECT
        [date] = CONVERT(date, M.crdate)
    ,   [tally sent from smc w/ attachment] = COUNT(*)
    ,   [total MB size] = SUM(CAST(AD.Size AS decimal(10, 2))) / 1024 / 1024
    FROM
        AttachmentDetail AD
        INNER JOIN 
            MessageAttachment MA
            ON AD.AttachmentId = MA.AttachmentId
        INNER JOIN 
            MessageRecipient MR
            ON MA.MessageId = MR.MessageId
        INNER JOIN 
            [Message] M
            ON MR.MessageId = M.id
    WHERE
        AD.isinline &lt;&gt; 1
        AND MR.RecipientTypeId = 1
        AND LEFT(mr.EmailAddress, 4) = 'smc+'
    GROUP BY
        CONVERT(date, M.crdate)
)
, tmp_Sent_to_smc AS
(
    SELECT
        [date] = CONVERT(date, M.crdate)
    ,   [grand total sent to smc] = COUNT(*)
    ,   [total MB size sent to smc] = SUM(CAST(Size AS decimal)) / 1024 / 1024
    FROM
        [Message] M
    WHERE
        MessageSourceId = 2
    GROUP BY
        CONVERT(date, crdate)
)
, tmp_Sent_from_smc AS
(
    SELECT
        [date] = CONVERT(date, M.crdate)
    ,   [grand total sent from smc] = COUNT(*)
    ,   [total MB size sent from smc] = SUM(CAST(Size AS decimal)) / 1024 / 1024
    FROM
        [Message] M
    WHERE
        MessageSourceId = 1
    GROUP BY
        CONVERT(date, crdate)
)
SELECT
    A.*
,   B.[tally sent from smc w/ attachment]
,   B.[total MB size]
,   C.[grand total sent from smc]
,   C.[total MB size sent from smc]
,   D.[grand total sent to smc]
,   D.[total MB size sent to smc]
FROM
    tmp_Attachments_Sent_To_smc A
    INNER JOIN 
        tmp_Attachments_Sent_from_smc B
        ON A.date = b.date
    INNER JOIN 
        tmp_Sent_from_smc C
        ON A.date = C.date
    INNER JOIN 
        tmp_Sent_to_smc D
        ON A.date = D.date;


Otherwise, what is probably hurting your performance are the conversions in your WHEREs and GROUP BY (CONVERT(date, M.crdate) CAST(AD.Size AS decimal(10, 2). Those are likely resulting in table scans which hurts you. You could also look at persisted computed columns if you can't modify the existing data types as a means to store those computed items.

I'm staring at the LEFT(mr.EmailAddress, 4) and I think that'll also force a table scan but I think it can be fixed with a mr.EmailAddress LIKE 'smc+%' That should at least be SARGAble.

At that point, you should be able to look at your query plans and determine whether an index could help.

Also, prefix your tables with the appropriate schema. I presume it's dbo but as I understand it, that will help with plan cache reuse.