Postfix makes the i macro available only after at the DATA stage, so
when smfi_getsymval() is called earlier it returns NULL.

--- a/src/sm-archive.cpp
+++ b/src/sm-archive.cpp
@@ -108,7 +108,8 @@ void mlfiPriv::reset(bool final) {
 void my_syslog(mlfiPriv *priv, const char *text) {
 	char buf[maxlen];
 	if (priv) {
-		snprintf(buf, sizeof(buf), "%s: %s", priv->queueid, text);
+		snprintf(buf, sizeof(buf), "%s: %s",
+		    priv->queueid ? priv->queueid : "NOQUEUE", text);
 		text = buf;
 	}
 	if (use_syslog) {
@@ -201,7 +202,8 @@ sfsistat mlfi_envrcpt(SMFICTX *ctx, char
 {
 	mlfiPriv &priv = *MLFIPRIV;
 	CONFIG &dc = *priv.pc;
-	if (!priv.queueid) priv.queueid = strdup(smfi_getsymval(ctx, (char*)"i"));
+	const char *i_macro = smfi_getsymval(ctx, (char*)"i");
+	if (!priv.queueid && i_macro) priv.queueid = strdup(i_macro);
 	const char *rcptaddr	= to_lower_string(rcpt[0]);
 	if (debug_syslog > 1) {
 		char msg[maxlen];
@@ -220,6 +222,8 @@ sfsistat mlfi_eom(SMFICTX *ctx)
 {
 	mlfiPriv &priv = *MLFIPRIV;
 	CONFIG &dc = *priv.pc;
+	const char *i_macro = smfi_getsymval(ctx, (char*)"i");
+	if (!priv.queueid && i_macro) priv.queueid = strdup(i_macro);
 	const char *target = dc.find_from(priv.mailaddr);
 	add_target(priv, target);
 	for (string_set::iterator i=priv.targets.begin(); i!=priv.targets.end(); i++) {
