datalust / seq-app-htmlemail Goto Github PK
View Code? Open in Web Editor NEWPlug-in apps that act on event streams in the Seq log server
License: Apache License 2.0
Plug-in apps that act on event streams in the Seq log server
License: Apache License 2.0
I'd like to see a UseDefaultCredentials setting added to Seq.App.EmailPlus and Seq.App.Replication.
This setting activates default credentials on sending email or replicate messages.
Can you add this feature? Or add me as a contributor of this repository and I will send you a pull request.
Version 4 passes log data through as IReadOnlyDictionary<string, object>
, not IDictionary<string, object>
, which causes structure values to be replicated as strings.
The fix should be backwards-compatible, as v3's dictionaries will also support this interface.
Emails generated with EmailPlus need some control over how dates are rendered. A helper like:
{{local_date SomeDate "yyyy"}}
or:
{{utc_date SomeDate "o"}}
would help to produce more readable date output.
An email digest has been a frequently-requested app. To get the smoothest configuration experience, an entirely new app, perhaps based on EmailPlus, seems like the best way there.
Hi
I've had success in the past with Seq.Apps but I haven't been able to get my Seq Apps to work since updating to Seq v3 (the specific version I'm on is 3.3.23). To make my issue easily replicable, I cloned this repo, open sln, and replaced everything in the Seq.App.FileArchive On method with an internal log. Ie.
public void On(Event<LogEventData> evt)
{
this.Log.Debug("log me");
}
I package it with nuget v3.4.4, install it and start an instance in my local Seq, then manually add an event, and after waiting a while I don't see any log.
Is this just something funny I'm experiencing/doing-wrong or is there an issue?
Thanks
Steve
I would like to propose adding support for sending emails to recipients specified in a context object of a seq log.
Implementation would involve adding a backing field to the To
property and assigning it in a manner similar to how SubjectTemplate
's backing field is assigned in the constructor of EmailReactor
.
Thoughts?
The implementations of certain Serilog sinks, namely file, rolling file, periodic batching and seq, are supplied by the Seq host when running a Seq app.
Because of the change in assembly layout in Serilog 2 it's not possible currently for Seq to load apps built against the Serilog 1.5 versions of these sinks.
By IL-merging or otherwise embedding the 2.0 versions of the sinks above, a single app version should again be able to run on all Seq versions.
It's no longer convenient to develop/maintain each of the apps in this repository together, given their different rates of evolution. The build scripts are also not geared towards multi-package projects (moving the version forwards requires editing each CSPROJ).
seq-app-htmlemail
/"Email+" may be the best destination for it, since the HTML email app in here has had the longest and richest development history.seq-app-filearchive
seq-app-firstoftype
seq-app-thresholds
seq-app-replication
I'm getting this error in the internal HtmlEmail diagnostics log:
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at HandlebarsDotNet.Collections.FixedSizeDictionary`3.AddOrReplace(TKey& key, TValue& value, EntryIndex`1& index)
at HandlebarsDotNet.ValueProviders.ObjectIteratorValues..ctor(BindingContext bindingContext)
at HandlebarsDotNet.Iterators.DictionaryIterator`3.Iterate(EncodedTextWriter& writer, BindingContext context, ChainSegment[] blockParamsVariables, Object input, TemplateDelegate template, TemplateDelegate ifEmpty)
at HandlebarsDotNet.Iterators.DictionaryIterator`3.HandlebarsDotNet.Iterators.IIterator.Iterate(EncodedTextWriter& writer, BindingContext context, ChainSegment[] blockParamsVariables, Object input, TemplateDelegate template, TemplateDelegate ifEmpty)
at HandlebarsDotNet.Compiler.Iterator.Iterate(BindingContext context, EncodedTextWriter writer, ChainSegment[] blockParamsVariables, Object target, TemplateDelegate template, TemplateDelegate ifEmpty)
at lambda_method115(Closure , EncodedTextWriter& , BindingContext )
at HandlebarsDotNet.Helpers.BlockHelpers.DelegateBlockHelperDescriptor.HandlebarsDotNet.Helpers.IHelperDescriptor<HandlebarsDotNet.BlockHelperOptions>.Invoke(EncodedTextWriter& output, BlockHelperOptions& options, Context& context, Arguments& arguments)
at lambda_method116(Closure , EncodedTextWriter& , BindingContext )
at HandlebarsDotNet.Helpers.BlockHelpers.DelegateBlockHelperDescriptor.HandlebarsDotNet.Helpers.IHelperDescriptor<HandlebarsDotNet.BlockHelperOptions>.Invoke(EncodedTextWriter& output, BlockHelperOptions& options, Context& context, Arguments& arguments)
at lambda_method117(Closure , EncodedTextWriter& , BindingContext )
at HandlebarsDotNet.HandlebarsEnvironment.<>c__DisplayClass15_0.<Compile>b__0(TextWriter writer, Object context, Object data)
at HandlebarsDotNet.HandlebarsEnvironment.<>c__DisplayClass16_0.<Compile>b__0(Object context, Object data)
at Seq.App.EmailPlus.EmailApp.FormatTemplate(HandlebarsTemplate`2 template, Event`1 evt, Host host) in C:\projects\seq-app-htmlemail\src\Seq.App.EmailPlus\EmailApp.cs:line 216
at Seq.App.EmailPlus.EmailApp.OnAsync(Event`1 evt) in C:\projects\seq-app-htmlemail\src\Seq.App.EmailPlus\EmailApp.cs:line 141
at SeqCli.Apps.Hosting.AppContainer.SendTypedEventAsync(String clef) in C:\projects\seqcli\src\SeqCli\Apps\Hosting\AppContainer.cs:line 113
Settings:
{
"From": "[email protected]",
"To": "[email protected]",
"SubjectTemplate": "",
"Host": "smtp.gmail.com",
"Port": 587,
"EnableSsl": "True",
"BodyTemplate": "",
"SuppressionMinutes": 5,
"Username": "[email protected]",
"Password": "[seq-preserve]"
}
Version: 3.1.0-dev-00179
I can send an event to the app and the email gets sent, but the automatic emails aren't sent.
MailKit.Security.SslHandshakeException: An error occurred while attempting to establish an SSL or TLS connection.
When connecting to an SMTP service, port 587 is typically reserved for plain-text connections. If you intended to connect to SMTP on the SSL port, try connecting to port 465 instead.
I think we will need to switch back to (requiring) STARTTLS when the "Enable SSL" checkbox is ticked. The implementation we use will be equivalently secure in this configuration because it doesn't fall back to plain text.
In the long run, implicit SSL should be supported, too.
In order to eliminate double logging I would like to be able to run FileArchiver as a archiver and not second data recorder. I mean retention system should be able to trigger FileArchiver to backup the events that will be wiped out.
I'd like to see a substring helper added to Email+ so a part of the event message could be added to the email subject line.
Something like: {{trimString value 0 30}}
to pull out the first 30 characters.
I can't get replication to work from one docker instance to another. Replication from our Windows VM based Seq works fine to both docker instances.
Under apps I can see a count for "events received by the app" but nothing is reaching the other docker instance.
There are no events reported as being emitted by the app. Let me know if there's any other logs/information I can provide.
We have our SEQ deployed in an container, can we set the file path to a cloud location for long term storage, or does the location need to be relative to the container? For instance, can in save to blob storage in azure?
Email+ crashes when I try to send Warning-level events. I'm using NLog, which labels the Warning event 'Warn' instead of 'Warning', which is why I assume it's crashing.
Curiously, the app does NOT throw an error for 'Info' level events, even though the Serilog version is labeled 'Information'.
As a side note, I have no idea how to restart a crashed App. My instance wouldn't send any more emails after it crashed. I had to remove the instance and create a new one, which seems kinda silly.
Here's the full stack trace:
System.ArgumentException: Requested value 'Warn' was not found.
at System.Enum.EnumResult.SetFailure(ParseFailureKind failure, String failureMessageID, Object failureMessageFormatArgument)
at System.Enum.TryParseEnum(Type enumType, String value, Boolean ignoreCase, EnumResult& parseResult)
at System.Enum.Parse(Type enumType, String value, Boolean ignoreCase)
at Serilog.Formatting.Compact.Reader.LogEventReader.ReadFromJObject(Int32 lineNumber, JObject jObject)
at Seq.Apps.GenericHost.AppHost.<SendAsync>d__19.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Seq.Apps.GenericHost.Program.<Main>d__0.MoveNext()
Hi
Similar to this issue I'm getting the following exception when I try to load my seq app (as shown in C:\ProgramData\Seq\Logs).
System.MissingMethodException: Method not found
Is there anywhere we can see which versions of Seq and Serilog match up so that we don't receive this issue? I'm finding it hard to know when I should or shouldn't be seeing this error.
Our Seq version is Seq 3.2.16.
My SeqApp is:
(I don't include these in the nuget package).
The replication app uses the Serilog sink for Seq to ship events to a second Seq instance. A recent fix over there extended the retry limit for failed batches up to 10 minutes; we should update Seq.App.Replication to the latest version to take advantage of this.
This
https://github.com/datalust/seq-apps/blob/master/src/Seq.App.FileArchive/ArchiveWriterReactor.cs#L55
line of code leads to performance degradation due to relatively excessive memory allocations on each call to ToString() and Enum.Parse().
Consider change it from
(Serilog.Events.LogEventLevel)Enum.Parse(typeof(Serilog.Events.LogEventLevel), evt.Data.Level.ToString())
to more explicit form
var sle = new LogEvent(
evt.Data.LocalTimestamp,
Convert(evt.Data.Level),
null,
mtp.Parse(evt.Data.MessageTemplate),
properties);
private static Serilog.Events.LogEventLevel Convert(Apps.LogEvents.LogEventLevel level)
{
switch (level)
{
case Apps.LogEvents.LogEventLevel.Debug: return Serilog.Events.LogEventLevel.Debug;
case Apps.LogEvents.LogEventLevel.Error: return Serilog.Events.LogEventLevel.Error;
case Apps.LogEvents.LogEventLevel.Fatal: return Serilog.Events.LogEventLevel.Fatal;
case Apps.LogEvents.LogEventLevel.Information: return Serilog.Events.LogEventLevel.Information;
case Apps.LogEvents.LogEventLevel.Verbose: return Serilog.Events.LogEventLevel.Verbose;
case Apps.LogEvents.LogEventLevel.Warning: return Serilog.Events.LogEventLevel.Warning;
default: throw new NotSupportedException(level.ToString());
}
}
Also, as I can see, there is no need to call
var mtp = new MessageTemplateParser();
and then
mtp.Parse(evt.Data.MessageTemplate)
each time Event<LogEventData> evt
arrived. Serilog MessageTemplate
is an immutable object, and we have the same parsed message template each time the same evt.Data.MessageTemplate
arrived. Since the set of all message templates is bounded (ok, if the client follows best practics - https://github.com/serilog/serilog/wiki/Writing-Log-Events) we can cache MessageTemplate
object in private readonly ConcurrentDictionary<string, MessageTemplate>
. This, of course, can lead to excessive growth of cache in case of not recommended usage (inclusion properties inside message) like 'user ID=123456 logged at 2017-12-02 17:39:26'. So this cached behavior may be optional and disabled by default:
[SeqAppSetting(IsOptional = true, DisplayName = "Cache message templates")]
public bool? EnableMessageTemplatesCache { get; set; }
Currently in EmailPlus, the {{$EventType}}
property uses $ + X8 format ($06EF5A34
). See EmailReactor.cs#L144
It is not compatible with the url querystring format (it expects 0x06EF5A34
).
The consequence is that we can't create a link which open seq filtered with all the events for this EventType.
Can we change the format of the value ? Or create another property with a correct format if backward compatibility is an issue ?
Good Morning,
The time listed on the email notifications is UTC, I tried copying the template and changing $UtcTimestamp to $LocalTimestamp. I tried using the server timestamp option on all ingestion inputs, this also did not work. I verified all machines have correct timezone and time set. How can i make this show correctly in the email notifications?
It's pretty common to want to send emails to more than 1 recipient at a time without having to create a new instance for every email address.
Typically you just separate multiple recipients with ; in the "To" section of the email.
The code change would be simply; after creating the mail message, split on ";" and looping through the splits to add the recipients to the mail message "To" collection.
https://github.com/continuousit/seq-apps/blob/master/src/Seq.App.Email/EmailReactor.cs#L89
I'll create a pull request for this later today.
After updating some settings on our Email+ app instances, all the app processes have started to fail reporting the message The app host process is stopped.
Seq version: 5.1.3004
Email+ version: 2.0.92
The log reports the following error:
System.MissingMethodException: Method not found: 'Serilog.Events.LogEvent Serilog.Formatting.Compact.Reader.LogEventReader.ReadFromJObject(Newtonsoft.Json.Linq.JObject)'.
at Seq.Apps.GenericHost.AppHost.ReadSerilogEvent(String clef, String& eventId, UInt32& eventType)
at Seq.Apps.GenericHost.AppHost.d__17.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Seq.Apps.GenericHost.AppHost.d__16.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Seq.Apps.GenericHost.Program.
Any idea about what could be the reason?
Thanks in advance
Add an optional setting to Email+ instances to set one or more CC or BCC addresses to emails with the standard Handlebars support. We currently achieve a similar effect by creating a duplicate Email+ instance with a different set of addresses, but this quickly becomes unmanageable.
I get this error when running the replication app in Seq. (3.3.12-pre)
2016-08-24 22:01:28.480 +00:00 [Information] Updated "appinstance-232" 2016-08-24 22:01:28.841 +00:00 [Error] Failed to load "Big Red Box (preprod)" System.MissingMethodException: Method not found: 'Serilog.LoggerConfiguration Serilog.SeqLoggerConfigurationExtensions.Seq(Serilog.Configuration.LoggerSinkConfiguration, System.String, Serilog.Events.LogEventLevel, Int32, System.Nullable
1<System.TimeSpan>, System.String, System.String, System.Nullable1<Int64>)'. at Seq.App.Replication.Replicator.OnAttached() at Seq.Server.Features.Runner.AppHost..ctor(ILogger logger, Func
2 createReactorInstance, HostedApp hostedApp, AppInstance appInstance, AppHostSettings settings)
at Seq.Server.Features.Runner.AppHost..ctor(IInternalEventPublisher publisher, HostedApp hostedApp, AppInstance appInstance, AppHostSettings settings)
at Seq.Server.Features.Runner.SandboxedAppContainer.Initialize(IInternalEventPublisher publisher, String hostedApp, String appInstance, AppHostSettings settings)
at Seq.Server.Features.Runner.SandboxedAppContainer.Initialize(IInternalEventPublisher publisher, String hostedApp, String appInstance, AppHostSettings settings)
at Seq.Server.Features.Runner.RunningApp.LoadSandboxedAppContainer(AppDomain domain, HostedApp app)
at Seq.Server.Features.Runner.RunningApp.Run()`
First of all, thanks for Seq and all its awesomeness.
We don't support secure (SSL/TLS) servers internally for sending emails. The latest version will check if TLS is available and "switch to it." But that fails because our certificates are self-signed. I realize this is a company IT problem -- but I doubt I'm the only one with this problem.
Possible Options for the plugin:
I'm happy to implement these solutions and make a PR. But I don't want to waste time if you don't want the plugin going down this road, @nblumhardt.
For now, I'm keeping the plugin version on v3.0.0.
Thanks!
The per-event-type suppression feature uses a concurrent dictionary _lastSeen
:
https://github.com/datalust/seq-app-htmlemail/blob/dev/src/Seq.App.EmailPlus/EmailApp.cs#L21
The dictionary is still updated even when no suppression time is set, and the entries here aren't evicted after the suppression time elapses, resulting in leaks if e.g. every event reaching the app has a unique event type.
Serilog's compact JSON format is a great archival format for Seq logs. We should add a Boolean option to Seq.App.FileArchive to write logs in compact JSON rather than text.
Hello guys,
I'm trying now to send a message with <br/>
in it but it fails :(
The body template is
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">`
<head>
</head>
<body>
\{{$Message}}
</body>
</html>
in {{$Message}} I have something like "Hello<br/>world"
The result is simply \ followed by the escaped message.
source for the syntax: https://handlebarsjs.com/expressions.html
Simple property names should be able to be substituted into the message using simple Handlebars syntax.
https://github.com/continuousit/seq-apps/blob/master/src/Seq.App.EmailPlus/EmailReactor.cs#L111
Via: http://docs.getseq.net/v2/discuss/55f2ceb7d1c4c7170033df5d
Hi there,
It would be nice to have two running instances of Seq in Active/Active mode.
We are about to deploy a big project and we choose Seq for our logs. The Seq instances will be sitting on different servers and will be accessed using a Load Balancer.
So requirement is that the two servers will be sending the logs to each other and no duplication of requests will occurred.
An easy way to do it, is to enrich the Replication Logger with a property (to mark that the specific event is because of replication process) and each Replication Logger will skip all events that where created due to replication purposes.
Requires an update to the Seq.Apps package
Hi Folks,
Has anyone considered using something like this https://github.com/twitter/AnomalyDetection to do anomaly detection on an event stream?
Seems like a match made in Heaven if it weren't for the fact that the algorithm was implemented in R and either needs to be marshaled across process boundaries or converted to C#.
Anyway, I'm considering switching to Seq for monitoring on the backend and am excited by what I see you all have put together.
Using: HTML Email 3.1.0-dev-00179 on Seq 2022.1
I have configured an alert:
select count(*) as count
from stream
where @Message like 'Hello%'
group by time(1m)
having count > 0
limit 100
I am sending test events with the following template: "@mt":"Hello, {User}", "User":"desmondgc"
If I specify a subject template like "Alert for {{User}} test" for the notification, the resulting email does not include the user value. Instead, the subject becomes:
Alert for test
If I instead use one of the built-in properties like $Id or $EventType, the template is properly filled.
Isn't it possible to use custom properties for alert notification subject?
How to use handlebarsjs custom helpers with from template in Seq and Seq.App.EmailPlus? I get the following error when I try to use a handlebarsjs custom helper: HandlebarsDotNet.HandlebarsRuntimeException: Template references a helper that cannot be resolved. Helper 'formatDate'
<html>
<head>
<script type="text/javascript">
alert(Handlebars);
Handlebars.registerHelper('formatDate', function(date) {
return new Date(date).toLocaleDateString() + ' ' + new Date(date).toLocaleTimeString();
});
</script>
</head>
<body>
<divstyle="display: none;" id="entry-template">{{formatDate "2019-01-01"}}</div>
<div id="placeholder"></div>
</body>
</html>
I am using EmailPlus app in Seq, but when I try to log an error, I keep getting this error. Looks like a problem with template. Any ideas?
The event event-c5b937eff46308d20b00000000000000 could not be sent to Email Errors.
AppId
hostedapp-5
AppInstanceId
appinstance-12
AppInstanceTitle
Email Errors
EventId
event-c5b937eff46308d20b00000000000000
System.NullReferenceException: Object reference not set to an instance of an object.
at Seq.App.EmailPlus.EmailReactor.FormatTemplate(Func2 template, Event
1 evt, Host host)
at Seq.App.EmailPlus.EmailReactor.On(Event1 evt) at Seq.Server.Features.Runner.AppHost.SendLogEventData(ISubscribeTo
1 reactor, DateTime utcTimestamp, Int64 arrivalOrder, UInt32 hash, String document)
at Seq.Server.Features.Runner.AppHost.Send(StorageEvent storageEvent)
Here is my scenario:
Version A of software is released, an exception starts cropping up in, it is going to be 2 weeks to fix the issue, I want to silence the noise until that issue can be addressed. I would love to be able to send that exception entry and using the hash of the event silence further events that are associated to that specific version of the software. We deploy version B of the software, and now if that same exception pops up, the filter won't find it because the filter was created for the previous event's "signature".
The key thing I need to know, is there a way that I can modify the filter that is associated to incoming events for a specific API key via a Seq App?
If so, I really have all I need to implement this app.
Ideally it would be great if the app would clean up those filters that are now "out-of-date". Are there maintenance hooks that Seq Apps can hook into?
Thanks for any pointers and feedback!
I feel that this would make the notifications produced by a signal of threshold events a bit more useful.
Would we need to put the parsed text of the original event into a parameter of the threshold event to avoid changing the threshold event message text?
Will any of the planned features for Aggregate Queries in Seq make the Threshold app obsolete? The part I'm most unsure of is if Aggregate Queries will be able to feed signals that could then become notifications.
I'm running Seq v3.3.23
with Seq.App.Email v2.0.44
and followed the instructions in the docs to display a list of properties and values in the Properties
bag and it doesn't get rendered in the e-mail.
<ul>
{{#each $Properties}}
<li>{{@key}} is {{pretty this}}</li>
{{/each}}
</u>
I tried {{$Properties}}
, {{@Properties}}
, and {{Properties}}
just to be sure, and none worked. The code above is displayed as is in the e-mail body, instead of it being rendered.
We get all emails fromt he app with localhost
event url. Another apps like Slack notification app, have the Seq base url setting, which works great. Suggestion is to implement the same in Email+.
We now and again get a send issue from the app like this:
System.Net.Mail.SmtpException: Error in processing. The server response was: 4.3.111 Temporary server error. Please try again later MRH1 [Hostname=GVXP192MB1782.EURP192.PROD.OUTLOOK.COM]
at System.Net.Mail.DataStopCommand.CheckResponse(SmtpStatusCode statusCode, String serverResponse)
at System.Net.Mail.DataStopCommand.Send(SmtpConnection conn)
at System.Net.Mail.SmtpClient.Send(MailMessage message)
at Seq.App.EmailPlus.EmailApp.On(Event`1 evt) in C:\projects\seq-apps\src\Seq.App.EmailPlus\EmailApp.cs:line 145
at SeqCli.Apps.Hosting.AppContainer.SendTypedEventAsync(String clef) in C:\projects\seqcli\src\SeqCli\Apps\Hosting\AppContainer.cs:line 132
Would it be possible to have it retry on a backoff? (for example using Polly)
"View in Seq" links in emails do not work.
Id string value is missing the quotes:
@Id==event-c097a9fd161908d348162a0000000000
Should be:
@Id=="event-c097a9fd161908d348162a0000000000"
We use Serilog and Seq server for sentralized logging of a number of applications. From Seq, we forward errors (via a signal) to a channel in Slack. We want to build on this by using the Threshold app to further filter what we send to our Slack channel. However, when I tested this app in our test environment, I keep getting IndexOutOfRangeException with the following stack trace:
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at Seq.App.Thresholds.ThresholdReactor.On(Event`1 evt) in c:\projects\seq-apps\src\Seq.App.Thresholds\ThresholdReactor.cs:line 79
at Seq.Server.Features.Runner.AppHost.SendLogEventData(ISubscribeTo`1 reactor, DateTime utcTimestamp, Int64 arrivalOrder, UInt32 hash, String document)
at Seq.Server.Features.Runner.AppHost.Send(StorageEvent storageEvent)
The error in Seq is: The event event-d4a1341f6d0108d3d2d8a90500000000 could not be sent to Test_Threshold
The signal I am testing it with spams our logging server with a lot of messages per minute, so I wonder if this may be an issue related to the capacity of the app. Does the Threshold app have a limit regarding how many events it can process per minute?
Hi all,
I am using the Seq.App.EmailPlus
app (fantastic by the way, thanks!)
We have multiple Seq environments (eg. http://server1:5341 and http://server2:5341).
However, every e-mail that comes from each of those environments uses a link of http://localhost:5341
, which doesn't allow us to actually link to the events.
It appears as though $ServerUri
in DefaultBodyTemplate.html
is set to localhost
and I can't see a way to change it.
Is there a place to set this variable within the Seq config that I'm not seeing?
Please advise. Thanks!
First of all, just want to say that Seq has been an absolutely incredible product to work with all around. It's made life incredibly easy on us.
On our current server, we use SMTP with the SmtpClient.SmtpDeliveryMethod
set to SpecifiedPickupDirectory
. I thought a possible enhancement would include the ability to configure Email Plus in a similar matter, for circumstances like ours (rare as it might be.)
I'd be happy to dive in and do a PR for it, this would be my first foray into something of this nature and I might need a little help to get the proper tests in place.
Thanks for an awesome product!
Hi,
I was trying to add the App "Seq.App.Email" to my Seq using the http://localhost:5341/#/settings/apps with the package from nuget.
When I try it with my login information the app throw "The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first.", on what I know it's because I need to enabled SSL before send the email.
So I download the source code and add "client.EnableSsl = true;" before sending the message.
After that I fallow the instruction to package on https://getseq.atlassian.net/wiki/display/SEQ10/Writing+Seq+apps and http://docs.nuget.org/docs/creating-packages/Creating-and-Publishing-a-Package to create the package using nuget.exe.
When i go to http://localhost:5341/#/settings/apps/new (to insert a manual app in Seq) I use those settings:
Name : EmailSSL
Description : Email with SSL
Main reactor type : Seq.App.Email
Available settings : From, To, SubjectTemplate, Host, Port, BodyTemplate, IsBodyHtml, Username, Password,
Add setting : Seq.App.Email.0.1.0.nupkg
Allow the app to process events it creates (uncheck)
But Seq Throw and exception "An unhandled error occurred while serving the request."
In the log it's :
"2014-05-30 16:14:07.286 -04:00 [Error] Error serving "http://localhost:5341/api/apps"
System.ArgumentNullException: Value cannot be null.
Parameter name: value
at System.Enum.TryParseEnum(Type enumType, String value, Boolean ignoreCase, EnumResult& parseResult)
at System.Enum.Parse(Type enumType, String value, Boolean ignoreCase)
at Seq.Server.Web.Api.Apps.AppsModule.b__1a(AppSettingPart s) in c:\TeamCity\buildAgent\work\9b28c0a5c864e317\src\Seq.Server\Server\Web\Api\Apps\AppsModule.cs:line 109
at System.Linq.Enumerable.WhereSelectListIterator2.MoveNext() at System.Collections.Generic.List
1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 source)
at Seq.Server.Web.Api.Apps.AppsModule.ToExistingDocument(AppEntity entity, HostedApp document) in c:\TeamCity\buildAgent\work\9b28c0a5c864e317\src\Seq.Server\Server\Web\Api\Apps\AppsModule.cs:line 108
at Seq.Server.Web.Api.Apps.AppsModule.ToNewDocument(AppEntity entity) in c:\TeamCity\buildAgent\work\9b28c0a5c864e317\src\Seq.Server\Server\Web\Api\Apps\AppsModule.cs:line 102
at Seq.Server.Web.EntityResourceModule2.Create() in c:\TeamCity\buildAgent\work\9b28c0a5c864e317\src\Seq.Server\Server\Web\EntityResourceModule.cs:line 74 at Seq.Server.Web.ResourceModule.<.ctor>b__19(Object _) in c:\TeamCity\buildAgent\work\9b28c0a5c864e317\src\Seq.Server\Server\Web\ResourceModule.cs:line 18 at CallSite.Target(Closure , CallSite , Func
2 , Object )
at Nancy.Routing.Route.<>c__DisplayClass4.b__3(Object parameters, CancellationToken context)"
I'm not sure if I miss something or don't do the right thing
Thank you and have a nice weekend/week.
Jo
As of Seq v4.0.60 with Email+ v2.0.60 , using the "default" template, the emails I get do not look like what they should in Outlook 2013.
Expected something like : https://blog.getseq.net/content/images/2017/05/Alerts-Email.png (from blog post at https://blog.getseq.net/hello-seq-4-0-dashboards-alerts-more-improvements/) ...
But I get :
i.e. the header seems to be missing.
When I open the source in a browser, it does seem to display well :
I'm not sure why, but the {{$Message}}
that is rendered in the email body is including a semicolon after the second named property from the Health Check input, even though that semicolon is not in the event payload in Seq. When our operations team receives the error email, they go to click the link, but it always fails because our email client is treating the double quote as part of the URL because it sees the semicolon (that shouldn't be there) after it.
There's no semicolon in the JSON in Seq
We have a filter on seq that has 36 items against it for filtering out products that we are dealing with and don't want reported on in email - unfortunately the email plugin seems to be ignoring some of these and forwarding the events on in email even though they don't show in the seq dashboard.
Is there a limit to how many events it ignores for email purpose?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.