sendmailコマンドの-fオプションの設定方法

このQ&Aのポイント
  • sendmailコマンドの-fオプションを使用してfromアドレスを指定する方法について解説します。
  • 通常、sendmailコマンドを使用すると、fromアドレスにはお客様のBIGLOBEメールアドレスが設定されます。
  • -fオプションを利用すれば、自分のメールアドレスをfromアドレスとして指定することができます。
回答を見る
  • ベストアンサー

sendmailの-fオプション記述

sendmailコマンドでは、-f オプションでfromアドレスを指定しない場合、お客様のBIGLOBEメールアドレスがfromアドレスに設定されてメール送信がされます。 ↑と記載されているので-fオプションを設定したいのですが、↓に書き足すにはどの様に記載したら良いでしょうか? if ($sendmail) {send_mail($sendmail,'',$subject,$masteremail,'','','',$msg)} if ($sendmail) {send_mail($sendmail -f ***@***.ne.jp,'',$subject,$masteremail,'','','',$msg)} ↑だとBIGLOBEメールアドレスのまま届いてしまいます。

  • CGI
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

perl-lib.pl をよくよくのぞいてみましたところ、 sendmailコマンドで-fオプションを指定できるように書き換える必要があります。 perl-lib.pl 212行目付近の send_email 関数は、 以下のような構造となっています。 (かなり省略しました) ------------------------------------------------------------------------------ sub send_email { my($sendmailpath, $uuencodepath, $subject, $from, $to, $cc, $bcc, $body, $files, $encoding, $separator) = @_; ... 略 if ( $sendmailpath =~ /blatj/i ) { ... 略 } elsif ( -e $sendmailpath ) { ... 略 if (open(MAIL,"| $sendmailpath -t")) { ... 略 } else { $err = 'Error Open sendmail Failure'; } } else { $err = 'Error Not sendmail Utility'; } $err; } ------------------------------------------------------------------------------ この if (open(MAIL,"| $sendmailpath -t")) { という行を、 if (open(MAIL,"| $sendmailpath -f $from -t")) { と書き換えればよい。 ところで、回答ANo.1 の補足に貼り付けられたコードで、 CGIプログラム中での send_email 関数の呼び出し箇所 if ($sendmail) {send_email($sendmail,'',$subject,$masteremail,$masteremail,'','',$msg) if ($sendmail) {send_email($sendmail,'',$subject,$masteremail,$masteremail,'',$bcc,$news) のように、from と to の両方に同じ変数 $masteremail を渡しているのですが、これは問題ないのでしょうか??

nomark
質問者

お礼

perl-lib.pl の指示して頂いた場所を書き換えて試したところ 送信者アドレスからBIGLOBEメールアドレスが消えました^^ 何度もお手数を掛けて申し訳ありませんでした。 また、from と to の両方に同じ変数が渡っているので、送信者と受信者が 同じアドレスになりますが、mailは届いているのでOKです。 本当に丁寧に教えて頂け助かりました。 心よりお礼申し上げます。ありがとうございました。

その他の回答 (2)

回答No.2

補足にはりつけられたソースコードの行を見ると、 関数名は、send_mail ではなく、send_email のようです。 そのCGIプログラム中で、関数 send_email を定義していないのならば、 ひょっとして、汎用関数ライブラリ perl-lib.pl をお使いではないでしょうか? ソースコードに次のような記述がないでしょうか? require 'perl-lib.pl' perl-lib.pl のソースコードを見ると、 send_email 関数は、4番目の引数に -f オプションをつけて、sendmail コマンドに渡しています。 呼び出す側では、4番目の引数は、$masteremail となっています。 if ($sendmail) {send_email($sendmail,'',$subject,$masteremail,$masteremail,'','',$msg) ↑この行より手前で、変数 $masteremail に、設定したいFromアドレスを代入してやればよいでしょう。

参考URL:
http://www.tryhp.net/perllib.htm
nomark
質問者

補足

require 'perl-lib.pl' の記述ありました。 $masteremail = '*****@*****.co.jp' を教えて頂いた箇所に入れましたが駄目で if ($sendmail) のある全ての前に3箇所同時に入れたりもしてみましたが駄目でした。 諦めモード入って来ました…色々教えて頂いたのに申し訳ありません。

回答No.1

そのCGIプログラムは記述言語は何でしょう? Perl でしょうか? Perl だとして話をすすめてしまいます ^^; send_mail(...) は、sendmailコマンドではなく、send_mailという名前の関数をよびだしています。 その関数は、そのプログラムの別の箇所もしくは別のファイルで次のように定義されているはずです。 sub send_mail { ... 略 } 探してみてください。 そのなかでsendmailコマンドにメールを渡す処理が 書かれているはずなので、 そちらに -fオプションを書き足せばよいでしょう。

nomark
質問者

補足

レスありがとうございます。 記述言語はPerlです。 教えて頂いたものを探したのですが見つからなくて… UPするCGIもこれ一つです。 sendで検索してかかったものは下の6行です。 $sendmail = '/usr/lib/sendmail'; print "<input type=hidden name=cgi_action value=sendmail>\n"; elsif ($QUERY{'cgi_action'} eq 'sendmail') if ($sendmail) {send_email($sendmail,'',$subject,$masteremail,$masteremail,'','',$msg) if ($sendmail) {send_email($sendmail,'',$subject,$masteremail,$masteremail,'',$bcc,$news) if ($sendmail) {send_email($sendmail,'',$subject,$masteremail,$QUERY{'E-Mail'},'',$masteremail,$msg) 最後の3つは先だっての質問でお答え頂いたので違いますよねぇ とすると3行目かと思い elsif ($QUERY{'cgi_action'} eq 'sendmail -f ***@***.co.jp') としてみましたが駄目でした。 ご意見頂けますようお願いします。

関連するQ&A

  • 【CGI】 sendmailの-fオプションって?

    Biglobeにてsendmailを使用可にしてメールを配信すると 自分のBIGLOBEメールアドレスがfromアドレスに設定されて メール送信がされます。 『-f オプションでfromアドレスの変更をしてください。』と http://homepage.biglobe.ne.jp/manual/sendmail/sendmail_shiyou.html ↑に書いてありますが、どの様に書き足せばいいのでしょうか? CGI全然わかんないもので、詳しくお願いします m(__)m

  • sendmail -fオプションの指定はどこで行えばいいでしょうか?

    キャノネットというサーバーでフリーのメールフォームCGI設置を試みました、-fと-tオプション設定を行わなければならないみたいなのですが、今回使用したいCGIの初期設定ファイルsendmail指定部分下記に #sendmailのパス $init->{sendmail_path} = '/usr/local/bin/sendmail -t -f ' メールアドレス' '; と指定しましたがCGIエラーとなってしまい、どうやらプログラム内を書き換える必要があるみたいなのですが、知識不足のため どうやって変更するのかがわからず困っております。 お詳しい方、下記のプログラム内の変更部分をお教え下さい。 よろしくお願い致します。 (CGIはURLのものを使用しております。) http://www.web-liberty.net/download/mailplus/index.html -------------------------------------------------- package webliberty::Sendmail; use strict; use Jcode; use webliberty::Encoder; ### コンストラクタ sub new { my $class = shift; my $self = { sendmail => shift, send_to => undef, send_from => undef, subject => undef, name => undef, message => undef, files => undef, x_mailer => undef }; bless $self, $class; return $self; } ### メール送信 sub sendmail { my $self = shift; my %args = @_; $self->{send_to} = $args{'send_to'}; $self->{send_from} = $args{'send_from'}; $self->{subject} = $args{'subject'}; $self->{name} = $args{'name'}; $self->{message} = $args{'message'}; $self->{files} = $args{'files'}; $self->{x_mailer} = $args{'x_mailer'}; if (!$self->{send_to}) { $self->{send_to} = 'example@example.com'; } if (!$self->{send_from}) { $self->{send_from} = 'example@example.com'; } if (!$self->{subject}) { $self->{subject} = 'No Subject'; } if (!$self->{message}) { $self->{message} = 'No Message'; } if (!$self->{x_mailer}) { $self->{x_mailer} = 'Web Liberty'; } foreach ($self->{subject}, $self->{name}, $self->{message}) { $_ =~ s/<br ?/>/?n/g; $_ =~ s/&amp;/&/g; $_ =~ s/&lt;/</g; $_ =~ s/&gt;/>/g; $_ =~ s/&quot;/"/g; } if ($self->{name}) { $self->{send_from} = "?"" . $self->_encode($self->{name}) . "?" <$self->{send_from}>"; } $self->{message} =~ s/?xEF?xBD?x9E/?xE3?x80?x9C/g; $self->{message} = Jcode->new($self->{message}, 'utf8')->jis; my @files = split(/?n/, $args{'files'}); my $boundary; if ($files[0]) { require webliberty::File; $boundary = time; while ($self->{message} =~ /$boundary/) { $boundary++; } } open(webliberty_Sendmail, "| $self->{sendmail} -t") or return(0, "Sendmail Error : $self->{sendmail}"); print webliberty_Sendmail "X-Mailer: $self->{x_mailer}?n"; print webliberty_Sendmail "To: $self->{send_to}?n"; print webliberty_Sendmail "From: $self->{send_from}?n"; print webliberty_Sendmail "Subject: " . $self->_encode($self->{subject}) . "?n"; if ($files[0]) { print webliberty_Sendmail "Content-Type: multipart/mixed; boundary=?"$boundary?"?n?n"; print webliberty_Sendmail "--$boundary?n"; } print webliberty_Sendmail "Content-Transfer-Encoding: 7bit?n"; print webliberty_Sendmail "Content-Type: text/plain; charset=iso-2022-jp?n?n"; print webliberty_Sendmail "$self->{message}?n"; foreach (@files) { my $file_ins = new webliberty::File($_); my $file_name = $file_ins->get_name . '.' . $file_ins->get_ext; print webliberty_Sendmail "--$boundary?n"; print webliberty_Sendmail "Content-Type: application/octet-stream; name=?"$file_name?"?n"; print webliberty_Sendmail "Content-Transfer-Encoding: X-uuencode?n"; print webliberty_Sendmail "Content-Disposition: attachment; filename=?"$file_name?"?n?n"; if (open(webliberty_Sendmail_FILE, $_)) { binmode(webliberty_Sendmail_FILE); print webliberty_Sendmail $self->_uuencode(join('', <webliberty_Sendmail_FILE>), $file_name); close(webliberty_Sendmail_FILE); } } close(webliberty_Sendmail); return 1; }

    • ベストアンサー
    • CGI
  • sendmailで送信すると、迷惑メールになります

    フォームに入力された内容をperlでsendmailを使って送信すると、ウイルス対策ソフトの判定で、迷惑メールに入ってしまいます。 ▼プログラム $subject = 'テストメール'; $msg = "------------------------------------------------------------------ [名前] $name [住所] $address ------------------------------------------------------------------"; # subjectをBase64エンコード jcode::convert(\$subject, 'euc'); jcode::convert(\$subject, 'jis', 'euc', 'z'); $subject = '=?ISO-2022-JP?B?' . encode_base64($subject, '') . '?='; # 本文をJISに変換 jcode::convert(\$msg, 'jis'); &mail($to_mail, $from_mail, $subject, $msg); ▼サブルーチン sub mail{ my($to_mail, $from_mail, $subject, $msg) = @_; # sendmailによるメール発信 my $sendmail = '/usr/lib/sendmail'; # sendmailパス open(MAIL,"| $sendmail -t") || &error("メール送信に失敗しました"); print MAIL "To: $to_mail\n"; print MAIL "From: $from_mail\n"; print MAIL "Subject: $subject\n"; print MAIL "X-Mailer: Mail Form Sendmail\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "Content-type: text/plain; charset=\"iso-2022-jp\"\n"; print MAIL "MIME-Version: 1.0\n\n"; print MAIL "$msg"; close(MAIL); } print MAIL "Content-type: text/plain; charset=\"iso-2022-jp\"\n"; を print MAIL "Content-type: text/plain;\n"; にすれば迷惑メールにならずに済むのですが、一部の利用者(特にMacユーザー)で、送信されたメールが文字化けしているようですので、何とかcharsetの指定も入れたいと思っています。 上記のプログラムで、おかしいところがあるでしょうか? どうか、ご教示いただけますよう、よろしくお願いします。

    • ベストアンサー
    • CGI
  • FreeBSDでのsendmailでのメール送信

    はじめまして FreeBSD11.0で自前サーバ構築をしています。 今回、サーバ上からsendmailで、下記ページを参考にメールを送信を試みています。 ・http://x68000.q-e-d.net/~68user/unix/pickup?sendmail FreeBSD11.0上での作業は、以下の通りです。 1. /etc/rc.confに下記を追加 sendmail_enable="YES" 2. リブート 3. sendmailが動作していることを下記で確認 # /etc/rc.d/sendmail status sendmail is running as pid 713. sendmail_msp_queue is running as pid 716. # 4. sendmailコマンドを実行 % sendmail From:送信元メールアドレス To:宛先メールアドレス Subject:タイトル xxx . % ●結果、コマンドは、正常に終了してますが、メールは、送信できません。 試しに自分の契約しているレンタルサーバ(FreeBSD9.1)で上記の4.のsendmail コマンドを実行すると、メール送信ができます。 環境設定など作業上なにが足らないのでしょうか。 FreeBSDのsendmailコマンドでの送信についてご存知の方がおりましたらご教示頂け ないでしょうか。 いろいろと調べたり試行錯誤したのですが、解決できなく質問をさせて頂きました。 よろしく、お願いいたします。

  • sendmailのFROMに日本語を使う

    CGIからsedmailを呼び出してメールを送信しています。 その時に差出人の部分の日本語が文字化けしてしまいます。 そこで&jcode'convertでjisに変えたのですが、今度は CGIがサーバーエラーになってしまいます。 どうすればよいでしょうか。 スクリプトはこんな感じです。 ----------------------------------------------- $from = '両国'; $subject = 'テスト'; &jcode'convert(*from, 'jis'); &jcode'convert(*subject, 'jis'); &jcode'convert(*msg, 'jis'); $errno = 1 unless open(MAIL, "| /usr/lib/sendmail -t"); return 0 if $errno; print MAIL "To: $MailTo\n"; print MAIL "From: $from\n"; print MAIL "Subject: $subject\n"; print MAIL "Content-Type: text/plain;\n\n"; print MAIL "$msg\n"; $errno = 2 unless close(MAIL); return 0 if $errno;

    • ベストアンサー
    • Perl
  • sendmailでの着信メール形態

    WEBページにCGIメールフォームを作成しました。 sendmailで記入されたフォームを自分宛アドレスで受信出来ております。 問題は、受信メールのFrom情報が、フォーム投稿者(差出人)アドレスではなく、加入しているプロバイダでの自分宛メールアドレスとなっております。 そのため、受信メールで即返信すると、ホーム記入者宛とならず、宛先を差出人アドレスに書き換えが必要となり、煩わしく困っております。 受信メールのFrom情報を正規の差出人アドレスにするにはどうしたらよいのでしょうか。 SENDMAILのコマンドオプションの書き方で直るのでしょうか。ご指導ください。 (ホスト  BIGLOBE  www2a.mtj,biglobe.ne.jp  無料CGIメールフォーム 使用)

  • Mail::Sendmailの使い方

    お世話になっております。 先日よりsendmailの調子がおかしくていろいろ調べているのですが煮詰まってしまったので詳しい方々にご教授頂きたいと思います。 先日よりMovable Type(CMS)でのメール送信のシステムが機能しなくなり、いろいろ調べているとサーバーのsendmailはきちんと機能しているのですが、perlのモジュールMail::Sendmailがうまく作動していないようなのです。 perlでは、 open (SENDMAIL, "/usr/lib/sendmail -t -i"); (中省略) close(SENDMAIL); という原始的な方法ではメールが送信されるのですが、 use Mail::Sendmail;という使い方では、エラーにはなりませんがずっと読み込み中…状態が続いてメールが送信されませんでした。 Movable TypeでもMail::Sendmailが利用されていますのでここが原因かと思いますが、Mail::Sendmailを使用するにあたって注意すべきこと、または設定すべきことはどのようなことがあるでしょうか?さしあたりどこをチェックしてよいのかわからなくて困っています。 よろしくお願いします。 Mail::Sendmailを利用して作成したスクリプトは以下のようなものです。 #!/usr/bin/perl use strict; use warnings; use Mail::Sendmail; use Encode; use utf8; my $subject = "テスト"; my $message = "テストです。ほげほげ。"; $subject = encode("MIME-Header-ISO_2022_JP", $subject); $message = encode("iso-2022-jp", $message); my %mail = ( "Content-Type" => 'text/plain; charset="iso-2022-jp"', To => 'to@example.com', From => 'from@example.com', Subject => $subject, Message => $message, ); sendmail(%mail); exit;

    • ベストアンサー
    • Perl
  • mb_send_mail sendmailについて

    PHPが使える無料レンタルサーバーで会員管理画面を作ろうとしているものです。だいぶ完成してきて、残りは登録した人に会員登録したことをメールで自動送信することができるようになれば完成というところまできました。無料レンタルサーバーの利用についての説明の中ではsendmailは利用可となっています。私はメール送信のプログラムを作ったことがないので、しきりに本を読みながら悪戦苦闘しております。本の中のサンプルを参考に下のようなソースを書いて、テストしていますがダメでした。 $mailto="*****@***.biglobe.ne.jp"; $mailsbj="新規登録"; $mailbody="登録者ができました"; $mailheader="From:****@yahoo.co.jp\nReply-To:*****@***.biglobe.ne.jp\nX-Mailer:phpversion();" mb_language("ja"); if(mb_send_mail($mailto,$mailsbj,$mailbody,$mailheader)){ echo "メールの送信に成功"; } else{ echo "メール送信失敗"; } 利用している無料レンタルサーバ内のsendmailの説明の中には sendmailのパス:/usr/lib/sendmail と記入されています。 web上で色々調べてみましたが、どうも今一よくわかりませんでした。mb_send_mailは使えないと言うことでしょうか? もし、sendmailを使用してメール送信をする場合にはどんなソースを書けばよいのでしょうか。 どなたかご指導宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • sendmailについて

    CGIからサーバにあるsendmailを使おうとしているのですが、分からない点があります。 メール自体は、きちんと送信されるのですが、To以外のヘッダーが本文と一緒に送信されてしまいます。 メールの送信者欄と件名欄が空白になってしまい困ってます。分かる人がいましたら教えてください。 下記がソースです。 &jcode'convert(*subject,'jis'); &jcode'convert(*message,'jis'); open(MAIL,"|$sendmail -t -f $master_mail"); print MAIL "To: $mail\n"; print MAIL "From: $master_mail\n"; print MAIL "Subject: $subject\n"; print MAIL "Contnt-type: text/plain; charset=ISO-2022-JP\n"; print MAIL "Content-Transfer-Encoding: 7bit\n\n"; print MAIL "$message\n"; close(MAIL);

    • ベストアンサー
    • Perl
  • ホームページから意見を送るsendmailのcgiスクリプト

    表題のようなスクリプトを使っているのですが、 普通は特に問題ないのですが、「http://」などから始まる URLのみを書き込んで送ると、空メール(何も記載されない)となって 届いてしまいます。どこがおかしいのかわかりません。 以下のようなスクリプトです。 @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); if ($name eq 'to') { $to = $value; } if ($name eq 'from') { $from = $value; } if ($name eq 'subject') { $subject = $value; } if ($name eq 'body') { $body = $value; } } # cheack if ($from eq "") { $from = "unknown\@."; } if ($from eq " ") { $from = "unknown\@."; } # send mail &jcode'convert(*from,'jis'); &jcode'convert(*subject,'jis'); &jcode'convert(*body,'jis'); if (!(open(MAIL,"| $sendmail -t"))) { &error('システムエラー','メールの送信に失敗しました。'); } print MAIL "To: $to\n"; print MAIL "From: $from\n"; print MAIL "Subject: $subject\n"; print MAIL "Content-Type: text/plain; charset=iso-2022-jp\n"; print MAIL "$body\n"; close(MAIL); # view html &jcode'convert(*from,'sjis'); &jcode'convert(*subject,'sjis'); &jcode'convert(*body,'sjis'); $body =~ s/\r\n/\r/g; $body =~ s/\n/\r/g; $body =~ s/\r/<BR>/g;

    • ベストアンサー
    • CGI

専門家に質問してみよう