php发送的电子邮件中的Message-Id有什么问题

时间:2013-01-23 16:00:01

标签: php email smtp zend-mail

我有一个由php发送到gmail帐户的电子邮件的可疑邮件ID标题:

Message-Id: <5100054f.a489440a.5d93.6a70SMTPIN_ADDED_MISSING@mx.google.com>

你能否告诉它有这种奇怪的格式以及SMTPIN_ADDED_MISSING在这里的意思?我在互联网上看到的示例包含这样的格式,其中包含发送域名但我的消息ID由于某种原因不包含它:

38D1C1FD-3C35-4568-925C-FC46CAC0DE8A@sendinghost.com

我认为我没有在Zend_Mail中设置此标头。什么生成此标题?你看到这个标题有什么问题吗?

6 个答案:

答案 0 :(得分:16)

正确的出站电子邮件客户端应在发送电子邮件时生成Message-ID标头。当消息通过其电子邮件系统时,Google正在“很好”并为您生成,但大多数情况下不会,并且大多数垃圾邮件过滤器会将此丢失的标头作为消息更可能是垃圾邮件的指示。任何格式错误或丢失的标题都会添加到“垃圾邮件分数”中。

生成并不困难,所需要的只是每条消息都是唯一的:

$message-id = time() .'-' . md5($sender . $recipient) . '@' $_SERVER['SERVER_NAME'];

或者

$message-id = time() .'-' . md5($sender . $recipient) . '@yourdomain.com';

给出:

1358961017-677533f745f613447d06de25e7fa4d32@yourdomain.com

答案 1 :(得分:6)

如果丢失,Google SMTP会生成它。此标头必须由第一个SMTP服务器设置。所以你不生成它 - 谷歌。它用于防止多次传递并将相关消息链接在一起。

不需要设置消息ID标头,但对于大多数(但不是全部,仅配置)smtp来说,添加(可能是修复)此标头是一种很好的做法。因此,为了避免其他人生成此标题,您可以自己生成它。

答案 2 :(得分:1)

这对我有用(我还向标头添加了“日期”行,因为这对我来说也是垃圾邮件问题)。基于this peace of code

这是我的PHP数组方法(使用Pear的Mail和Mime库):

$headers = array(
   'From'       => $from,
   'Subject'    => $subject,
   'To'     => $to,
   'Cc'     => '',
   'Date'       => date('r'),
   'Message-ID' => sprintf("<%s.%s@%s>",
                                base_convert(microtime(), 10, 36),
                                base_convert(bin2hex(openssl_random_pseudo_bytes(8)), 16, 36),
                                'youdomain.com')
                );

