diff --git a/Milter/dsn.py b/Milter/dsn.py
index 64ab8a2e9c28c6dd7f0c54f23f1ae269b290725c..df8dded8499d57412d59d10003f7264ba202cbc7 100644
--- a/Milter/dsn.py
+++ b/Milter/dsn.py
@@ -5,6 +5,9 @@
 # Send DSNs, do call back verification,
 # and generate DSN messages from a template
 # $Log$
+# Revision 1.19  2009/07/02 19:41:12  customdesigned
+# Handle @ in localpart.
+#
 # Revision 1.18  2009/06/10 18:01:59  customdesigned
 # Doxygen updates
 #
@@ -116,13 +119,23 @@ def send_dsn(mailfrom,receiver,msg=None,timeout=600,session=None,ourfrom=''):
 	code,resp = smtp.docmd('MAIL FROM: <%s>'%ourfrom)
 	if code != 250:
 	  raise smtplib.SMTPSenderRefused(code, resp, '<%s>'%ourfrom)
-	code,resp = smtp.rcpt(mailfrom)
-	if code not in (250,251):
-	  return (code,resp)		# permanent error
+        if isinstance(mailfrom,basestring):
+          mailfrom = [mailfrom]
+        badrcpts = {}
+        for rcpt in mailfrom:
+          code,resp = smtp.rcpt(mailfrom)
+          if code not in (250,251):
+            badrcpts[rcpt] = (code,resp)# permanent error
 	smtp.quit()
+        if len(badrcpts) == 1:
+          return badrcpts.values()[0]	# permanent error
+        if badrcpts:
+          return badrcpts
       return None			# success
     except smtplib.SMTPRecipientsRefused,x:
-      return x.recipients[mailfrom]	# permanent error
+      if len(x.recipients) == 1:
+        return x.recipients.values()[0]	# permanent error
+      return x.recipients
     except smtplib.SMTPSenderRefused,x:
       return x.args[:2]			# does not accept DSN
     except smtplib.SMTPDataError,x: