diff --git a/manifests/postfix/sender.pp b/manifests/postfix/sender.pp
new file mode 100644
index 0000000000000000000000000000000000000000..a60f7214793b1b3f80df839cfc934b8e40a6b239
--- /dev/null
+++ b/manifests/postfix/sender.pp
@@ -0,0 +1,48 @@
+# Many systems send emails "From" root@system-name.  That causes problems when
+# an email is bounced.  This type is used to have Postfix change the sender
+# address of an email while it is in flight.  Both the From: header and the
+# envelope sender are changed.
+#
+# Example of how to set a sender:
+#
+#     base::postfix::sender { 'root@stanford.edu':
+#       ensure => 'noreply@stanford.edu'
+#     }
+#
+# Example of how to ensure there is no sender map:
+#
+#     base::postfix::sender { 'luke': ensure => absent }
+#
+# Assumes that a command 'postmap hash:$file' has been defined that will
+# rebuild the senders map.
+
+define base::postfix::sender(
+  $ensure,
+  $file = '/etc/postfix/senders'
+) {
+  $pattern = "'^${name}'"
+  case $ensure {
+    'absent': {
+      exec { "rm-sender-${name}":
+        command => "sed -i -e '/^${name}/d' ${file}",
+        onlyif  => "grep ${pattern} ${file}",
+        notify  => Exec["postmap hash:${file}"]
+      }
+    }
+    default: {
+      $line = "${name} ${ensure}"
+      exec { "add-sender-${name}":
+        command => "echo '${line}' >> ${file}",
+        unless  => "grep ${pattern} ${file}",
+        require => Package['postfix'],
+        notify  => Exec["postmap hash:${file}"],
+      }
+      exec { "fix-sender-${name}":
+        command => "sed -i -e 's/^${name}..*\$/${line}/' ${file}",
+        unless  => "grep '^${line}\$' ${file}",
+        require => Exec["add-sender-${name}"],
+        notify  => Exec["postmap hash:${file}"],
+      }
+    }
+  }
+}