Skip to content

Commit

Permalink
feat(core): Support smtps and STARTTLS for SMTP
Browse files Browse the repository at this point in the history
Support uri schemes for SMTP, enabling STARTTLS and SMTPS for SMTP
connections.

The new format for configuration value SMTPServer supports passing a
URI scheme (either smtp:// or smtps://). To support old configurations,
if no scheme is given, smtp:// is assumed.

Fixes #31
  • Loading branch information
the-nic committed May 14, 2020
1 parent 7ef507b commit 589cfaa
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 28 deletions.
10 changes: 8 additions & 2 deletions Documentation/SOGoInstallationGuide.asciidoc
Expand Up @@ -1813,10 +1813,16 @@ are:
|D |SOGoSMTPServer
|The DNS name or IP address of the SMTP server used when
_SOGoMailingMechanism_ is set to `smtp`.
Supported formats are: `smtp://domain:port`, `smtps://domain`,
`domain:port`, `smtp://domain:port/?tls=YES`. Using the option
`tls=YES` will enforce using STARTTLS smtp connections. Thus,
`smtp://localhost:587/?tls=YES` would use the default MUA port
on localhost with STARTTLS enforced.
|D |SOGoSMTPAuthenticationType
|Activate SMTP authentication and specifies which type is in use.
Current, only `PLAIN` is supported and other values will be ignored.
Current, only `PLAIN` is supported and other values will cause
the authentication to fail.
|S |WOSendMail
|The path of the sendmail binary.
Expand Down Expand Up @@ -2464,7 +2470,7 @@ like this:
SOGoTrashFolderName = Trash;
SOGoJunkFolderName = Junk;
SOGoMailingMechanism = smtp;
SOGoSMTPServer = 127.0.0.1;
SOGoSMTPServer = "smtp://127.0.0.1";
SOGoUserSources = (
{
type = ldap;
Expand Down
2 changes: 1 addition & 1 deletion Scripts/sogo.conf
Expand Up @@ -26,7 +26,7 @@
//SOGoTrashFolderName = Trash;
//SOGoIMAPServer = "localhost";
//SOGoSieveServer = "sieve://127.0.0.1:4190";
//SOGoSMTPServer = 127.0.0.1;
//SOGoSMTPServer = "smtp://127.0.0.1";
//SOGoMailDomain = acme.com;
//SOGoMailingMechanism = smtp;
//SOGoForceExternalLoginWithEmail = NO;
Expand Down
2 changes: 1 addition & 1 deletion SoObjects/SOGo/SOGoDefaults.plist
Expand Up @@ -30,7 +30,7 @@
SOGoLDAPContactInfoAttribute = "description";

SOGoMailingMechanism = "sendmail";
SOGoSMTPServer = "localhost";
SOGoSMTPServer = "smtp://localhost";
SOGoMailSpoolPath = "/var/spool/sogo";

SOGoWebAccessEnabled = YES;
Expand Down
10 changes: 9 additions & 1 deletion SoObjects/SOGo/SOGoDomainDefaults.m
Expand Up @@ -281,7 +281,15 @@ - (NSArray *) refreshViewIntervals

- (NSString *) smtpServer
{
return [self stringForKey: @"SOGoSMTPServer"];
NSString *server;
server = [self stringForKey: @"SOGoSMTPServer"];
// backwards compatibility
if (![server hasPrefix: @"smtp://"] &&
![server hasPrefix: @"smtps://"])
{
return [NSString stringWithFormat: @"smtp://%@", server];
}
return server;
}

- (NSString *) smtpAuthenticationType
Expand Down
34 changes: 11 additions & 23 deletions SoObjects/SOGo/SOGoMailer.m
Expand Up @@ -22,6 +22,7 @@

#import <NGObjWeb/NSException+HTTP.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSURL+misc.h>
#import <NGMail/NGSendMail.h>
#import <NGMail/NGSmtpClient.h>
#import <NGMime/NGMimePartGenerator.h>
Expand Down Expand Up @@ -216,40 +217,27 @@ - (NSException *) _sendMailData: (NSData *) mailData
}

- (NSException *) _smtpSendData: (NSData *) mailData
toRecipients: (NSArray *) recipients
sender: (NSString *) sender
toRecipients: (NSArray *) recipients
sender: (NSString *) sender
withAuthenticator: (id <SOGoAuthenticator>) authenticator
inContext: (WOContext *) woContext
{
NSString *currentTo, *host, *login, *password;
NGInternetSocketAddress *addr;
NSString *currentTo, *login, *password;
NSMutableArray *toErrors;
NSEnumerator *addresses;
NSEnumerator *addresses;
NGSmtpClient *client;
NSException *result;
NSRange r;
unsigned int port;
NSURL * smtpUrl;

client = [NGSmtpClient smtpClient];
host = smtpServer;
result = nil;
port = 25;

// We check if there is a port specified in the smtpServer ivar value
r = [smtpServer rangeOfString: @":"];

if (r.length)
{
port = [[smtpServer substringFromIndex: r.location+1] intValue];
host = [smtpServer substringToIndex: r.location];
}
smtpUrl = [[[NSURL alloc] initWithString: smtpServer] autorelease];

addr = [NGInternetSocketAddress addressWithPort: port
onHost: host];
client = [NGSmtpClient clientWithURL: smtpUrl];

NS_DURING
{
[client connectToAddress: addr];
[client connect];
if ([authenticationType isEqualToString: @"plain"])
{
/* XXX Allow static credentials by peeking at the classname */
Expand Down Expand Up @@ -297,7 +285,7 @@ - (NSException *) _smtpSendData: (NSData *) mailData
@" (smtp) all recipients discarded"];
else if ([toErrors count] > 0)
result = [NSException exceptionWithHTTPStatus: 500
reason: [NSString stringWithFormat:
reason: [NSString stringWithFormat:
@"cannot send message (smtp) - recipients discarded:\n%@",
[toErrors componentsJoinedByString: @", "]]];
else
Expand All @@ -313,7 +301,7 @@ - (NSException *) _smtpSendData: (NSData *) mailData
}
NS_HANDLER
{
[self errorWithFormat: @"Could not connect to the SMTP server %@ on port %d", host, port];
[self errorWithFormat: @"Could not connect to the SMTP server %@", smtpServer];
result = [NSException exceptionWithHTTPStatus: 500
reason: @"cannot send message:"
@" (smtp) error when connecting"];
Expand Down

0 comments on commit 589cfaa

Please sign in to comment.