I've been staring at this problem for almost a day now and I would appreciate some fresh eyes taking a look. In short, I have converted my transport to extract its data from address_data, which is a mysql lookup in my router, instead of doing another mysql lookup directly in the transport. However, although everything worked properly in the transport using the mysql lookup, now with the quota extracted from address_data, mail is rejected each time with the following log message:

mailbox is full (MTA-imposed quota exceeded while writing to tmp/1455462543.H946610P6695.spock.discoduck.org)

Although the quota is set to 999MB and the message is less than 337 bytes in size and the current mail storage directory size is 384KB.

It appears that exim is not converting my quota in megabytes to bytes in my transport if I extract the quota from address_data.

For example, when I debug using "exim -d+deliver+transport" then I see the following values although the quota is set to 999MB:

Exim quota = 999 old size = 6421 this message = 337 (not included)

My transport is extracting the quota with "quota = ${extract{quota}{$address_data}}" where address_data is a mysql lookup in my router. However, if I place the mysql lookup directly in the transport then everything works and my debug values are then:

Exim quota = 1047527424 old size = 6421 this message = 337 (not included)

So, if I use the mysql lookup in the transport then exim converts the quota value from megabytes to bytes, however, if I extract the quota from address_data in my transport then it does not convert the value from megabytes to bytes.

Am I being incredibly stupid or is this a bug or something else?

Here is my virtual_domains router:

virtual_domains:
  driver = redirect
  domains = +local_domains
  allow_fail

  address_data = ${lookup mysql{\
select smtp, users.sa_tag*10 AS sa_tag, users.on_spamassassin AS on_spamassassin, \ users.uid AS uid, users.gid AS gid, users.quota AS quota from users,domains \
        where localpart = '${quote_mysql:$local_part}' \
                and domain = '${quote_mysql:$domain}' \
                and domains.enabled = '1' \
                and users.enabled = '1' \
                and users.domain_id = domains.domain_id}{$value}fail}

  data = ${extract{smtp}{$address_data}}

  file_transport = virtual_delivery
  reply_transport = address_reply
  pipe_transport = address_pipe

Here is my virtual_delivery transport which extracts the quota from address_data and which does not work properly since the quota is not converted from megabytes to bytes:

virtual_delivery:
  driver = appendfile
  envelope_to_add
  return_path_add
  mode = 0600
  maildir_format = true
  create_directory = true
  directory = ${extract{smtp}{$address_data}}
  user = ${extract{uid}{$address_data}}
  group = ${extract{gid}{$address_data}}
  quota = ${extract{quota}{$address_data}}
  quota_is_inclusive = false
  quota_warn_threshold = 80%
 maildir_use_size_file = true
  quota_warn_message = "To: $local_part@$domain\n\
                        Subject: Mailbox quota warning\n\n\
This message was automatically generated by the mail delivery software.\n\n\ You are now using over 75% of your allocated mail storage quota.\n\n\ If your mailbox fills completely, further incoming messages will be automatically\n\
                        returned to their senders.\n\n\
Please take note of this and remove unwanted mail from your mailbox.\n"


Here is my virtual_delivery transport modified to get the quota from a mysql lookup and which works properly by converting the quota from megabytes to bytes:

virtual_delivery:
  driver = appendfile
  envelope_to_add
  return_path_add
  mode = 0600
  maildir_format = true
  create_directory = true
  directory = ${extract{smtp}{$address_data}}
  user = ${extract{uid}{$address_data}}
  group = ${extract{gid}{$address_data}}
  quota = ${lookup mysql{select users.quota from users,domains \
                where localpart = '${quote_mysql:$local_part}' \
                and domain = '${quote_mysql:$domain}' \
                and users.domain_id = domains.domain_id}{${value}M}}
  quota_is_inclusive = false
  quota_warn_threshold = 80%
maildir_use_size_file = true
  quota_warn_message = "To: $local_part@$domain\n\
                        Subject: Mailbox quota warning\n\n\
This message was automatically generated by the mail delivery software.\n\n\ You are now using over 75% of your allocated mail storage quota.\n\n\ If your mailbox fills completely, further incoming messages will be automatically\n\
                        returned to their senders.\n\n\
Please take note of this and remove unwanted mail from your mailbox.\n"


--
## List details at https://lists.exim.org/mailman/listinfo/exim-users
## Exim details at http://www.exim.org/
## Please use the Wiki with this list - http://wiki.exim.org/

Reply via email to