请注意,如Oleg在另一个答案中指出的那样,在$_SERVER['SERVER_NAME']中使用'youdomain.com'而不是在字面上使用import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v7.widget.AlertDialogLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.firebase.ui.database.FirebaseRecyclerAdapter; import com.firebase.ui.database.FirebaseRecyclerOptions; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.Query; import com.google.firebase.database.ValueEventListener; import com.squareup.picasso.Picasso; import de.hdodenhof.circleimageview.CircleImageView; /** * A simple {@link Fragment} subclass. */ public class FriendsFragment extends Fragment { private RecyclerView mFriendsList; private DatabaseReference mFriendsDatabase; private DatabaseReference mUsersDatabase; private FirebaseAuth mAuth; private String mCurrent_user_id; private View mMainView; public FriendsFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment mMainView = inflater.inflate(R.layout.fragment_friends, container, false); mAuth = FirebaseAuth.getInstance(); mCurrent_user_id = mAuth.getCurrentUser().getUid(); mFriendsDatabase = FirebaseDatabase.getInstance().getReference().child("Friends").child(mCurrent_user_id); mUsersDatabase= FirebaseDatabase.getInstance().getReference().child("Users"); mFriendsList= (RecyclerView)mMainView.findViewById(R.id.friends_list); mFriendsList.setHasFixedSize(true); mFriendsList.setLayoutManager(new LinearLayoutManager(getContext())); mFriendsDatabase.keepSynced(true); return mMainView; } public void onStart() { super.onStart(); startListening(); } public void startListening() { Query queryFriends = FirebaseDatabase.getInstance() .getReference() .child("Friends") .child(mCurrent_user_id) .limitToLast(50); FirebaseRecyclerOptions<Friends> options = new FirebaseRecyclerOptions.Builder<Friends>() .setQuery(queryFriends, Friends.class) .build(); FirebaseRecyclerAdapter<Friends, FriendsViewHolder> friendsRecyclerViewAdapter = new FirebaseRecyclerAdapter<Friends, FriendsViewHolder>(options) { @NonNull @Override public FriendsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.friends_single_layout, parent, false); return new FriendsViewHolder(view); } @Override protected void onBindViewHolder(@NonNull final FriendsViewHolder holder, int position, @NonNull Friends model) { holder.setDate(model.getDate()); final String list_user_id= getRef(position).getKey(); mUsersDatabase.child(list_user_id).addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { if (dataSnapshot.hasChild("online") && dataSnapshot.hasChild("name") && dataSnapshot.hasChild("thumb_image") && dataSnapshot.hasChild("status")) { final String username = dataSnapshot.child("name").getValue().toString(); String userThumb = dataSnapshot.child("thumb_image").getValue().toString(); String userStatus = dataSnapshot.child("status").getValue().toString(); holder.setName(username); holder.setUserImage(userThumb); holder.setUserStatus(userStatus); boolean userOnline = (boolean) dataSnapshot.child("online").getValue(); holder.setUserOnline(userOnline); mUsersDatabase.keepSynced(true); mFriendsDatabase.keepSynced(true); holder.mView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { CharSequence options[] = new CharSequence[]{"Open profile", "Send Message"}; AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setTitle("Select Options"); builder.setItems(options, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (which == 0) { Intent profileIntent = new Intent(getContext(), ProfileActivity.class); profileIntent.putExtra("user_id", list_user_id); startActivity(profileIntent); } if (which == 1) { Intent chatIntent = new Intent(getContext(), ChatActivity.class); chatIntent.putExtra("user_id", list_user_id); chatIntent.putExtra("user_name", username); mUsersDatabase.keepSynced(true); mFriendsDatabase.keepSynced(true); startActivity(chatIntent); } } }); builder.show(); } }); } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } }); } }; mFriendsList.setAdapter(friendsRecyclerViewAdapter); friendsRecyclerViewAdapter.startListening(); } public static class FriendsViewHolder extends RecyclerView.ViewHolder { View mView; public FriendsViewHolder(View itemView) { super(itemView); mView = itemView; } public void setDate(String date){ TextView userStatusView = (TextView) mView.findViewById(R.id.user_single_status); userStatusView.setText(date); } public void setName(String name){ TextView userNameView= (TextView)mView.findViewById(R.id.user_single_name); userNameView.setText(name); } public void setUserImage(String thumb_image){ CircleImageView userImageView = (CircleImageView) mView.findViewById(R.id.user_single_image); Picasso.get().load(thumb_image).placeholder(R.drawable.accountpicture).into(userImageView); } public void setUserStatus(String status){ TextView userStatView= (TextView)mView.findViewById(R.id.user_single_status); userStatView.setText(status); } public void setUserOnline(boolean online_status){ ImageView userOnlineView= (ImageView) mView.findViewById(R.id.user_single_online_icon); ImageView userOffilneView= (ImageView) mView.findViewById(R.id.user_single_offline_icon); if(online_status){ userOnlineView.setVisibility(View.VISIBLE); userOffilneView.setVisibility(View.INVISIBLE); } else{ userOnlineView.setVisibility(View.INVISIBLE); userOffilneView.setVisibility(View.VISIBLE); } } } } 不能在php cli中工作。

答案 3 :(得分:0)

我使用相同的MessageId来跟踪交换的消息。

我用以下内容修复了MessageId:

$mail->MessageID =sprintf('<%s@%s>', $myMessageID, 'myserver');

答案 4 :(得分:0)

tl; dr; 发送电子邮件时不要使用端口25,而要使用端口587

当我使用端口25从自定义创建的golang电子邮件客户端向我的本地Postfix服务器发送带有目标电子邮件地址gmail或google gsuite adddress的出站电子邮件

Message ID  <5be55db9.1c69fb81.d0444.d894SMTPIN_ADDED_MISSING@mx.google.com>

从gmail Show Original中的目标电子邮件地址中查看时... ...但是,由于我在golang电子邮件客户端和本地Postfix服务器中都使用了完整的TLS证书,因此当我使用端口25替换为安全端口587时,我的出站电子邮件客户端(后缀已在使用TLS证书),然后我得到了正确的

Message ID  <20181109163255.F164D8E9588@mail.myexample.com>

注意-我在任何时候都不会定义电子邮件标头message-id,实际上我正在使用的golang存储库没有api调用来定义标头

答案 5 :(得分:0)

您错过了“ <”和“>”括号。