E-Mails an der Kommandezeile ab Exchange 2010 und in der Cloud versenden (auch Linux)

Da Exchange ab 2010 für den Standard SMTP-Connector immer TLS für Authentifizierte Verbindungen vorsieht, fallen die guten altgedienten Kommandozeilen-Tools wie Blat, smtpsend und ähnliche leider aus. Glücklicherweise gibt es ein ganz brauchbares Tool das STARTTLS beherrscht und somit diese neu entstandene Lücke im Repertoir der Batchhacker auffüllt: SendEmail.

SendEmail ist ein sehr schlanker SMTP-Mail-Client für die Kommandozeile. Es wurde entwickelt um schnell und einfach in Bash-Skripts, Batch-Dateien, Perl-Programmen und Web-Sites verwendet zu werden, ist sehr anpassungsfähig und beherrscht sowohl SSL als auch TLS. SendEmail ist ursprünglich in Perl geschrieben und einzigartig, weil es fertig gepackt daherkommt und keine externen Module benötigt. Eine ganz klare Empfehlung für Admins.

SendEmail steht unter der GNU GPL unter der Version 2 und unterstützte zahlreiche Plattformen: Linux, BSD, OS X, Windows 98, Windows NT, Windows 2000, und Windows XP.

Benutzung:

sendEmail.exe -a %1 -f %smtp_sender% -t %smtp_receiver% -m "%smtp_message%" -u "%smtp_subject%"  -s %smtp_server%:%smtp_port% -xu %smtp_username% -xp %smtp_password%

Office365 Exchange Primäre E-Mail Adresse (Absenderadresse) ändern

Die Hauptadresse ist die Standard-Absenderadresse eines Postfaches. Diese erscheiun immer wenn man aus Outlook oder der Outlook Web App eine E-Mail versendet. Leider ist das Ändern der Absenderadresse nicht im Portal möglich, hier lassen sich nur zusätzliche Adressen hinzufügen.

Lösung

  1. Eine Remote-Powershell mit dem Office 365 Exchange verbinden
  2. Das Postfach mit set-mailbox konfigurieren:
    Set-Mailbox MAILBOXNAME -EmailAddresses SMTP:[email protected],[email protected]

Wichtig:Wenn der 2. Parameter weggelassen wird, wird die SMTP-Proxyadressenliste ersetzt.

Office365 Exchange – Weiterleiten von E-Mails nur ohne Quelladresse

Der Office365 Exchange Server hat eine ärgerliche Funktionseinschränkung. Da ich jetzt schon ein paar mal über genau diese Frage gestolpert bin, sei die Sachlage nun hiermit für jeden dargelegt. Vielleicht ändert Microsft das in der nächsten Wave ja, das wäre fein.

Der Effekt ist schnell erklärt: Wenn man in Outlook eine E-Mail Weiterleitet, bleibt die Adresse des Senders erhalten:

Von: Foo Bar [mailto:[email protected]]

Wenn man genau das selbe in der Outlook WebApp tut, ist der Absender plötzlich verschwunden:

 Von: Foo Bar

Dieses Verhalten von Exchange Online ist so „korrekt“. Die offizielle Antwort (Zitat, die Fehler sind nicht von mir) des MSFT-Supports lautet (Marketing-Blasen sind durch „…“ ersetzt):

Outlook Web App […] etwas beschänkte Funktionalität im Vergleich zu Outlook […]. Deshalt […] von Dir gewünschte Funktion kann man nicht machen.

Damit ist die Exchange Online WebApp so schick die auch ist, für mich in vielen Fällen praktisch nutzlos. Ich ich leite viele E-Mails zur direkten Bearbeitung an den passenden Mitarbeiter weiter, aber wenn der neue Empfänger dem Absender nicht zurückschreiben kann, ist das natürlich sinnlos. Ich persönlich kann mit natürlich behelfen, aber ich muss gestehe von einem OutlookWebApp Client doch die Fähigkeit zur Weiterleitung einer E-Mail erwartet zu haben.

Interessanterweise ist das in Exchange 2010 an sich durchaus möglich; On-Premise Kunden haben an dieser Stelle funktional also die Nase vorn.

Exchange 2010 Arbeitsspeichernutzung beschränken (store.exe limitieren)

Unter normalen Umständen nutzt der Microsoft Exchange 2010 Informationsspeicher den gesamten zur Verfügung stehenden Arbeitsspeicher aus. Bei einer Postfachdatenbank von 10gb können das allerdigns auch oft merh als 20gb RAM sein. Dieser gigantische erscheinende Arbeitsspeicherverbrauch optimiert die Leistung des Exchange Informationsspeichers (Information Store) erheblich und ist an sich eine gute Idee.

Schwierig wird es, wenn ausser dem Exchange noch andere Ram-intensive Programme auf dem selben Server laufen. Nach Microsoft-Denke kommt das natürlich niemals vor, aber schon am SBS wird deutlich das das Konzept nicht immer so fehlerlos aufgeht und eine Einschränkung durchaus  sinnvoll sein kann.

Exchange ist glücklicherweise auch in der Lage, seine Arbeitsspeichernutzung zu begrenzen. In einigen Fällen kann das aber zu deutlich erhöhter IO-Last durch die zunehmende Datenträgeraktivität führen. Die IO-Aktivität des betreffenden Server sollte also auch weiterhin im Auge behalten werden, oder wenn schon vorher nicht dann nach der Änderung besonders.

Lösung:

  1. adsiedit starten und mit dem Configuration Namenskontext verbinden exchange_2010_limit_ram_1
  2. Navigiere zu
    Configuration -> CN=Services -> CN=Microsoft Exchange -> CN=First Organization (=Organisationsname) -> CN=Administrative Groups > CN=Exchange Administrative Group (FYDIBOHF23SPDLT) (=Name der administrativen Gruppe) -> CN=Servers -> CN=”Servername” -> InformationStore
    und öffne die Eigenschaften des Eintrags „Information Store“. Ändere hier die Werte von msExchESEParamCacheSizeMax und msExchESEParamCacheSizeMin  auf den gewünschten Wert (angegeben in Pages). Achtung, erstens verwendet Exchange 2010 nur 32kb große Pages und zweitens greift der Wert nur, wenn beide Einträge angepasst werden. Man rechnet also rückwärts den Speicher-Wert aus: 4gb=4.194.304 KB / 32 KB => 131072 Pages

    1. Beispiel für 1GB: 32768
    2. Beispiel für 4GB: 131072
    3. Beispiel für 10GB: 327680

    exchange_2010_limit_ram_2

  3. Den Dienst Microsoft Exchange-Informationsspeicher (MSExchangeIS) jetzt noch neu starten und fertig.
    net stop MSExchangeIS && net start MSExchangeIS

 

Exchange 2010 Adressen und Domains zur Whitelist hinzufügen

In der EMC gibt es keine grafische Ansicht für die Whitelistenkonfiguration. Aber EMS tot he rescue!

Wie sieht die aktuellen Whitelisten aus?

Get-ContentFilterConfig 

Eine einzelne E-Mail Adresse zur Whitelist hinzufügen:

 $list = (Get-ContentFilterConfig).BypassedSenders
$list.add("[email protected]")
Set-ContentFilterConfig -BypassedSenders $list 

Eine ganze Domain zur Whitelist hinzufügen:

 $list = (Get-ContentFilterConfig).BypassedSenderDomains
$list.add("domain.com")
Set-ContentFilterConfig -BypassedSenderDomains $list