diff --git a/EcAlerter.h b/EcAlerter.h index e34d951..4801448 100644 --- a/EcAlerter.h +++ b/EcAlerter.h @@ -220,6 +220,13 @@ * NB. The value of the Subject field is used as a template * in the same way as the Replacement fields. *
+ *The Threaded is just like the Email array except that + * it is only used for alarm messages, and the messages sent to the + * addresses in this array form a chain of linke messages referring + * back to each other rather than all being versions of the same + * message. This may give a better effect for people using mail + * clients which don't support the message-ID header well. + *
* *Configuration of the alerter is done by the 'Alerter' key in the user
* defaults system. The value for this key must be a dictionary configuring
@@ -293,6 +300,7 @@
GSMimeSMTPClient *smtp; /** Client connection to MTA */
BOOL debug; /** Debug enabled in config */
BOOL supersede; /** If a clear should replace original */
+ BOOL eThreaded; /** alarm reminder emails threaded */
}
/** Called when user defaults are updated, this fetches the dictionary
diff --git a/EcAlerter.m b/EcAlerter.m
index 690b868..6e314a6 100644
--- a/EcAlerter.m
+++ b/EcAlerter.m
@@ -344,9 +344,9 @@ replaceFields(NSDictionary *fields, NSString *template)
GSMimeDocument *doc;
doc = AUTORELEASE([GSMimeDocument new]);
- [doc setHeader: @"subject" value: subject parameters: nil];
- [doc setHeader: @"to" value: address parameters: nil];
- [doc setHeader: @"from" value: eFrom parameters: nil];
+ [doc setHeader: @"Subject" value: subject parameters: nil];
+ [doc setHeader: @"To" value: address parameters: nil];
+ [doc setHeader: @"From" value: eFrom parameters: nil];
[doc setContent: text type: @"text/plain" name: nil];
[[self _smtp] send: doc];
}
@@ -660,6 +660,80 @@ replaceFields(NSDictionary *fields, NSString *template)
}
NS_ENDHANDLER
+ NS_DURING
+ {
+ o = [d objectForKey: @"Threaded"];
+ if ([o isKindOfClass: [NSString class]] == YES)
+ {
+ if ([o hasPrefix: @"("])
+ {
+ o = [(NSString*)o propertyList];
+ }
+ else
+ {
+ o = [NSArray arrayWithObject: o];
+ }
+ }
+ if (o != nil)
+ {
+ NSString *s = [d objectForKey: @"Subject"];
+
+ if (reminder > 0)
+ {
+ NSString *emailIdentifier;
+ NSString *emailInReplyTo;
+
+ if (1 == reminder)
+ {
+ emailInReplyTo = identifier;
+ emailIdentifier
+ = [identifier stringByAppendingString: @"_1"];
+ }
+ else
+ {
+ emailInReplyTo
+ = [NSString stringWithFormat: @"%@_%d",
+ identifier, reminder - 1];
+ emailIdentifier
+ = [NSString stringWithFormat: @"%@_%d",
+ identifier, reminder];
+ }
+
+ [m setObject: emailIdentifier
+ forKey: @"EmailIdentifier"];
+ [m setObject: emailInReplyTo
+ forKey: @"EmailInReplyTo"];
+ }
+
+ if (s != nil)
+ {
+ [m setObject: s forKey: @"Subject"];
+ }
+
+ s = [d objectForKey: @"EmailReplacement"];
+ if (nil == s)
+ {
+ s = [d objectForKey: @"Replacement"];
+ if (nil == s)
+ {
+ /* Full details. */
+ s = @"{Server}({Host}): {Timestamp} {Type}"
+ @" - {Message}";
+ }
+ }
+ [m setObject: s forKey: @"Replacement"];
+ [self mail: m identifier: identifier isClear: isClear to: o];
+ }
+ }
+ NS_HANDLER
+ {
+ NSLog(@"Exception handling Email send for rule: %@",
+ localException);
+ }
+ NS_ENDHANDLER
+ [m removeObjectForKey: @"EmailIdentifier"];
+ [m removeObjectForKey: @"EmailInReplyTo"];
+
NS_DURING
{
o = [d objectForKey: @"Sms"];
@@ -904,15 +978,71 @@ replaceFields(NSDictionary *fields, NSString *template)
[self _smtp];
doc = AUTORELEASE([GSMimeDocument new]);
- [doc setHeader: @"subject" value: subject parameters: nil];
+ [doc setHeader: @"Subject" value: subject parameters: nil];
[doc setContent: text type: @"text/plain" name: nil];
- [doc setHeader: @"from" value: eFrom parameters: nil];
+ [doc setHeader: @"From" value: eFrom parameters: nil];
if ([identifier length] > 0)
{
NSString *mID;
- mID = [NSString stringWithFormat: @"